auto_test

11 编写自动测试

rust中的测试,分为单元测试和集成测试;

  • rust nightly add Benchmark test
  • document comment as test

11.1 如何编写测试

一个测试函数通常包含三个部分

  1. 准备数据
  2. 执行要测试的函数
  3. 断言返回内容是否和期待的一致

解剖测试函数

简单来说,一个测试函数,就是一个带有test属性的函数。
当我们执行cargo test的时候,rust会为我们编译一个test runner binary,然后执行每一个带有test属性的函数,并报告是否执行通过。

当我们执行cargo new [package] –lib命令的时候,cargo就会在lib.rs文件中,为我们生成测试

1
2
3
4
5
6
7
#[cfg(test)]
mod tests {
#[test]
fn it_works () {
assert!(2+2, 4);
}
}

常用的断言

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编译。

  1. 我们依然可以通过指定函数的名称执行具体的集成测试函数;
  2. 可以通过–test指定集成测试具体的文件名称,来执行一个文件中的集成测试;

src/main.rs中的模块和函数,我们无法通过use导入测试,所以,通常的做法就是在lib中写业务逻辑,main中直接调用。

© 2023 PLAYAROUND All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero