Monorepo 中汇总整体测试覆盖率需统一使用 lcov 格式收集各子包数据,集中合并后过滤无关路径并生成 HTML 报告。具体步骤:各包配置输出 lcov.info;复制到根 coverage/lcov 目录并重命名;用 lcov 合并、过滤(排除 node_modules 等);最后 genhtml 生成报告。

在 Monorepo 多包项目中汇总整体测试覆盖率,核心是让各子包的覆盖率数据能被统一收集、合并并生成一份全局报告。关键不在于单独跑每个包的测试,而在于打通收集路径、统一格式、避免重复或遗漏。
确保各包使用兼容的覆盖率工具和配置
所有子包应统一使用 istanbul/nyc(或其现代替代品 v8-to-istanbul + c8),并输出标准的 lcov 格式。例如,在每个包的 package.json 中:
"scripts": {
"test:coverage": "vitest run --coverage --coverage.reporter=lcov"
}若用 Jest,则在 jest.config.ts 中显式指定:
coverageReporters: ['lcov'],
注意:不要用 text 或 json-summary 等非可合并格式;lcov 是最稳妥的中间格式,支持跨工具合并。
立即学习“Java免费学习笔记(深入)”;
集中收集各包的 lcov 文件到统一目录
在根目录下新建 coverage/lcov 目录,运行所有子包测试后,把各自生成的 coverage/lcov.info(通常在 packages/foo/coverage/lcov.info)复制或软链过去,并重命名以区分来源:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
packages/a/coverage/lcov.info → coverage/lcov/a.lcovpackages/b/coverage/lcov.info → coverage/lcov/b.lcovpackages/c/coverage/lcov.info → coverage/lcov/c.lcov
可用简单脚本自动完成(如用 shelljs 或纯 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 工具(npm install -g lcov 或用 npx):
# 合并所有 .lcov 文件为一个总文件 lcov --directory coverage/lcov --output-file coverage/lcov.total.info --summary <h1>过滤掉无关路径(如 node_modules、tests 文件),只保留源码</h1><p>lcov --remove coverage/lcov.total.info '<em>/node_modules/</em>' '<em>/<strong>tests</strong>/</em>' '<em>/test/</em>' --output-file coverage/lcov.filtered.info</p><h1>生成 HTML 报告</h1><p>genhtml coverage/lcov.filtered.info --output-directory coverage/html
这一步会统计真实源码路径下的行/函数/分支覆盖,且自动去重同名文件(如多个包有 src/index.ts,只要路径不同就不会冲突)。
进阶建议:配合 CI 和自动化脚本
把上述流程封装为根目录的 npm script:
"scripts": {
"test:coverage:collect": "pnpm run --recursive test:coverage && node scripts/merge-coverage.js",
"test:coverage:report": "lcov --directory coverage/lcov --output-file coverage/lcov.total.info && lcov --remove coverage/lcov.total.info '*/node_modules/*' '*/__tests__/*' --output-file coverage/lcov.final.info && genhtml coverage/lcov.final.info --output-directory coverage/report"
}使用 pnpm 或 nx 时,还可利用 --stream 或缓存机制加速;若用 Vitest,注意开启 coverage.all: true 并配置 include 覆盖所有包源码路径,避免漏报。

















