统计多测试套件总覆盖率需统一输出lcov格式、归集重命名lcov.info文件、用lcov合并过滤并生成报告,关键在于路径一致和工具链统一。

要统计多个测试套件的总覆盖率,关键不是分别看每个套件的报告,而是把它们的原始覆盖率数据对齐格式、归集合并、统一计算。Jest、Vitest 或 c8 等工具单独运行时只输出各自作用域下的覆盖率,直接加总或取平均毫无意义——因为文件路径、源码映射、执行上下文可能不一致。
统一输出 lcov 格式
lcov 是目前最稳定、可跨工具合并的中间格式。所有测试套件必须导出该格式,否则无法合并。
- Jest:在 jest.config.js/ts 中配置 coverageReporters: ['lcov']
- Vitest:在 vitest.config.ts 中设置 coverage: { reporter: ['lcov'] }
- c8:默认支持 lcov,确保未禁用 —— c8 --reporter=lcov npm test
归集各套件的 lcov.info 文件
每个套件生成的 lcov.info 必须集中存放,并按来源重命名,避免覆盖。
- 创建统一目录:mkdir -p coverage/lcov
- 把各套件结果复制进去并改名(例如 tests/unit/lcov.info → coverage/lcov/unit.lcov)
- 可用脚本批量处理:find tests -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):
- npx lcov --directory coverage/lcov --output-file coverage/lcov.total.info
- npx lcov --remove coverage/lcov.total.info 'node_modules/*' '**/*.test.*' '**/types/*' --output-file coverage/lcov.filtered.info
- 再用 genhtml 生成可读报告:npx genhtml coverage/lcov.filtered.info --output-directory coverage/report
验证路径一致性
合并失败或覆盖率失真的常见原因,往往出在路径前缀不统一:
- 所有套件的 coverageDirectory 配置必须一致(如都设为 coverage)
- TypeScript 项目需开启 sourceMap: true,且 outDir 不应干扰原始源码路径
- 避免混用工具链:同一仓库中不要有的套件用 Jest、有的用 c8、有的用 nyc,底层路径解析逻辑差异会导致合并异常


















