目前,Istanbul 只为我的测试中使用的文件生成覆盖范围,这没问题,但似乎在某种程度上违背了覆盖范围的目的。
我没有伊斯坦布尔配置,并通过npm test
以下脚本字符串调用它:
$ istanbul cover _mocha -- -R dot --check-leaks --recursive test/
有没有办法为我的所有源代码生成覆盖范围?
找到了答案,我想我部分幸运的是我选择的目录结构允许我使用这个选项,但我的测试命令现在是:
$ istanbul --include-all-sources cover _mocha -- -R dot --recursive test/
--include-all-sources
是重要的部分。
伊斯坦布尔建议使用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
不起作用,它需要include
或exclude
选项。nyc
您可以通过 获取有关选项的更多信息nyc --help
。
PS我不是很了解nyc
, mocha
而且我只是基于我自己的经验。
要为所有文件生成覆盖范围,请在 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% 的覆盖率阈值。否则,覆盖率报告生成失败。(我在覆盖率报告生成后运行我的业力测试)。
希望这有帮助:)
就我而言,--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
覆盖率报告中。