Mocha的代码覆盖率

tus*_*ath 273 unit-testing code-coverage mocha.js node.js

我正在使用Mocha来测试我的NodeJS应用程序.我无法弄清楚如何使用其代码覆盖功能.我试过谷歌搜索但没有找到任何适当的教程.请帮忙.

Dan*_*ohn 389

你需要一个额外的库来代码覆盖,你会被伊斯坦布尔的强大和轻松所震撼.在让mocha测试通过后,请尝试以下操作:

npm install nyc
Run Code Online (Sandbox Code Playgroud)

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

{
  "scripts": {
    "test": "nyc mocha"
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 或者,在本地安装istanbul和mocha,并将以下内容添加到package.json的scripts部分,然后将npm运行覆盖:"coverage":"./ node_modules /istanbul/lib/cli.js cover ./node_modules/ mocha/bin/_mocha - --ui bdd -R spec -t 5000 (102认同)
  • 如果您正在运行本地安装的mocha版本,请尝试`istanbul cover node_modules/mocha/bin/_mocha`. (30认同)
  • @Windows用户:`istanbul cover node_modules/mocha/bin/_mocha - -R spec` (19认同)
  • 我无法在Windows上运行此命令,但通过指定mocha bin的完整路径,我能够让它工作.`istanbul.cmd封面C:\ Users\{UserName}\AppData\Roaming \npm \node_modules\mocha\bin\_mocha` (6认同)
  • `$(npm bin)`是`./ node_modules/.bin /`的规范快捷方式,`istanbul/lib/cli.js`在bin文件夹中别名为`istanbul`.所以这是一个较短的命令:`$(npm bin)/ istanbul cover $(npm bin)/ _ mocha - --ui bdd -R spec -t 5000` (3认同)
  • https://github.com/daniellmb/grunt-istanbul-coverage或https://github.com/taichi/grunt-istanbul应该适合你.这里有Coffeescript和伊斯坦布尔:https://github.com/Constellation/ibrik (2认同)

lif*_*foo 119

现在(2019)使用istanbul的首选方式是通过其"最先进的命令行界面" nyc.

建立

首先,将其安装在您的项目中

npm i nyc --save-dev
Run Code Online (Sandbox Code Playgroud)

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

{
  "scripts": {
    "test": "nyc --reporter=text mocha"
  }
}
Run Code Online (Sandbox Code Playgroud)

现在运行测试

npm test
Run Code Online (Sandbox Code Playgroud)

您将在测试输出后立即在控制台中看到这样的表格:

伊斯坦布尔纽约摩卡代码报道

定制

Html报告

只是用

nyc --reporter=html
Run Code Online (Sandbox Code Playgroud)

而不是text.现在它将在里面生成一份报告./coverage/index.html.

报告格式

伊斯坦布尔支持各种报告格式.只需查看其报告库即可找到最适合您的报告库.只需--reporter=REPORTER_NAME为您想要的每种格式添加一个选项.例如,用

nyc --reporter=html --reporter=text
Run Code Online (Sandbox Code Playgroud)

你将拥有控制台和html报告.

不要使用npm测试运行覆盖

只需在您的脚本中添加另一个脚本,只package.json留下test您的测试运行器(例如mocha):

{
  "scripts": {
    "test": "mocha",
    "test-with-coverage": "nyc --reporter=text mocha"
  }
}
Run Code Online (Sandbox Code Playgroud)

现在运行此自定义脚本

npm run test-with-coverage
Run Code Online (Sandbox Code Playgroud)

使用代码覆盖率运行测试.

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

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

nyc --check-coverage --lines 90 
Run Code Online (Sandbox Code Playgroud)

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

nyc --check-coverage --lines 90 --per-file
Run Code Online (Sandbox Code Playgroud)

  • 感谢您添加"now(2017)" - 在这个快速移动的JavaScript世界中真的很有帮助 (8认同)
  • 这也适用于茉莉花:“nyc --reporter=html jasmine” (2认同)
  • 万一其他人感到困惑-npm存储库[istanbul](https://www.npmjs.com/package/istanbul)似乎已被[nyc](https://www.npmjs.com/package/ nyc)。根据列出的依赖项,将伊斯坦布尔分为多个软件包,这些软件包都保存在其[istanbuljs monorepo]中(https://github.com/istanbuljs/istanbuljs) (2认同)

Dig*_*rat 20

如果您使用 ESM 模块,则接受的答案 (nyc) 不起作用。

C8似乎是现在最好的解决方案,它利用内置的 NodeJS 功能并利用伊斯坦布尔(与纽约一样,并共享相同的配置文件)。

npm install -g c8
c8 mocha
Run Code Online (Sandbox Code Playgroud)

它将使用 .nycrc 进行配置。我正在使用的示例配置是:

{
    "all": true,
    "exclude": ["test"],
    "output": "reports",
    "reporter" : [
        "html",
        "text"
    ]
}
Run Code Online (Sandbox Code Playgroud)

(注:另一个问题的答案指向了c8 /sf/answers/4889277781/


jsa*_*san 19

Blanket.js也很完美.

npm install --save-dev blanket

在你的test/tests.js面前

require('blanket')({
    pattern: function (filename) {
        return !/node_modules/.test(filename);
    }
});
Run Code Online (Sandbox Code Playgroud)

mocha -R html-cov > coverage.html

  • 截至2015年,blanket.js不再维护,不支持ES6.强烈推荐伊斯坦布尔. (3认同)