控制测试如何运行

cargo test 会在测试模式下编译代码,并生成二进制文件,这个二进制文件就是测试用的。

  • 改变 cargo test 的行为:添加命令行参数
  • 默认行为:
    • 并行运行
    • 所有测试
    • 捕获(不显示)所有输出,使读取与测试结果相关的输出更容易
  • 命令行参数:
    • 针对 cargo test 的参数:紧跟 cargo test 后
    • 针对测试可执行程序:放在 — 之后
  • cargo test —help:显示 cargo test 可用所有的参数
  • cargo test — —help:显示所有可以用在两个横线之后的所有参数

    并行/连续运行测试

    并行运行测试

  • 运行多个测试:默认使用多个线程并行运行

    • 运行快
  • 确保测试之间:

    • 不会相互依赖
    • 不依赖于某个共享状态(环境、工作目录、环境变量等)

      —test-threads 参数

  • 传递给二进制文件

  • 不想以并行方式运行测试,或想对线程数进行细粒度控制
  • 可以使用 —test-threads 参数,后边跟着线程的数量
  • 例如:cargo test — —test-threads=1

    显式函数输出

  • 默认,如测试通过,Rust 的 test 库会捕获所有打印到标准输出的内容

  • 例如,如果被测试代码中用到了 println!:
    • 如果测试通过:不会在终端看到 println! 打印的内容
    • 如果测试失败:会看到 println! 打印的内容 和 失败信息 ```rust pub fn prints_and_returns_10(a: i32) -> i32 { println!(“I got the value {}”, a); 10 }

[cfg(test)]

mod tests { use super::*;

  1. #[test]
  2. fn this_test_will_pass() {
  3. let value = prints_and_returns_10(4);
  4. assert_eq!(10, value);
  5. }
  6. #[test]
  7. fn this_test_will_fail() {
  8. let value = prints_and_returns_10(8);
  9. assert_eq!(5, value);
  10. }

}

// running 2 tests // test tests::this_test_will_pass … ok // test tests::this_test_will_fail … FAILED // // failures: // // —— tests::this_test_will_fail stdout —— // I got the value 8 // thread ‘tests::this_test_will_fail’ panicked at ‘assertion failed: (left == right) // left: 5, // right: 10‘, src/lib.rs:18:9

  1. > 测试通过没有打印,测试失败会打印,
  2. > 如果想要测试通过也打印,cargo test -- --show-output (-- 表示针对二进制文件)
  3. ```bash
  4. running 2 tests
  5. test tests::this_test_will_pass ... ok
  6. test tests::this_test_will_fail ... FAILED
  7. successes:
  8. ---- tests::this_test_will_pass stdout ----
  9. I got the value 4
  10. successes:
  11. tests::this_test_will_pass
  12. failures:
  13. ---- tests::this_test_will_fail stdout ----
  14. I got the value 8
  15. thread 'tests::this_test_will_fail' panicked at 'assertion failed: `(left == right)`
  16. left: `5`,
  17. right: `10`', src/lib.rs:18:9
  • 如果想在成功的测试中看到打印的内容:—show-output

    按名称运行测试

    按名称运行测试的子集

  • 选择运行的测试:将测试的名称(一个或多个)作为 cargo test 的参数

  • 运行单个测试:指定测试名 ```rust pub fn add_two(a: i32) -> i32 { a + 2 }

[cfg(test)]

mod tests { use super::*;

  1. #[test]
  2. fn add_two_and_two() {
  3. assert_eq!(4, add_two(2));
  4. }
  5. #[test]
  6. fn add_three_and_two() {
  7. assert_eq!(5, add_two(3));
  8. }
  9. #[test]
  10. fn one_hundred() {
  11. assert_eq!(102, add_two(100));
  12. }

}

// 运行指定测试 cargo test one_hundred

// running 1 test // test tests::one_hundred … ok

  1. - 运行多个测试:指定测试名的一部分(模块名也可以)
  2. `cargo test add`
  3. ```bash
  4. running 2 tests
  5. test tests::add_two_and_two ... ok
  6. test tests::add_three_and_two ... ok
  7. test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s

忽略测试

通过显示指定,忽略某些测试

忽略某些测试,运行剩余测试

  • ignore 属性(attribute)

    1. #[cfg(test)]
    2. mod tests {
    3. #[test]
    4. fn it_works() {
    5. assert_eq!(4, 2 + 2);
    6. }
    7. #[test]
    8. #[ignore]
    9. fn expensive_test() {
    10. assert_eq!(5, 1 + 1 + 1 + 1 + 1 + 1);
    11. }
    12. }

    运行 cargo test 不加任何参数 ignore 的 attribute 是不会运行的 运行忽略的参数使用 cargo test — —ignored

  • 运行被忽略(ignore)的测试:

    • cargo test — —ignore**d**

**