【问题标题】: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);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-16
      • 2018-10-09
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      • 1970-01-01
      相关资源
      最近更新 更多