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++ 中的参数(至少正确处理空格和引号)。
有2锈件工具链参与,当你运行cargo test。
cargo test它会在您的包或工作区中查找所有可测试的目标,使用 构建它们cfg(test),然后运行这些二进制文件。cargo test处理 左边--的参数,右边的参数传递给二进制文件。
然后,
测试是使用
--test选项构建的,该选项rustc创建一个带有main函数的可执行文件,该函数自动运行在多个线程中使用 #[test] 属性注释的所有函数。#[bench]带注释的函数也将运行一次迭代以验证它们是否正常工作。可以通过
harness = false在目标清单设置中进行设置来禁用 libtest 工具,在这种情况下,您的代码需要提供自己的main函数来处理正在运行的测试。
“libtest 工具”拒绝了你的额外论点。在您的情况下,由于您打算运行整个其他测试套件,我相信禁用该工具是合适的。
将您的委托代码移动到它自己的文件中,通常位于tests/您的包目录中:
Cargo.toml
src/
lib.rs
...
tests/
cpp_test.rs
Run Code Online (Sandbox Code Playgroud)
为它写一个明确的目标部分,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)
在 中cpp_test.rs,不要编写带有#[test]属性的函数,而是编写一个main读取env::args()和调用 C++ 测试的普通函数。
[免责声明:我熟悉这些机制,因为我使用了 Criterion 基准测试(同样需要禁用默认工具),但我实际上并没有按照您正在寻找的方式使用自定义参数编写测试。所以,有些细节可能是错误的。如果有任何需要更正的地方,请告诉我。]