如何从Rust集成测试(Bats)中获取代码覆盖率数据?
获取Rust项目Bats集成测试的代码覆盖率
要解决kcov只统计Bats脚本而非Rust二进制覆盖率的问题,核心是让kcov直接追踪被测试的Rust程序,而非包裹整个Bats测试进程。以下是具体步骤:
编译带调试信息的Rust二进制
覆盖率工具需要调试符号关联执行代码到源代码,即使是release构建也要保留调试信息:- 临时编译:
RUSTFLAGS="-g" cargo build --release - 永久配置(修改Cargo.toml):
[profile.release] debug = true
用
file target/release/your_bin验证输出包含"debug_info"。- 临时编译:
修改Bats测试,让kcov包裹Rust二进制
不要直接用kcov跑Bats脚本,而是在Bats用例里,用kcov包裹每个Rust二进制调用。比如把原来的:./target/release/your_bin --test-arg改成:
kcov --include-path=src/ --merge target/kcov ./target/release/your_bin --test-arg--include-path=src/:只统计项目源代码的覆盖率,排除依赖和外部文件--merge:让多个测试用例的覆盖率数据合并到同一个报告target/kcov:指定覆盖率报告的输出目录
批量改造Bats测试(可选)
如果测试用例很多,可在Bats文件开头定义全局包装函数,避免逐个修改:setup() { run_kcov() { kcov --include-path=src/ --merge target/kcov "$@" } }之后测试里用
run_kcov ./target/release/your_bin --test-arg替代直接调用二进制。合并单元测试与集成测试覆盖率
Rust单元测试的覆盖率可通过cargo kcov生成(先装插件:cargo install cargo-kcov),执行时指定同一个输出目录即可自动合并:cargo kcov --output target/kcov --include-path=src/常见问题排查
- 若仍只统计Bats脚本:检查Rust二进制是否带调试信息,或者kcov是否正确包裹了二进制而非Bats进程
- 覆盖率报告包含无关代码:调整
--include-path参数,精准指向项目源码目录 - 报告缺失部分代码:确保所有测试用例都用kcov包裹了对应的二进制调用
内容的提问来源于stack exchange,提问作者jcorrenti13
相关产品推荐
相关产品推荐

