【问题标题】:Karma tests: measure coverage for untested codeKarma 测试:测量未测试代码的覆盖率
【发布时间】:2019-01-18 07:06:48
【问题描述】:

我已经成功地为我的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) 测试。

测试/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);

如果我理解正确,这个 sn-p 会遍历源目录中的所有索引文件并从中导入所有内容。我的问题是:如何正确地将这个 sn-p 翻译成 Typescript?还是有不需要import * from * 解决方法的更好的解决方案?

编辑

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

编辑 2

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

编辑 3

这是上面翻译成 Typescript 的 index.js

declare const require: any;

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

编辑 4

现在有一个名为 karma-sabarivka-reporter 的 karma 插件可以更正覆盖率统计信息。详情请查看accepted answer

【问题讨论】:

  • 也许只是为你的所有文件添加测试用例,然后在那些你不想测试的文件中进行描述。无论如何,您尝试实现的目标听起来有点反模式,从某种意义上说,您应该只关心您的测试结果。
  • 我不认为实现真正的代码覆盖率算作反模式,这就是React devs 代码覆盖率与uncovered source files included 的样子。实际上,这让我想到了尝试用 Jest 替换 Karma 的想法。
  • 我个人强烈推荐 Jest。它使用起来非常直观,基本上是no configuration needed 设置。我还使用 Jest 收集了我的 React 翻译组件的测试覆盖率,效果很好。您可能还想查看 Airbnb/Enzyme,它公开了一些更易于使用的测试功能。
  • 模式是编写每个组件规范测试,并基于 karma 配置文件,webpack 应该接受 /src 和 /tests 下的所有测试。我试过你的回购,它按预期工作。

标签: javascript typescript webpack karma-runner


【解决方案1】:

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

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

并像这样更新karma.conf.js

reporters: [
  // ...
  'sabarivka'
  // 'coverage-istanbul' or 'coverage' (reporters order is important for 'coverage' reporter)
  // ...
],
coverageReporter: {
  include: [
      // Specify include pattern(s) first
      'src/**/*.(ts|js)',
      // Then specify "do not touch" patterns (note `!` sign on the beginning of each statement)
      '!src/main.(ts|js)',
      '!src/**/*.spec.(ts|js)',
      '!src/**/*.module.(ts|js)',
      '!src/**/environment*.(ts|js)'
  ]
},

【讨论】:

  • 用我的一个仍然使用业力的项目对其进行了测试,它可以正常工作。惊人的!这应该合并到伊斯坦布尔,认真的。
  • 有没有办法在 --code-coverage=false 时“禁用”sabarivka?
【解决方案2】:

重要提示:

这个答案并不能解决上述问题,它从根本上是错误的。见 cmets。


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

"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 可能会导致报告中的行号出现问题。要解决这个问题,您可能还需要注册source map support..

【讨论】:

  • 这看起来已经比我迄今为止所看到的一切更有希望了;但是,nyc 不会获取所有源文件 - 例如,src/_modules/Utils.ts 丢失。您知道如何使用nyc 包含所有源文件吗?
  • 糟糕。 NYC 不包含所有文件的原因是,它不理解 TypeScript 语法。更新答案以解决该问题。
  • 变得更好 - 现在所有文件都被拾取,但看起来覆盖率没有被收集:所有文件都覆盖了零代码行。至少Utils.ts 应该有一些被覆盖的行...当我离开--include src 时,我看到karma.conf.js 有100% 的行覆盖,这意味着收集了一些东西。
  • 我已经包含了--require source-map-support/register 并尝试了一些额外的选项,但没有等待 - 我已经将package.json 中的最新更改推送到 master 分支。
  • 为了支持 source map 消费,ts-node 需要正确创建 source map。以前我使用内联源映射获得了最好的结果。我将尝试检查并整理一个示例
猜你喜欢
  • 1970-01-01
  • 2018-03-06
  • 2023-03-04
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多