我正在使用 Mocha 来测试我的 NodeJS 应用程序。我无法弄清楚如何使用其代码覆盖率功能。我尝试用谷歌搜索但没有找到任何合适的教程。请帮忙。
您需要一个额外的库来实现代码覆盖率,您将会对 istanbul 的强大和简单感到震惊。通过摩卡测试后,请尝试以下操作:
npm install nyc
现在,只需将命令 nyc 放在现有的测试命令前面,例如:
{
"scripts": {
"test": "nyc mocha"
}
}
现在(2024)使用istanbul的首选方式是通过其“最先进的命令行界面”nyc。
首先,将其安装到您的项目中
npm i nyc --save-dev
然后,如果您有一个基于 npm 的项目,只需更改
package.json文件的
scripts
对象内的测试脚本即可执行 mocha 测试的代码覆盖率:
{
"scripts": {
"test": "nyc --reporter=text mocha"
}
}
现在运行你的测试
npm test
您将在测试输出之后在控制台中看到这样的表格:
只需使用
nyc --reporter=html
而不是
text
。现在它会在./coverage/index.html
内生成一份报告。
伊斯坦布尔支持多种报告格式。只需查看其报告库即可找到对您最有用的报告。 只需为您想要的每种格式添加
--reporter=REPORTER_NAME
选项即可。
例如,与
nyc --reporter=html --reporter=text
您将同时拥有控制台和 html 报告。
只需在您的
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
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
如果您使用 ESM 模块,则接受的答案 (nyc) 不起作用。
C8 似乎是现在最好的解决方案,它利用内置的 NodeJS 功能并利用伊斯坦布尔(如 nyc,并共享相同的配置文件)。
npm install -g c8
c8 mocha
它将使用 .nycrc 进行配置。我正在使用的示例配置是:
{
"all": true,
"exclude": ["test"],
"output": "reports",
"reporter" : [
"html",
"text"
]
}
(注:另一个问题的答案指向了c8https://stackoverflow.com/a/69846825/1949430)