Lerna Monorepo中合并Jest JSON覆盖率报告报错求助
解决Lerna Monorepo中Jest覆盖率JSON报告合并问题
方案1:用jest-coverage-merge直接合并Jest原生JSON报告
这个工具专门适配Jest通过--json输出的覆盖率报告结构,无需转换格式:
- 安装工具:
npm install jest-coverage-merge --save-dev - 在根目录创建合并配置文件
coverage-merge.config.js,指定所有子包的报告路径和输出位置:module.exports = { reports: [ "./packages/pkg-a/coverage-report.json", "./packages/pkg-b/coverage-report.json", // 依次添加所有子包的覆盖率JSON路径 ], output: "./combined-coverage.json" }; - 执行合并,也可以把命令加到根目录
package.json的脚本里:
运行"scripts": { "merge-coverage": "jest-coverage-merge --config coverage-merge.config.js" }npm run merge-coverage即可生成根目录的合并报告。
方案2:转成Istanbul兼容格式后合并
如果要继续用Istanbul,先把Jest的JSON报告转成coverage-final.json格式:
- 安装转换工具:
npm install jest-to-istanbul --save-dev - 写个批量转换脚本
convert-coverage.js(根目录下):const fs = require('fs'); const path = require('path'); const { convert } = require('jest-to-istanbul'); const packagesDir = path.join(__dirname, 'packages'); const packages = fs.readdirSync(packagesDir).filter(dir => fs.statSync(path.join(packagesDir, dir)).isDirectory()); packages.forEach(pkg => { const jestReport = path.join(packagesDir, pkg, 'coverage-report.json'); const output = path.join(packagesDir, pkg, 'coverage-final.json'); if (fs.existsSync(jestReport)) { const reportData = JSON.parse(fs.readFileSync(jestReport, 'utf8')); const istanbulData = convert(reportData); fs.writeFileSync(output, JSON.stringify(istanbulData)); } }); - 用Istanbul合并转换后的文件:
同样可以把转换+合并加到根目录脚本:npx nyc merge ./packages/*/coverage-final.json ./combined-coverage.json"scripts": { "convert-coverage": "node convert-coverage.js", "merge-coverage": "npm run convert-coverage && npx nyc merge ./packages/*/coverage-final.json ./combined-coverage.json" }
方案3:根目录统一执行Jest生成单报告
如果子包测试能在根目录Jest环境运行,直接在根目录配置Jest收集所有子包覆盖率:
- 根目录
jest.config.js配置:module.exports = { collectCoverage: true, collectCoverageFrom: [ "packages/**/*.js", "!packages/**/*.test.js", "!packages/**/node_modules/**" ], coverageReporters: ["json"], coverageDirectory: "./", testMatch: ["packages/**/*.test.js"] }; - 执行命令直接生成合并报告:
jest --coverage --json --outputFile ./combined-coverage.json
内容的提问来源于stack exchange,提问作者JRK
相关产品推荐
相关产品推荐

