控制测试如何运行
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 (-- 表示针对二进制文件)
```bash
running 2 tests
test tests::this_test_will_pass ... ok
test tests::this_test_will_fail ... FAILED
successes:
---- tests::this_test_will_pass stdout ----
I got the value 4
successes:
tests::this_test_will_pass
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
如果想在成功的测试中看到打印的内容:—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`
```bash
running 2 tests
test tests::add_two_and_two ... ok
test tests::add_three_and_two ... ok
test 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**
**