假设我有这些报道报告:
现在我想合并这些报告并生成一个html报告。
我正在使用此istanbul-combine来完成这种工作。但是似乎无法找到所有这些coverage json文件,我想知道为什么。
istanbul-combine -d coverage/reports -r lcov -r html /coverage/libs/test/**/coverage-final.json
在报告生成过程结束时,它为我提供了一个空的html报告。
因此,我找到了解决此问题的另一种方法。我写了一个脚本来执行以下操作。
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);
});