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 --helpcargo 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 编译或作为一个测试结果部分出现在测试输出中(即将公共部分放在一个子文件夹中)


12.3.4 集成测试(三):二进制 crate

12.4 小结




















