【问题标题】:Code coverage with MochaMocha 的代码覆盖率
【发布时间】:2013-05-14 01:12:42
【问题描述】:

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

【问题讨论】:

    标签: node.js unit-testing code-coverage mocha.js


    【解决方案1】:

    你需要一个额外的库来覆盖代码,你会被istanbul 的强大和简单所震撼。在通过 mocha 测试后尝试以下操作:

    npm install nyc
    

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

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

    【讨论】:

    • 如果您正在运行本地安装的 mocha 版本,请尝试 istanbul cover node_modules/mocha/bin/_mocha
    • 或者,在本地安装 istanbul 和 mocha,并将以下内容添加到 package.json 的脚本部分,然后只需 npm run coverage: "coverage": "./node_modules/istanbul/lib/ cli.js 覆盖 ./node_modules/mocha/bin/_mocha -- --ui bdd -R spec -t 5000
    • 我无法让这个命令在 Windows 上运行,但是通过指定 mocha bin 的完整路径,我能够让它工作。 istanbul.cmd cover C:\Users\{UserName}\AppData\Roaming\npm\node_modules\mocha\bin\_mocha
    • $(npm bin)./node_modules/.bin/ 的规范快捷方式,istanbul/lib/cli.js 在 bin 文件夹中别名为 istanbul。所以这里有一个更短的命令:$(npm bin)/istanbul cover $(npm bin)/_mocha -- --ui bdd -R spec -t 5000
    • @Windows 用户:istanbul cover node_modules/mocha/bin/_mocha -- -R spec
    【解决方案2】:

    现在(2021)使用istanbul 的首选方式是通过其“最先进的命令行界面”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 中生成一个报告。

    报告格式

    伊斯坦布尔支持多种报告格式。只需查看其reports library 即可找到对您最有用的。 只需为您想要的每种格式添加一个--reporter=REPORTER_NAME 选项。 例如,与

    nyc --reporter=html --reporter=text
    

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

    不要使用 npm test 运行覆盖

    只需在您的 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
    

    【讨论】:

    • 这也适用于茉莉花:“nyc --reporter=html jasmine”
    • 我的作品,但我没有看到代码覆盖率显示代码本身中哪些行被绿色/红色覆盖。
    • 感谢添加“now(2017)” - 在这个快速发展的 JavaScript 世界中真的很有帮助
    • 以防其他人感到困惑 - npm 存储库 istanbul 似乎已被 nyc 取代。根据其列出的依赖项,伊斯坦布尔被拆分成各种包,这些包都维护在它们的istanbuljs monorepo
    • 我启用了--reporter=html,但 html 文件始终为空,没有显示未覆盖的块或覆盖的百分比等只是表的标题
    【解决方案3】:

    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); } });
    • 截至 2015 年,blanket.js 不再维护,不支持 ES6。强烈推荐伊斯坦布尔。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2015-03-22
    • 2018-07-20
    • 2012-06-30
    • 2015-07-03
    • 2015-08-26
    • 2018-01-11
    相关资源
    最近更新 更多