nyc (istanbul) 从覆盖率报告中排除测试代码

Posted

技术标签:

【中文标题】nyc (istanbul) 从覆盖率报告中排除测试代码【英文标题】:nyc (istanbul) exclude test code from coverage reports 【发布时间】:2018-10-09 09:00:16 【问题描述】:

我正在尝试将覆盖率报告生成添加到打字稿库项目中。

布局包括以下目录:

project
├─ src
│  ├─ lib      ## project code (typescript), *.tsx
│  ├─ test     ## test specs (typescript), *.spec.tsx
│  └─ @types   ## types I made for a few dependencies that didn't have them
└─ build
   ├─ lib      ## compiled project code (ES5 + type info, with inline sourcemaps), *.js and *.d.ts
   └─ test     ## compiled test specs (ES5 + type info, with inline sourcemaps), *.spec.js and *.spec.d.ts

我在package.json 中有一个测试脚本似乎可以正常工作:

    "test": "mocha --reporter mocha-multi --reporter-options mocha-multi=mocha-multi.json --recursive build/test/**/*.spec.js",

(生成 1413 行输出;目前所有测试都通过)

我正在尝试弄清楚如何运行 nyc 以便

    test 中的所有测试都已运行 test 中没有文件包含在覆盖率报告中 lib 中的所有代码文件都包含在覆盖率报告中 lib 中的类型信息文件不包含在覆盖率报告中

我想我用这个命令得到了#1:

npx nyc mocha --cache --reporter nyan build/test

有这个输出:

 872 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_,------,
 0   _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_|   /\_/\
 0   _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-^|__( ^ .^)
     _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-  ""  ""

  872 passing (20s)

---------------------|----------|----------|----------|----------|-------------------|
File                 |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
---------------------|----------|----------|----------|----------|-------------------|
All files            |    88.97 |    91.49 |    84.09 |    89.11 |                   |
 lib                 |    88.51 |    91.49 |    83.33 |    88.62 |                   |
  Awaitable.tsx      |    88.51 |    91.49 |    83.33 |    88.62 |... 79,405,419,420 |
 test                |      100 |      100 |      100 |      100 |                   |
  Abortable.spec.tsx |      100 |      100 |      100 |      100 |                   |
  Awaitable.spec.tsx |      100 |      100 |      100 |      100 |                   |
---------------------|----------|----------|----------|----------|-------------------|

(但更丰富多彩;我使用的是--reporter nyan,因为我不想重复测试脚本的 1413 行输出)

该输出未能实现目标 2 和 3;这个问题是关于目标 2:

如何告诉 nyc 从报道报告中排除 test

(报告的错误也让我感到困扰 - 没有涵盖其他测试的测试, - 但这不是这个问题的主题。)

我尝试在命令中添加各种包含和排除项,但都没有影响输出:

-x 构建/测试 -x '**/*.spec.js' -x '**/*.spec.tsx' -x '构建/测试/**' -x 测试 -x 'build/test/**/*.spec.js' -x 'build/test/**/*.spec.tsx' -x '测试/**' -x 'test/**/*.spec.js' -x 'test/**/*.spec.tsx' -n 库 -n 构建/库 -n src/lib -x 构建/库 -x 库 -x src/lib -X 测试 -X 构建/测试 -X src/测试

(如您所见,我不确定这些的 basedir 是什么;我没想到会在报告中看到源文件名,但 nyc 显然正在与 srcbuild,但均未在报告中显示。)

我在阅读this answer 后尝试了包含选项,但没有帮助。在为 lib 添加排除项并没有看到任何效果后,我得到的印象是排除选项不起作用。我不会按照this answer 中的建议切换到 ES6,除非我的合作伙伴仍然支持 IE。

【问题讨论】:

【参考方案1】:

在达到 100% 的测试覆盖率并希望 nyc check-coverage --branches 100 --functions 100 --lines 100 --statements 100 通过后再次查看此内容,我发现 this answer:

好吧,经过一番挖掘,我设法让它工作了。我添加了

"nyc": 
  "include": "app", - only looks in the app folder
  "exclude": "**/*.spec.js" 

到我的 package.json。

这导致我在我的这个工作解决方案:

"nyc": 
  "include": [ "build/lib/**/*.js" ],
  "exclude": [ "build/test/**/*.spec.js", "build/testlib/**/*.js" ]

(在两者之间,我添加了路径 src/testlibbuild/testlib,其中包含仅在测试中使用的助手,它们不应作为测试运行,并且应从测试覆盖率报告中排除。)

【讨论】:

以上是关于nyc (istanbul) 从覆盖率报告中排除测试代码的主要内容,如果未能解决你的问题,请参考以下文章

使用 Istanbul + Webpack 覆盖 JSX 文件的代码

Grunt,Istanbul,Isparta和TypeScript

如何使用 isparta 从业力的代码覆盖范围中排除第三方导入(如 jquery)?

如何从业力代码覆盖率报告中排除文件?

如何从 phpunit 覆盖率报告中排除目录

将来自 karma-coverage 的 istanbul 测试覆盖率与来自其他来源的覆盖率合并