【问题标题】:combine coverage reports using istanbul-combine使用 istanbul-combine 合并覆盖率报告
【发布时间】:2021-01-26 21:31:18
【问题描述】:
假设我有这些覆盖率报告:
- /coverage/libs/test/lib1/final-coverage.json
- /coverage/libs/test/lib2/final-coverage.json
- /coverage/libs/test/lib3/final-coverage.json
现在我想合并这些报告并生成一个 html 报告。
我正在使用这个 istanbul-combine 来做这种工作。但它似乎找不到所有这些覆盖 json 文件,我想知道这是为什么。
istanbul-combine -d coverage/reports -r lcov -r html /coverage/libs/test/**/coverage-final.json
在报告生成过程结束时,它为我提供了一个空的 html 报告。
【问题讨论】:
标签:
angular
unit-testing
jestjs
code-coverage
istanbul
【解决方案1】:
istanbul-combine will be deprecated in favor of 伊斯坦布尔报告。我最近做了迁移。
这是我与istanbul-combine 一起使用的旧配置:
istanbul-combine -d coverage -p none -r lcov -r cobertura coverage/hierarchical-grid/coverage-final.json coverage/tree-grid/coverage-final.json coverage/non-grid/coverage-final.json coverage/grid/coverage-final.json
改为:
istanbul report --dir coverage --include coverage/**/coverage-final.json lcov
Related Pull Request.
【解决方案2】:
所以我找到了一种不同的方法来解决这个问题。我写了一个小脚本,它执行以下操作。
- 读取库目录并找到所有覆盖率报告
- 读取覆盖率报告并更正 jest 产生的一些错误数据
- 将所有报表数据合并到一个报表中
- 打印出最终报告
mergeCoverage.js
const fs = require( 'fs-extra');
const glob = require('glob');
const { createReporter } = require('istanbul-api');
const istanbulCoverage = require('istanbul-lib-coverage');
const reporter = createReporter();
/* [ Configuration ] */
const rootDir = './coverage/libs';
const reportOut = './coverage/report';
const normalizeJestCoverage = ( obj ) => {
const result = { ...obj };
Object
.entries( result )
.filter( ([k, v] ) => v.data )
.forEach( ([k, v] ) => {
result[k] = v.data;
});
return result;
};
const mergeAllReports = ( coverageMap, reports ) => {
if ( Array.isArray( reports ) === false ) {
return;
}
reports.forEach( reportFile => {
const coverageReport = fs.readJSONSync( reportFile );
coverageMap.merge( normalizeJestCoverage( coverageReport ) );
})
};
const findAllCoverageReports = ( path, callback ) => {
glob( path, {}, ( err, reports )=>{
callback( reports, err );
});
};
const generateReport = ( coverageMap, types ) => {
reporter.dir = reportOut;
reporter.addAll(types || ['html', 'text'] );
reporter.write( coverageMap );
};
async function main () {
const coverageMap = istanbulCoverage.createCoverageMap( {} );
findAllCoverageReports( rootDir + '/**/coverage-final.json', ( reports, err ) => {
if ( Array.isArray( reports ) ) {
mergeAllReports( coverageMap, reports );
generateReport( coverageMap, [ 'text' ] )
}
});
}
main().catch(err => {
console.error(err);
process.exit(1);
});