能否让cargo test自动构建依赖的cli crate后再执行测试?
问题描述
我有一个Cargo多工作区项目,结构如下:
cli/ server/ test/ Cargo.toml
父目录的Cargo.toml配置内容:
[workspace] members = [ "server", "cli", "tests", ] resolver = "1"
其中tests工作区包含一系列依赖cli crate构建产物的集成测试。我希望直接执行cargo test就能运行所有测试,但目前执行时会报错:
test tests::should_output_help ... FAILED failures: ---- tests::should_output_help stdout ---- Error: Cause: Cargo command not found: /Users/l3r8y/code/fakehub/target/debug/cli
但先执行cargo build再运行测试则一切正常。请问能否让cargo test先构建cli crate,再执行测试?
解决方案
当然可以实现,以下是几种实用方案:
方案1:给tests crate添加cli依赖
在tests/Cargo.toml中添加cli作为开发依赖:
[dev-dependencies] cli = { path = "../cli" }
Cargo会自动识别依赖关系,在运行tests的测试前先构建cli crate——哪怕你只是声明依赖但没直接在测试代码里引用,Cargo也会保证构建顺序。
方案2:使用--all-targets参数执行测试
直接执行带参数的测试命令:
cargo test --all-targets
--all-targets会让Cargo构建工作区内所有类型的目标(包括二进制、库、测试套件等),自然会提前构建好cli的二进制文件,测试时就能找到对应的可执行路径了。
方案3:手动组合构建与测试命令
如果不想修改配置,也可以直接组合两条命令:
cargo build -p cli && cargo test
先单独构建cli crate,再运行所有测试,这种方式简单直接,但需要手动执行组合命令。
内容的提问来源于stack exchange,提问作者Ivan Ivanchuk
相关产品推荐
相关产品推荐

