后续 Q/A:如何在 Rust 中运行特定的单元测试?
在将库与二进制文件混合的项目中使用所描述的解决方案
cargo test path::to::some_test -- --exact
时,如何抑制输出中的所有“0 通过”噪声?
为了演示该问题:我通过
cargo new test-project --lib
创建了一个最小的测试项目。然后我创建了以下文件:
.
├── Cargo.toml
└── src
├── bin
│ ├── bar.rs
│ ├── baz.rs
│ └── foo.rs
└── lib.rs
lib.rs
包含:
#[cfg(test)]
mod tests {
#[test]
fn test_foo() {
assert!(true);
}
#[test]
fn test_bar() {
assert!(true);
}
}
所有三个二进制文件都只是
fn main() {}
假人。
运行
cargo test tests::test_foo -- --exact
时,我可以看到将单元测试过滤到特定的 test_foo
是有效的,但输出中充斥着二进制文件中的“运行 0 个测试”:
Finished test [unoptimized + debuginfo] target(s) in 0.00s
Running unittests src/lib.rs (target/debug/deps/test_project-72d9bd396ce43ab9)
running 1 test
test tests::test_foo ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s
Running unittests src/bin/bar.rs (target/debug/deps/bar-1d7d5b4c3ec748b3)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/bin/baz.rs (target/debug/deps/baz-ebd229498f923881)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/bin/foo.rs (target/debug/deps/foo-f88dc03912c7d051)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
我的现实生活项目是一个 cargo 工作区 项目,具有许多工作区成员,每个成员都包含各种实用程序二进制文件。由于上面演示的行为,运行特定测试不是很有用:根据过滤器,匹配结果会被“运行 0 个测试”的大约 3 个屏幕页面夹在中间,当我拼错测试过滤器时,我获得 ~3 页的实际 0 个测试匹配(当然很高兴通过!)——这很难区分。
有没有办法完全抑制不匹配模块的输出?
为了减少噪音过滤测试时,请传递 Cargo 目标选择选项,这样您只运行具有所需测试的目标,而不是工作区中的所有目标。在这种情况下,您将使用
--lib
。
cargo test --lib -- --exact path::to::some_test
(Cargo 目前无法为您执行此操作,因为 Cargo 不知道每个目标包含哪些测试。)
为了减少噪音一般,并节省一些构建时间,您可以禁用对没有任何测试的目标的测试。对于每个这样的目标,将
test = false
添加到 Cargo.toml
:
[[bin]]
name = "foo"
test = false
[[bin]]
name = "bar"
test = false
[[bin]]
name = "baz"
test = false
当然,这会带来忘记您编写此配置的风险,从而编写无法运行的测试。