使用istanbul-combine合并覆盖率报告

假设我有以下覆盖率报告:

  • /coverage/libs/test/lib1/final-coverage.json
  • /coverage/libs/test/lib2/final-coverage.json
  • /coverage/libs/test/lib3/final-coverage.json

现在,我想合并这些报告并生成一个html报告。

我正在使用此 istanbul-combine 来进行此类工作。但是似乎无法找到所有这些coverage json文件,我想知道为什么会这样。

istanbul-combine -d coverage/reports -r lcov -r html /coverage/libs/test/**/coverage-final.json

在报告生成过程结束时,它为我提供了一个空的html报告。

xiaoxucheng09 回答:使用istanbul-combine合并覆盖率报告

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.

,

因此,我找到了解决此问题的另一种方法。我写了一个小脚本,该脚本执行以下操作。

  • 读取图书馆目录并查找所有覆盖率报告
  • 读取覆盖率报告并更正玩笑产生的一些不正确数据
  • 将所有报告数据合并为一个报告
  • 打印出最终报告

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);
});
本文链接:https://www.f2er.com/3146358.html

大家都在问