首页 > 解决方案 > Karma 测试:测量未测试代码的覆盖率

问题描述

我已经成功地为我用 Typescript 编写的沙盒项目设置了 Karma 和 Webpack 测试。代码覆盖率指标由 Istanbul Instrumenter Loader 收集。令我困扰的是,我只报告了测试中导入的模块的覆盖率,因此报告的 100% 覆盖率实际上是一个肮脏的谎言。

寻找解决方案,我在 Istanbul Instrumenter Loader 的自述文件中找到了一段:

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

测试/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,但根本无法获得任何代码覆盖率。

编辑 3

这是index.js上面翻译成打字稿的内容:

declare const require: any;

const ctx = require.context('../src', true, /\.ts$/);
ctx.keys().map(ctx);

编辑 4

现在有一个名为 karma 的插件karma-sabarivka-reporter可以更正覆盖率统计信息。查看接受的答案以获取详细信息。

标签: javascripttypescriptwebpackkarma-runner

解决方案


重要的:

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


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是教纽约市理解 TypeScript。

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

注意:使用ts-node/register可能会导致报告上的行号出现问题。要解决这个问题,您可能还需要注册源地图支持


推荐阅读