11 编写自动测试
rust中的测试,分为单元测试和集成测试;
- rust nightly add Benchmark test
- document comment as test
11.1 如何编写测试
一个测试函数通常包含三个部分
- 准备数据
- 执行要测试的函数
- 断言返回内容是否和期待的一致
解剖测试函数
简单来说,一个测试函数,就是一个带有test属性的函数。
当我们执行cargo test的时候,rust会为我们编译一个test runner binary,然后执行每一个带有test属性的函数,并报告是否执行通过。
当我们执行cargo new [package] –lib命令的时候,cargo就会在lib.rs文件中,为我们生成测试
1 |
|
常用的断言
assert!(expr) 判断结果是否为true
assert_eq!(expr1, expr2) 判断相等
assert_ne!(expr1, expr2) 判断不相等
#[should_panic(expected=””)] 检查抛出异常
这些断言都可以在后面添加,异常情况下的格式化的输出内容。
assert!(expr, “formart message: {}”, result)
- 也可以通过设置测试函数的返回值为Result,来判断测试结果是否正常,但这种情况下,不能使用should_panic属性声明
11.2 控制测试的执行范围
默认情况下,执行cargo test,并行执行所有的测试,捕获执行的输出,阻止测试函数往标准输出输出内容,以使得更容易查看测试结果。
cargo test,有些参数是要指定给cargo test的,有些则是给test binary的,所以需要使用 – 来分割两部分参数。
cargo test的执行参数
cargo test – –test-threads=1 // 控制并发执行
–show-output // 是否打印测试中的输出
执行部分测试函数
cargo test命令后,直接指定函数名,执行对应的函数。也可以是部分函数名,来匹配对应的测试函数。
#[ignore]属性声明,可以用来忽略一些测试函数。cargo test – –ignore用来执行忽略的测试函数。
11.3 测试代码的组织
单元测试,更小、更专注,一次测试一个模块。可以访问模块的私有接口。
集成测试,是完全独立与工具库的,它使用工具库的方式完全和其他库一样,只能只用公共接口。
单元测试
单元测试通常直接写在代码中,通过#[cfg(test)]注解标识。
这个注解可以区分test和build,可以缩短编译时间和减小二进制文件的大小。
集成测试
集成测试会单独写在tests目录中,由于是单独的目录,不需要#[cfg(test)]注解。
tests目录中的每一个文件,都会被当成一个独立的crate编译。
- 我们依然可以通过指定函数的名称执行具体的集成测试函数;
- 可以通过–test指定集成测试具体的文件名称,来执行一个文件中的集成测试;
src/main.rs中的模块和函数,我们无法通过use导入测试,所以,通常的做法就是在lib中写业务逻辑,main中直接调用。