提交 ec2b9b36 编写于 作者: J jackymao

complete unit_test.md

上级 eaf7ec88
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
"keywords": [], "keywords": [],
"children": [], "children": [],
"export": [ "export": [
"unit_test.json" "unit_tests.json"
], ],
"keywords_must": [], "keywords_must": [],
"keywords_forbid": [] "keywords_forbid": []
......
# 单元测试
除了使用 println!() 或 dbg!() 打印出值这种方法之外,rust 还支持更完善的测试代码写法,而且可以先写测试代码,再实现对应的功能,以实现 TDD (Test-Driven Development)。
单元测试是为了测试我们所写的每一个单元的代码(函数),确保这个单元能完成我们需要的功能,避免所有可能的用法中出现错误。
当你使用 cargo new demo_unit_test --lib 新建一个库的时候,在生成的 src/lib.rs 文件里面会自动出现一个测试样例,提醒你为你的库写好测试。
```rust
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
let result = 2 + 2;
assert_eq!(result, 4);
}
}
```
这里已经包含了一个测试的基本元素。你可以使用 cargo test 来运行这个测试,也是用这个命令来运行所有的后续测试。
{ {
"type": "code_options", "type": "code_options",
"author": "jackymao_com", "author": "jackymao_com",
"source": "unit_test.md", "source": "unit_tests.md",
"notebook_enable": false, "notebook_enable": false,
"exercise_id": "" "exercise_id": ""
} }
\ No newline at end of file
# 单元测试
除了使用 println!() 或 dbg!() 打印出值这种方法之外,rust 还支持更完善的测试代码写法,而且可以先写测试代码,再实现对应的功能,以实现 TDD (Test-Driven Development)。
单元测试是为了测试我们所写的每一个单元的代码(函数),确保这个单元能完成我们需要的功能,避免所有可能的用法中出现错误。
当你使用 cargo new demo_unit_test --lib 新建一个库的时候,在生成的 src/lib.rs 文件里面会自动出现一个测试样例,提醒你为你的库写好测试。
```rust
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
let result = 2 + 2;
assert_eq!(result, 4);
}
}
```
这里已经包含了一个测试的基本元素。你可以使用 cargo test 来运行这个测试,也是用这个命令来运行所有的后续单元测试。
以下单元测试代码能正常运行的是:
## 答案
A
###
A
```rust
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
pub fn add_two(a: i32) -> i32 {
internal_adder(a, 2)
}
fn internal_adder(a: i32, b: i32) -> i32 {
a + b
}
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
let result = 2 + 2;
assert_eq!(result, 4);
}
use super::*;
#[test]
fn test_add() {
assert_eq!(add(1, 2), 3);
}
#[test]
fn internal() {
assert_eq!(4, internal_adder(2, 2));
}
#[test]
#[ignore]
fn ignored_test() {
assert_eq!(add(0, 0), 0);
}
}
```
### 即使 ignore 的测试也要能正常编译,否则报错
B
```rust
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
pub fn add_two(a: i32) -> i32 {
internal_adder(a, 2)
}
fn internal_adder(a: i32, b: i32) -> i32 {
a + b
}
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
let result = 2 + 2;
assert_eq!(result, 4);
}
use super::*;
#[test]
fn test_add() {
assert_eq!(add(1, 2), 3);
}
#[test]
fn internal() {
assert_eq!(4, internal_adder(2, 2));
}
#[test]
#[ignore]
fn ignored_test() {
assert_eq!(add(0.0, 0.0), 0.0);
}
}
```
### 测试代码中需要使用 use super::*; 引入需要进行测试函数
C
```rust
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
pub fn add_two(a: i32) -> i32 {
internal_adder(a, 2)
}
fn internal_adder(a: i32, b: i32) -> i32 {
a + b
}
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
let result = 2 + 2;
assert_eq!(result, 4);
}
#[test]
fn test_add() {
assert_eq!(add(1, 2), 3);
}
#[test]
fn internal() {
assert_eq!(4, internal_adder(2, 2));
}
#[test]
#[ignore]
fn ignored_test() {
assert_eq!(add(0, 0), 0);
}
}
```
###
D
```rust
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
let result = 2 + 2;
assert_ne(result, 4);
}
}
```
\ No newline at end of file
{
"type": "code_options",
"author": "jackymao_com",
"source": "integration_tests.md",
"notebook_enable": false,
"exercise_id": ""
}
\ No newline at end of file
# 集成测试
在 Rust,集成测试是位于你的库外面的,一般会专门建立一个 tests 目录, 用于测试和确保当别人从外部调用你的库时工作正常。测试代码对库的使用与别人调用你的库时的用法一样,所以集成测试时只能调用库的对外暴露的函数。
集成测试只对库 crate 进行测试,不能对二进制 crate 测试。也就是说,一般是对 src/lib.rs 内的对外函数进行测试,而不会对 src/main.rs 里面的函数进行集成测试。
一般的做法是,将所有的功能性函数都写在库 (lib.rs 及关联模块) 里面,而在 main.rs 只进行简略的引入及使用。这样可以使用集成测试覆盖所有的可对外的函数。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册