объединить отчеты о покрытии, используя Стамбул-комбинат - PullRequest
0 голосов
/ 07 ноября 2019

Допустим, у меня есть следующие отчеты о покрытии:

  • / cover / libs / test / lib1 / final-охват.json
  • /покрытие / libs / test / lib2 / final-охват.json
  • / покрытие / libs / test / lib3 / final-охват.json

теперь я хотел бы объединить эти отчеты и создать отчет в формате html.

Я использую этот istanbul-combin для выполнения этой работы. Но кажется, что он не может найти все эти файлы json покрытия, и мне интересно, почему это так.

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

В конце процесса создания отчета, он предоставляет мнепустой HTML-отчет.

1 Ответ

0 голосов
/ 08 ноября 2019

Итак, я нашел другой способ решения этой проблемы. Я написал небольшой скрипт, который выполняет следующие действия:

  • читает каталог библиотеки и находит все отчеты о покрытии
  • читает отчеты о покрытии и исправляет некоторые неверные данные, выданные 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);
});
...