rust 如何在运行特定测试时抑制cargo测试的空输出?

bnl4lu3b  于 2023-10-20  发布在  Go
关注(0)|答案(1)|浏览(129)

关于Q/A:How to run a specific unit test in Rust?
当在一个混合了库和二进制文件的项目中使用所描述的解决方案cargo test path::to::some_test -- --exact时,如何抑制输出中所有的“0 passed”噪声?
要演示该问题:我已经通过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,但是输出中充斥着来自二进制文件的“running 0 tests”:

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 workspace项目,有许多工作区成员,每个成员都包含各种实用程序二进制文件。由于上面演示的行为,运行特定的测试不是很有用:根据过滤器的匹配结果得到夹在~3屏幕页的“运行0测试”,我当我拼写错误的测试过滤器,我得到~3页的实际0测试匹配(当然,这很高兴通过!)--这很难区分。
有没有一种方法可以完全抑制不匹配模块的输出?

ccgok5k5

ccgok5k51#

1.为了在过滤测试时减少噪音,传递一个Cargo目标选择选项(如果您在工作区中,则传递包选择),因此您只运行具有所需测试的目标,而不是所有目标。在这种情况下,您将使用--lib

cargo test --lib -- --exact path::to::some_test

(It目前Cargo不可能为您做这件事,因为Cargo不知道每个目标包含什么测试。)
1.为了减少噪音 * 一般 *,并保存一些构建时间,您可以对没有任何测试的目标禁用测试。对于每个这样的目标,将test = false添加到Cargo.toml

[[bin]]
name = "foo"
test = false

[[bin]]
name = "bar"
test = false

[[bin]]
name = "baz"
test = false

当然,这样做有可能会忘记您已经写过这个配置,从而编写了无法运行的测试。

相关问题