业力测试:测量未测试代码的覆盖率

时间:2018-08-10 16:10:09

标签: javascript typescript webpack karma-runner

我已经成功地为sandbox project written in Typescript使用Karma和Webpack进行了测试。代码覆盖率指标由Istanbul Instrumenter Loader收集。令我困扰的是I get the coverage reported only for the modules that are being imported in the tests,所以报道的100%的报道实际上是一个卑鄙的谎言。

在寻找解决方案时,我在Istanbul Instrumenter Loader的readme中找到了一段话:

  

要为所有组件(甚至还没有测试的组件)创建代码覆盖率报告,您必须要求所有1)源和2)测试。

     

test / index.js

     
// requires all tests in `project/test/src/components/**/index.js`
const tests = require.context('./src/components/', true, /index\.js$/);

tests.keys().forEach(tests);

// requires all components in `project/src/components/**/index.js`
const components = require.context('../src/components/', true, /index\.js$/);

components.keys().forEach(components);

如果我理解正确,此代码段将遍历源目录中的所有索引文件并从中导入所有内容。我的问题是:如何正确将此代码段转换为Typescript?还是有不需要import * from *解决方法的更好解决方案?

编辑

我发现了这个问题:Typescript 1.8 modules: import all files from folder。这是否意味着我需要在其中导入每个模块的index.ts文件?这意味着每次我引入一个新的模块文件时,都必须手动将其导入添加到index.ts吗?必须有更好的方法。

编辑2

我也向其他工具开放,这些工具可以为整个代码库生成覆盖率报告,这是它们能够处理Typescript + Webpack + Karma + Mocha堆栈的唯一条件。我已经尝试过nyc,但根本无法获得任何代码覆盖。

2 个答案:

答案 0 :(得分:3)

重要提示:

此答案不能解决上述问题,这是根本错误的。查看评论。


NYC支持使用--all标志覆盖未经测试的代码。假设您在test中的package.json命令是

"test": "karma start karma.conf.js",

您可以在npm install -D nyc ts-node之后测试覆盖率,可以添加以下命令并运行它。此命令希望源代码检查覆盖范围在src目录中。

"coverage": "nyc --all --include src --extension .ts --require ts-node/register npm test",
  • --all标志用于检查所有文件的覆盖率。
  • --extension .ts用于检查所有TypeScript文件,您可以添加更多扩展名,例如--extension .ts --extension .tsx
  • --include src用于目录检查覆盖范围。
  • -- require ts-node/register是要教NYC了解TypeScript。

之后,您应该会看到所有.ts文件都包含在内。

注意:使用ts-node/register可能会导致报告中的行号出现问题。为了解决这个问题,您可能还需要注册source map support

答案 1 :(得分:1)

对于使用Karma + Istanbul作为覆盖率报告程序测试的项目–我刚刚创建了karma插件,该插件将项目中的所有文件添加到coverage统计信息-https://github.com/kopach/karma-sabarivka-reporter中。

要使用它->安装npm install --save-dev karma-sabarivka-reporter

并像这样更新karma.conf.js

reporters: [
  // ...
  'sabarivka'
  // ...
],
coverageReporter: {
    include: 'src/**/!(*.spec|*.module|environment*).ts', // glob patter which  matchs all the files you want to be included into the coverage result
    exclude: 'src/main.ts',
    // ...
},