如何用grcov生成仅含Root1、Root2的Rust代码覆盖率报告并排除Dep1
Rust 多Crate项目使用grcov生成指定覆盖率报告的解决方案
项目背景与需求
- 项目包含多个crate:Dep1、Dep2、Dep3、Root1、Root2
- 依赖关系:
- Dep2 依赖 Dep1
- Root1 依赖 Dep2、Dep3
- Root2 依赖 Dep1、Dep3
- 核心需求:
- 生成仅包含Root1和Root2的统一代码覆盖率报告(支持一键生成或合并各自报告)
- 排除Dep1的覆盖率统计
- 仅使用grcov工具
当前执行的Root1单独报告命令:
grcov . --binary-path ./Root1/target/ -s . -t html,lcov,cobertura --branch -o Root1/coverage
存在问题:
- 报告未包含Root2的覆盖率
- 报告包含了不需要的Dep1覆盖率
可行方案
方法一:一键生成合并报告
同时指定两个Root crate的二进制产物路径,通过--ignore参数直接排除Dep1的代码统计:
grcov . \ --binary-path ./Root1/target/debug/deps/ \ --binary-path ./Root2/target/debug/deps/ \ -s . \ -t html,lcov,cobertura \ --branch \ --ignore "*/Dep1/*" \ -o combined_coverage
--binary-path:需指向debug/deps目录(cargo test生成的测试二进制文件默认存放在这里),确保覆盖所有测试用例的执行数据--ignore "*/Dep1/*":直接排除Dep1目录下的所有文件,避免其覆盖率被统计- 若需更精细控制,可替换为
--filter exclude:./Dep1/src/,仅排除Dep1的源码文件
方法二:分别生成报告后合并
先为两个Root crate单独生成排除Dep1的中间报告,再合并为统一报告:
- 生成Root1的排除Dep1的lcov格式报告:
grcov . \ --binary-path ./Root1/target/debug/deps/ \ -s . \ -t lcov \ --branch \ --ignore "*/Dep1/*" \ -o Root1/coverage/lcov.info
- 生成Root2的排除Dep1的lcov格式报告:
grcov . \ --binary-path ./Root2/target/debug/deps/ \ -s . \ -t lcov \ --branch \ --ignore "*/Dep1/*" \ -o Root2/coverage/lcov.info
- 合并两个lcov文件并生成多格式统一报告:
grcov --merge \ -t html,lcov,cobertura \ -o combined_coverage \ Root1/coverage/lcov.info Root2/coverage/lcov.info
关键注意事项
- 编译前必须开启覆盖率收集:设置环境变量
RUSTFLAGS="-C instrument-coverage",再执行cargo test生成覆盖数据 - 若Dep1是外部依赖而非内部crate,需调整
--ignore路径为--ignore "*/.cargo/registry/*/dep1-*"(根据实际依赖包名调整)
内容的提问来源于stack exchange,提问作者Capy Bara
相关产品推荐
相关产品推荐

