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

blu*_*e10 9 unit-testing rust rust-cargo

跟进 Q/A:如何在 Rust 中运行特定的单元测试?

\n

在将库与二进制文件混合的项目中使用所描述的解决方案时cargo test path::to::some_test -- --exact,如何抑制输出中的所有“0 通过”噪声?

\n

为了演示这个问题:我通过创建了一个最小的测试项目cargo new test-project --lib。然后我创建了以下文件:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.toml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bin\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bar.rs\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 baz.rs\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 foo.rs\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib.rs\n
Run Code Online (Sandbox Code Playgroud)\n

其中lib.rs包含:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.toml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bin\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bar.rs\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 baz.rs\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 foo.rs\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib.rs\n
Run Code Online (Sandbox Code Playgroud)\n

所有三个二进制文件都只是fn main() {}虚拟的。

\n

运行时,cargo test tests::test_foo -- --exact我可以看到将单元测试过滤到特定的test_foo工作,但输出中充斥着二进制文件中的“运行 0 测试”:

\n
    Finished test [unoptimized + debuginfo] target(s) in 0.00s\n     Running unittests src/lib.rs (target/debug/deps/test_project-72d9bd396ce43ab9)\n\nrunning 1 test\ntest tests::test_foo ... ok\n\ntest result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s\n\n     Running unittests src/bin/bar.rs (target/debug/deps/bar-1d7d5b4c3ec748b3)\n\nrunning 0 tests\n\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n     Running unittests src/bin/baz.rs (target/debug/deps/baz-ebd229498f923881)\n\nrunning 0 tests\n\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\n     Running unittests src/bin/foo.rs (target/debug/deps/foo-f88dc03912c7d051)\n\nrunning 0 tests\n\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n
Run Code Online (Sandbox Code Playgroud)\n

我的现实生活项目是一个货物工作区项目,具有许多工作区成员,每个成员都包含各种实用程序二进制文件。由于上面演示的行为,运行特定测试不是很有用:根据过滤器,匹配结果会被“运行 0 个测试”的大约 3 个屏幕页面夹在中间,当我拼写错误测试过滤器时,并且我得到了约 3 页的实际 0 个测试匹配(当然很高兴通过了!)——这很难区分。

\n

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

\n

Kev*_*eid 7

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

    cargo test --lib -- --exact path::to::some_test
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 为了减少总体噪音并节省一些构建时间,您可以禁用对没有任何测试的目标的测试。对于每个这样的目标添加test = falseCargo.toml

    cargo test --lib -- --exact path::to::some_test
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 我将添加 `-p`/`--package` 作为另一个说明符,以缩小工作区中运行的测试范围。 (4认同)