将自定义命令行参数传递给 Rust 测试

Ale*_*nov 3 c++ command-line-arguments rust

我有一个 Rust 测试,它使用doctest委托给 C++ 测试套件,并希望将命令行参数传递给它。我的第一次尝试是

// in mod ffi
pub fn run_tests(cli_args: &mut [String]) -> bool;

#[test]
fn run_cpp_test_suite() {
    let mut cli_args: Vec<String> = env::args().collect();
    if !ffi::run_tests(
        cli_args.as_mut_slice(),
    ) {
        panic!("C++ test suite reported errors");
    }
}
Run Code Online (Sandbox Code Playgroud)

因为cargo test help显示

USAGE:
    cargo.exe test [OPTIONS] [TESTNAME] [-- <args>...]
Run Code Online (Sandbox Code Playgroud)

我期望

cargo test -- --test-case="X"
Run Code Online (Sandbox Code Playgroud)

run_cpp_test_suite访问并传递--test-case="X"参数。但它没有;我得到error: Unrecognized option: 'test-case'cargo test -- --help显示它有一组固定的选项

Usage: --help [OPTIONS] [FILTER]

Options:
        --include-ignored 
                        Run ignored and not ignored tests
        --ignored       Run only ignored tests
...
Run Code Online (Sandbox Code Playgroud)

我的另一个想法是在环境变量中传递参数,即

DOCTEST_ARGS="--test-case='X'" cargo test
Run Code Online (Sandbox Code Playgroud)

但随后我需要以某种方式将该字符串拆分为 Rust 或 C++ 中的参数(至少正确处理空格和引号)。

Kev*_*eid 6

2锈件工具链参与,当你运行cargo test

cargo test它会在您的包或工作区中查找所有可测试的目标,使用 构建它们cfg(test),然后运行这些二进制文件。cargo test处理 左边--的参数,右边的参数传递给二进制文件。

然后,

测试是使用--test选项构建的,该选项rustc创建一个带有main函数的可执行文件,该函数自动运行在多个线程中使用 #[test] 属性注释的所有函数。#[bench]带注释的函数也将运行一次迭代以验证它们是否正常工作。

可以通过harness = false在目标清单设置中进行设置来禁用 libtest 工具,在这种情况下,您的代码需要提供自己的main函数来处理正在运行的测试。

“libtest 工具”拒绝了你的额外论点。在您的情况下,由于您打算运行整个其他测试套件,我相信禁用该工具是合适的。

  1. 将您的委托代码移动到它自己的文件中,通常位于tests/您的包目录中:

    Cargo.toml
    src/
        lib.rs
        ...
    tests/
        cpp_test.rs
    
    Run Code Online (Sandbox Code Playgroud)
  2. 为它写一个明确的目标部分Cargo.toml禁用线束:

    [[test]]
    name = "cpp_test"
    # path = "tests/cpp_test.rs"   # This is automatic; you can use a different path if you really want to.
    harness = false
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在 中cpp_test.rs,不要编写带有#[test]属性的函数,而是编写一个main读取env::args()和调用 C++ 测试的普通函数。

[免责声明:我熟悉这些机制,因为我使用了 Criterion 基准测试(同样需要禁用默认工具),但我实际上并没有按照您正在寻找的方式使用自定义参数编写测试。所以,有些细节可能是错误的。如果有任何需要更正的地方,请告诉我。]