统一收集Monorepo代码覆盖率需先确保各子包输出lcov格式,再集中归档到coverage/lcov/并重命名,最后用lcov合并、过滤(排除node_modules等)并生成HTML报告。

在多包仓库(Monorepo)中统一收集和统计代码覆盖率,关键是把各子包的覆盖率数据“对齐格式、集中归档、合并计算”。不是分别看每个包的报告,而是生成一份反映整个项目真实覆盖水平的总报告。
确保所有子包输出统一的 lcov 格式
lcov 是目前最稳定、可跨工具合并的中间格式。其他格式(如 text、json-summary)无法直接合并。
- 用 Vitest:每个包的
package.json中配置:"test:coverage": "vitest run --coverage --coverage.reporter=lcov" - 用 Jest:在
jest.config.ts中显式设置:coverageReporters: ['lcov'] - 避免混用工具链——比如有的包用 c8、有的用 nyc、有的用 Jest 自带,容易因路径解析或源码映射不一致导致合并失败
把各包的 lcov.info 归集到根目录统一位置
不能让每个包各自保留 coverage/lcov.info,必须集中存放并重命名,避免覆盖。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 在项目根目录创建
coverage/lcov/ - 运行所有子包测试后,把结果复制过去并按包名区分:
packages/a/coverage/lcov.info → coverage/lcov/a.lcovpackages/b/coverage/lcov.info → coverage/lcov/b.lcov - 可用一行 shell 命令自动完成:
mkdir -p coverage/lcov && find packages -name lcov.info -exec cp {} coverage/lcov/ \; -exec basename {} \; | sed 's/.info$/.lcov/' | xargs -I{} mv "coverage/lcov/{}" "coverage/lcov/{}"
用 lcov 工具合并、过滤、生成总报告
安装 lcov(支持 macOS/Linux;Windows 可用 WSL 或 npx):
立即学习“Java免费学习笔记(深入)”;
-
npm install -g lcov或直接用npx lcov - 合并所有 .lcov 文件:
lcov --directory coverage/lcov --output-file coverage/lcov.total.info - 过滤掉无关路径(如 node_modules、测试文件、类型声明):
lcov --remove coverage/lcov.total.info 'node_modules/*' '**/*.test.*' '**/types/*' --output-file coverage/lcov.filtered.info - 生成 HTML 报告:
genhtml coverage/lcov.filtered.info --output-directory coverage/report
补充建议:避免常见坑点
实际操作中,这几个细节最容易导致总覆盖率失真或报错:
- 各包的
coverageDirectory配置要一致(例如都设为coverage),否则路径前缀不统一,lcov合并时会当成不同文件 - 如果子包用了 TypeScript,确保
sourceMap开启且outDir不干扰覆盖率路径映射 - CI 环境中注意权限问题:某些 CI(如 GitLab Runner)默认不挂载
coverage/目录,需显式声明缓存或 artifact - 想加阈值检查?可在合并后用
nyc check-coverage --lines 85 --functions 90 coverage/lcov.filtered.info配合 CI 失败机制

















