控制测试如何运行
cargo test 会在测试模式下编译代码,并生成二进制文件,这个二进制文件就是测试用的。
- 改变 cargo test 的行为:添加命令行参数
- 默认行为:
- 并行运行
- 所有测试
- 捕获(不显示)所有输出,使读取与测试结果相关的输出更容易
- 命令行参数:
- 针对 cargo test 的参数:紧跟 cargo test 后
- 针对测试可执行程序:放在 — 之后
- cargo test —help:显示 cargo test 可用所有的参数
cargo test — —help:显示所有可以用在两个横线之后的所有参数
并行/连续运行测试
并行运行测试
运行多个测试:默认使用多个线程并行运行
- 运行快
确保测试之间:
传递给二进制文件
- 不想以并行方式运行测试,或想对线程数进行细粒度控制
- 可以使用 —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::*;
#[test]fn this_test_will_pass() {let value = prints_and_returns_10(4);assert_eq!(10, value);}#[test]fn this_test_will_fail() {let value = prints_and_returns_10(8);assert_eq!(5, value);}
}
// 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
> 测试通过没有打印,测试失败会打印,> 如果想要测试通过也打印,cargo test -- --show-output (-- 表示针对二进制文件)```bashrunning 2 teststest tests::this_test_will_pass ... oktest tests::this_test_will_fail ... FAILEDsuccesses:---- tests::this_test_will_pass stdout ----I got the value 4successes:tests::this_test_will_passfailures:---- tests::this_test_will_fail stdout ----I got the value 8thread 'tests::this_test_will_fail' panicked at 'assertion failed: `(left == right)`left: `5`,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::*;
#[test]fn add_two_and_two() {assert_eq!(4, add_two(2));}#[test]fn add_three_and_two() {assert_eq!(5, add_two(3));}#[test]fn one_hundred() {assert_eq!(102, add_two(100));}
}
// 运行指定测试 cargo test one_hundred
// running 1 test // test tests::one_hundred … ok
- 运行多个测试:指定测试名的一部分(模块名也可以)`cargo test add````bashrunning 2 teststest tests::add_two_and_two ... oktest tests::add_three_and_two ... oktest result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s
忽略测试
通过显示指定,忽略某些测试
忽略某些测试,运行剩余测试
ignore 属性(attribute)
#[cfg(test)]mod tests {#[test]fn it_works() {assert_eq!(4, 2 + 2);}#[test]#[ignore]fn expensive_test() {assert_eq!(5, 1 + 1 + 1 + 1 + 1 + 1);}}
运行 cargo test 不加任何参数 ignore 的 attribute 是不会运行的 运行忽略的参数使用 cargo test — —ignored
运行被忽略(ignore)的测试:
- cargo test — —ignore**d**
**
