Mocha的代码覆盖率


288

我正在使用Mocha测试我的NodeJS应用程序。我无法弄清楚如何使用其代码覆盖功能。我尝试使用Google搜索,但没有找到任何合适的教程。请帮忙。

Answers:


410

您需要一个额外的库来覆盖代码,而伊斯坦布尔的强大和便捷将让您大吃一惊。通过Mocha测试后,请尝试以下操作:

npm install nyc

现在,只需将命令nyc放置在现有测试命令的前面,例如:

{
  "scripts": {
    "test": "nyc mocha"
  }
}

30
如果您运行的是本地安装的Mocha版本,请尝试istanbul cover node_modules/mocha/bin/_mocha
埃里克·麦卡锡

102
或者,在本地安装istanbul和mocha,然后将以下内容添加到package.json的scripts部分,然后进行npm run coverage:“ coverage”:“ ./node_modules/istanbul/lib/cli.js cover ./node_modules/ mocha / bin / _mocha---ui bdd -R spec -t 5000
Dan Kohn

6
我很难让此命令在Windows上运行,但是通过指定摩卡仓的完整路径,我能够使它正常工作。 istanbul.cmd cover C:\Users\{UserName}\AppData\Roaming\npm\node_modules\mocha\bin\_mocha
杰森·贾勒特

4
$(npm bin)是的规范快捷方式./node_modules/.bin/,并且在bin文件夹中istanbul/lib/cli.js具有别名istanbul。所以这是一个较短的命令:$(npm bin)/istanbul cover $(npm bin)/_mocha -- --ui bdd -R spec -t 5000
亨利·布莱斯

19
@ Windows用户:istanbul cover node_modules/mocha/bin/_mocha -- -R spec
Pier-Luc Gendreau 2014年

150

现在(2020年),使用伊斯坦布尔的首选方法是通过其“最先进的命令行界面” nyc

设定

首先,使用

npm i nyc --save-dev

然后,如果您有一个基于npm的项目,只需更改package.json文件scripts对象中的测试脚本即可执行您的Mocha测试的代码覆盖:

{
  "scripts": {
    "test": "nyc --reporter=text mocha"
  }
}

现在运行测试

npm test

在测试输出之后,您将在控制台中看到一个这样的表:

伊斯坦堡纽约摩卡代码覆盖率

客制化

HTML报告

只需使用

nyc --reporter=html

代替text。现在它将在内部生成报告./coverage/index.html

报告格式

伊斯坦堡支持多种报告格式。只需查看其报告库即可找到最有用的报告。只需--reporter=REPORTER_NAME为所需的每种格式添加一个选项。例如,

nyc --reporter=html --reporter=text

您将同时拥有控制台和html报告。

不要使用npm测试进行覆盖

只需在您的脚本中添加另一个脚本,package.json然后仅将脚本保留test给测试运行者即可(例如,mocha):

{
  "scripts": {
    "test": "mocha",
    "test-with-coverage": "nyc --reporter=text mocha"
  }
}

现在运行此自定义脚本

npm run test-with-coverage

运行具有代码覆盖率的测试。

如果代码覆盖率低,则强制测试失败

如果总代码覆盖率低于90%,则失败:

nyc --check-coverage --lines 90 

如果至少一个文件的代码覆盖率低于90%,则失败:

nyc --check-coverage --lines 90 --per-file

2
这也非常适合茉莉花:“ nyc --reporter = html茉莉花”
Sandip Subedi

12
感谢您添加“ now(2017)”-在这个快速发展的javascript世界中非常有帮助
kamahl

2
万一其他人感到困惑-npm存储库伊斯坦布尔似乎已被nyc取代。根据列出的依赖项,将伊斯坦布尔分为多个软件包,这些软件包都保留在其istanbuljs monorepo中
aaaaaa

1
--reporter=html启用了该功能,但html文件始终为空,未显示有关未发现的块或覆盖的百分比等信息,只是表头
TGW

1
那么...一个名为Istanbul的框架,其CLI命令是NYC?嗯...我不相信!
提维

19

Blanket.js也可以完美运行。

npm install --save-dev blanket

在您的test / tests.js前面

require('blanket')({
    pattern: function (filename) {
        return !/node_modules/.test(filename);
    }
});

mocha -R html-cov > coverage.html


require('blanket')({pattern:function(filename){return!/node_modules/.test(filename);}});
jsan 2014年

4
截至2015年,blanket.js不再维护,并且不支持ES6。强烈建议伊斯坦布尔。
teroi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.