如何让伊斯坦布尔为我的所有源代码生成报道?

时间:2014-12-22 15:57:56

标签: node.js mocha sinon chai istanbul

目前伊斯坦布尔只为我的测试中使用的文件生成报道,这是可以的,但似乎无法实现覆盖的目的。

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

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

有没有办法为我的所有源代码生成报道?

4 个答案:

答案 0 :(得分:17)

找到答案,我认为我很幸运,我选择的目录结构允许我使用此选项,但我的测试命令现在是:

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

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

答案 1 :(得分:4)

伊斯坦布尔建议使用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",
}

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

P.S。我不知道nycmocha,我只是基于自己的经验。

答案 2 :(得分:0)

要生成所有文件的覆盖率,请在package.json中添加以下内容

  

“ istanbulCoverage”:“ nyc --reporter = lcov --reporter = text-lcov --all -x   \“ ./ node_modules / \” -x \“ ./ coverage / \” check-coverage-功能90 npm运行测试

此处-all 标志将提取项目中的所有文件。如果您要排除特定的文件或文件夹,则可以使用 -x 选项。

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

希望这会有所帮助:)

答案 3 :(得分:0)

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

最终,我在istanbul GitHub上遇到了this issue,维护者说:

  

是的,这是预期的行为。伊斯坦布尔通过钩住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覆盖率报告中。