gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:32:26 24 4
gpt4 key购买 nike

我有一个 Rust 测试,它使用 doctest 委托(delegate)给 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");
}
}
因为 cargo test help节目
USAGE:
cargo.exe test [OPTIONS] [TESTNAME] [-- <args>...]
我期望
cargo test -- --test-case="X"
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
...
我的另一个想法是在环境变量中传递参数,即
DOCTEST_ARGS="--test-case='X'" cargo test
但随后我需要在 Rust 或 C++ 中以某种方式将该字符串拆分为参数(至少正确处理空格和引号)。

最佳答案

涉及两个 Rust 工具链 when you run cargo test .cargo test它本身会在你的包或工作空间中寻找所有可测试的目标,用 cfg(test) 构建它们,并运行这些二进制文件。 cargo test处理 -- 左侧的参数, 右边的参数被传递给二进制文件。
然后,

Tests are built with the --test option to rustc which creates an executable with a main function that automatically runs all functions annotated with the #[test] attribute in multiple threads. #[bench] annotated functions will also be run with one iteration to verify that they are functional.

The libtest harness may be disabled by setting harness = false in the target manifest settings, in which case your code will need to provide its own main function to handle running tests.


“libtest 工具”拒绝您的额外参数。就您而言,由于您打算运行整个其他测试套件,因此我认为禁用该工具是合适的。
  • 将您的委托(delegate)代码移动到它自己的文件中,通常位于 tests/在你的包目录中:
    Cargo.toml
    src/
    lib.rs
    ...
    tests/
    cpp_test.rs
  • 写一个明确的target section在您的 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
  • cpp_test.rs , 而不是用 #[test] 编写函数属性,写一个正常的main读取 env::args() 的函数并调用 C++ 测试。

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

    关于c++ - 将自定义命令行参数传递给 Rust 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65791697/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com