运行特定测试时如何抑制货物测试的空输出?

问题描述 投票:0回答:1

后续 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 个测试匹配(当然很高兴通过!)——这很难区分。

有没有办法完全抑制不匹配模块的输出?

unit-testing rust rust-cargo
1个回答
0
投票
  1. 为了减少噪音过滤测试时,请传递 Cargo 目标选择选项,这样您只运行具有所需测试的目标,而不是工作区中的所有目标。在这种情况下,您将使用

    --lib

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

    (Cargo 目前无法为您执行此操作,因为 Cargo 不知道每个目标包含哪些测试。)

  2. 为了减少噪音一般,并节省一些构建时间,您可以禁用对没有任何测试的目标的测试。对于每个这样的目标,将

    test = false
    添加到
    Cargo.toml
    :

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

    当然,这会带来忘记您编写此配置的风险,从而编写无法运行的测试。

© www.soinside.com 2019 - 2024. All rights reserved.