12.1 编写测试
12.1.1 测试函数
- 测试函数:在一个函数前加上一行
#[test]
注解将普通函数变成测试函数
12.1.2 assert! 宏
12.1.3 assert_eq! 与 assert_ne!
assert_eq!(left, right)
与assert_eq!(left, right)
在失败时会返回left
与right
两个值,比assert!(xxx)
传递的信息更完善- 使用
assert_eq!
与assert_eq!
宏的值必须实现PartialEq
(用于断言两个值是否相等)与Debug
(在断言失败时打印他们的值)这两个派生trait
- 对于自定义的结构体与枚举,通常可以添加
#[derive(PartialEq, Debug)]
注解,来使用assert_eq!
与assert_eq!
12.1.4 在断言中自定义失败信息
- 在
assert!
、assert_eq!
与assert_ne!
宏中,除了必需参数外,后面所有的参数都会传递给format!
宏,作为失败时的输出进行打印
12.1.5 使用 should_panic 检查 panic
should_panic
:在函数中的代码panic
时会通过,而在其中的代码没有panic
时失败。should_panic
属性有一个可选的expected
参数:测试工具会确保错误信息中包含其提供的文本。#[should_panic(expected = "Some text for debug...")]
12.1.6 使用 Result<T, E> 编写测试
- 使用
Result<T, E>
编写测试,在通过时返回Ok
成员,在失败时返回Err
成员 - 不能对这些使用
Result<T, E>
的测试使用#[should_panic]
注解 - 为了断言一个操作返回
Err
成员,不要使用对Result<T, E>
值使用问号表达式(?),而是使用assert!(value.is_err())
12.2 控制测试如何运行
12.2.1 命令行参数分别传递
cargo test --help
cargo test -- --help
12.2.2 并行或连续的运行测试
$ cargo test -- --test-threads=1
12.2.3 显示函数输出
$ cargo test -- --show-output
12.2.4 运行指定的一部分测试(一):运行单个测试
cargo test xxx_fn
:指定xxx_fn
方法运行;- 注意:不能指定多个测试名称,只有传递给 cargo test 的第一个值才会被使用
12.2.5 运行指定的一部分测试(二):运行多个测试
cargo test xxx
:指定所有带有xxx
方法运行- 此外,也可以通过指定模块名来运行一个模块中的所有测试
12.2.6 忽略某些测试
- 若不想执行某个测试,则在前面加上一行
#[ignore]
来忽略此测试 cargo test -- --ignored
:只运行被忽略的测试cargo test -- --include-ignored
:运行全部测试(不管是否存在忽略的测试)
12.3 测试的组织结构
12.3.1 单元测试
- 单元测试与他们要测试的代码共同存放在位于 src 目录下相同的文件中,具体规范为在每个文件中创建包含测试函数的
mod tests
模块,并且使用#[cfg(test)]
注解来标注模块
12.3.2 集成测试(一):tests 目录
12.3.3 集成测试(二):子模块
tests
目录中的子目录不会被作为单独的 crate 编译或作为一个测试结果部分出现在测试输出中(即将公共部分放在一个子文件夹中)