23

目前,Istanbul 只为我的测试中使用的文件生成覆盖范围,这没问题,但似乎在某种程度上违背了覆盖范围的目的。

我没有伊斯坦布尔配置,并通过npm test以下脚本字符串调用它:

$ istanbul cover _mocha -- -R dot --check-leaks --recursive test/

有没有办法为我的所有源代码生成覆盖范围?

4

4 回答 4

18

找到了答案,我想我部分幸运的是我选择的目录结构允许我使用这个选项,但我的测试命令现在是:

$ istanbul --include-all-sources cover _mocha -- -R dot --recursive test/

--include-all-sources是重要的部分。

于 2014-12-24T23:41:49.367 回答
7

伊斯坦布尔建议使用nyc来检查代码覆盖率。它提出了这样的方法:

nyc mocha

运行此命令后,我们将获得覆盖率报告。但是有几个陷阱。

首先,默认情况下mocha是在文件夹中寻找测试test。为了覆盖它,我们必须在文件中设置自己的路径,mocha.opts如下所示:

nyc mocha --opts ./mocha.opts

mocha.opts包含这样的代码,例如:

spec/unit/back-end/**/*.spec.js

另一个问题是,默认情况下nyc仅检查所需文件的覆盖范围,这就是您的问题所在。解决方案是设置两个选项nyc(我将测试作为 npm 脚本运行,因此我在 package.json 中设置选项)。这是代码:

"nyc": {
  "all": true,
  "include": [
    "routes/*.js",
    "routes/**/*.js",
    "models/*.js"
  ]
},
"scripts": {
  "mocha": "nyc mocha --opts ./mocha.opts",
}

实现它的另一种方法是设置 not include, butexclude选项以便从覆盖检查中排除不适当的文件。这很奇怪,但唯一的选项all不起作用,它需要includeexclude选项。nyc您可以通过 获取有关选项的更多信息nyc --help

PS我不是很了解nycmocha而且我只是基于我自己的经验。

于 2018-01-29T09:46:38.913 回答
1

要为所有文件生成覆盖范围,请在 package.json 中包含以下内容

"istanbulCoverage": " nyc --reporter=lcov --reporter=text-lcov --all -x \"./node_modules/ \" -x \"./coverage/ \" check-coverage --functions 90 npm 运行测试

这里--all标志获取项目中的所有文件。如果你想排除特定的文件或文件夹,你可以使用-x选项。

除此之外,如果您想为您的应用程序指定覆盖率,请使用check-coverage选项指定阈值。在我的例子中,我已经指定函数具有 90% 的覆盖率阈值。否则,覆盖率报告生成失败。(我在覆盖率报告生成后运行我的业力测试)。

希望这有帮助:)

于 2018-06-21T10:12:05.203 回答
0

就我而言,--include-all-sources对我不起作用。不是require-d 的文件仍被排除在最终覆盖率报告之外。

最终,我在GitHub 上遇到了这个问题,维护者说:istanbul

是的,这是预期的行为。istanbul 通过挂钩 require 来工作,所以如果一个文件从不 require-d,就好像它不存在一样。

我发现的唯一万无一失的解决方案是手动require将所有我想包含在我的覆盖率报告中的文件。我与其他测试脚本一起创建了该文件include-all.test.js,并添加了以下代码:

var glob = require( 'glob' )
var path = require( 'path' );

glob.sync( './path/to/js/code/*.js' ).forEach( function( file ) {
    // we don't care about errors here, we just want to require the file
    try {
        require( path.resolve( file ) );
    } catch(e) {}
});

这将绝对确保您的未经测试的文件包含在istanbul覆盖率报告中。

于 2018-12-19T23:46:21.797 回答