代码覆盖率测试及 GitHub 自动化集成

codecov

本文对应项目为 learn-coverage-test,能够对照项目案例进行阅读。html

覆盖率测试

在写代码的时候,咱们有时候会进行代码测试以保证咱们代码的可执行性。可是测试代码只能保证测试案例可以经过,咱们怎么样才能确保咱们的测试案例基本覆盖了全部的状况呢?node

好比:git

const a = true;
if (a) {
  return 1;
} else {
  return -1;
}
复制代码

上面这段代码只能确保 a === true 的状况被执行,而没有执行 a === false 的状况。若是在实际使用当中,a 的值为 false,那么上面的代码可能会发生不可预知的状况。github

因此咱们须要引入覆盖率测试对咱们的测试案例进行评估。npm

覆盖率用于评估在代码测试的过程当中,所测试的代码的比例和程度。一般而言,测试覆盖率高的代码出错的概率比较小;测试覆盖率较低的代码出现不可预知行为的概率比较大。json

覆盖率测试的分类

根据维基百科的资料,基本的代码覆盖率有 4 种:函数覆盖率语句覆盖率分支覆盖率条件覆盖率bash

其中:函数

  • 函数覆盖率:程序中的函数占函数总量的比重
  • 语句覆盖率:执行代码行数占代码总行数的比重
  • 分支覆盖率:表示代码逻辑的每一个分支是否都测试了,好比 if 条件为 true 或者 false 时的代码是否都被执行了
  • 条件覆盖率:每一个布尔子表达式都应该被赋值为了 true 或者 false,这样才知足条件覆盖率测试。

好比如今有一个函数:工具

function foo(x, y) {
  let res = 0;
  if (x > 0 && y > 0) {
    res = x;
  }
  return res;
}
复制代码

对于上面这个函数,咱们在测试时:测试

  • 若是 foo 函数被执行了,那么该函数的函数覆盖率被知足。当源代码只包含这一个函数时,函数覆盖率为 100%。好比:foo(1, 2)
  • 若是函数的每一行代码(每一条语句)都被执行了,那么该函数的语句覆盖率被知足。好比:foo(1, 2),由于 res = x 也被执行了。
  • 若是 if 内的代码也被执行了,那么条件覆盖率被知足。
  • 若是测试案例中包含 x > 0 的值为 true 和 false 的状况,以及 y > 0 为 true 和 false 的状况,那么条件覆盖率被知足。好比:foo(1, -1)foo(-1, 1)

以上案例来自维基百科

使用 Mocha + Istanbul 测试覆盖率

Mocha 是 JavaScript 项目的测试工具,Istanbul 是 JS 测试覆盖率报告的生成工具。

该节介绍如何结合两者测试代码并生成代码测试覆盖率报告。

nyc 是 Istanbul 的命令行接口,咱们将其做为开发依赖安装在项目中:

$ npm i -D nyc
复制代码

而后在咱们的 package.json 文件的 scripts 对象中新增以下属性:

"coverage": "node_modules/.bin/nyc --reporter=html --reporter=text node_modules/mocha/bin/_mocha"
复制代码

固然,根据项目状况不一样,上面的命令能够不一致,具体能够参考文档进行配置。

这样当你在 npm run test 以后就能够在测试结果以后看到输出的覆盖率报告,并且还会额外生成覆盖率报告页面文件到项目的 coverage 目录下。

捕获1.png

点击 coverage/index.html 能够看到详细的覆盖率测试结果:

捕获2.png

整合 Codecov 和 TravisCI 进行覆盖率自动化测试

首先要对你的 GitHub 帐号开通 Codecov 权限,访问 Codecov,而后使用 GitHub 帐号登陆。以后将会自动同步一些你的 GitHub 信息,按照指引进行便可。

此后还须要在 GitHub 进行设置,对某个 repo 开通 Codecov 的服务。具体能够在 GitHub marketplace 中找到 Codecov,而后点击 configure 进行配置。

Travis CI 脚本中须要添加几句命令,以便安装对应依赖和上传覆盖率报告。

.travis.yml 具体配置大约以下:

language: node_js
node_js:
 - "7"
install:
 - npm i
 - npm i -g codecov
script:
 - npm run coverage
 - node_modules/.bin/nyc report --reporter=text-lcov > coverage.lcov - codecov cache:
 directories:
 - node_modules
复制代码

能够看到安装的依赖为 codecov,而且是全局安装。而后使用 node_modules/.bin/nyc report --reporter=text-lcov > coverage.lcov 命令生成了报告。

配置好以后,当你每次对项目进行 PR 的时候,Codecov 会自动测试覆盖率,而后将报告评论在 PR 中:

捕获3.png

若是 Contributor 没有对新增代码写对应的测试案例,你就能够一眼看出来。若是测试覆盖率过低,你能够修改 PR,从新合并。

我在 PR 中修改了测试代码,提升了测试覆盖率,Codecov 在我合并 PR 以前就已经把覆盖率报告评论在了 PR 下方了,能够明显地看到覆盖率获得了提高,确实十分的方便。

捕获4.png

添加 Codecov Badge

在 Codecov 官网登陆后找到你的 repo,而后点击进去,依次找到 Settings -> Badge,复制对应的代码便可。

效果参考 github.com/zhongdeming…

相关文章
相关标签/搜索