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

覆盖率测试

在写代码的时候,我们有时候会进行代码测试以保证我们代码的可执行性。但是测试代码只能保证测试案例能够通过,我们怎么样才能确保我们的测试案例基本覆盖了所有的情况呢?

比如:

const a = true;
if (a) {
return 1;
} else {
return -1;
}

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

所以我们需要引入覆盖率测试对我们的测试案例进行评估。

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

覆盖率测试的分类

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

其中:

  • 函数覆盖率:程序中的函数占函数总量的比重
  • 语句覆盖率:执行代码行数占代码总行数的比重
  • 分支覆盖率:表示代码逻辑的每个分支是否都测试了,比如 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 目录下。

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

整合 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 中:

如果 Contributor 没有对新增代码写对应的测试案例,你就可以一眼看出来。如果测试覆盖率太低,你可以修改 PR,重新合并。

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

添加 Codecov Badge

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

效果参考 https://github.com/zhongdeming428/learn-coverage-test。

代码覆盖率测试及 GitHub 自动化集成的更多相关文章

  1. AppVeyor-CI为GitHub项目做自动化集成(dotnet为主)

    travis-ci对dotnet的项目做自动化集成不太友好,尤其是使用mono的编译和不能使用MSTest进行自动化测试,所以转到appveyor进行. appveyor的配置非常简单,有两种方式: ...

  2. 从零开始搭建Jenkins+Docker自动化集成环境

    本文只简单标记下大概的步骤,具体搭建各个部分的细节,还请自行搜索.第一.二部分只是对Jenkins和Docker的简单介绍,熟悉的同学请直接跳到第三部分. 一.关于Jenkins Jenkins简介 ...

  3. 基于Armitage的MSF自动化集成攻击实践

    基于Armitage的MSF自动化集成攻击实践 目录 0x01 实践环境 0x02 预备知识 0x03 Armitage基础配置 0x04 Nmap:Armitage下信息搜集与漏洞扫描 0x05 A ...

  4. Docker学习总结(13)——从零开始搭建Jenkins+Docker自动化集成环境

    本文只简单标记下大概的步骤,具体搭建各个部分的细节,还请自行搜索.第一.二部分只是对Jenkins和Docker的简单介绍,熟悉的同学请直接跳到第三部分. 一.关于Jenkins Jenkins简介 ...

  5. 自动化集成部署udeployer 批量统一安装一键部署

    通过jenkins构建项目:version版本控制:udployer自动化集成:ucop业务巡检做到高效高可用的自动化体系.   1.0版本: 逻辑与业务分离,完美实现逻辑与业务分离,业务实现统一sh ...

  6. jenkins+github持续集成中的坑

    1.前言 刚开始开发自己的独立博客的时候,每次发布都要手动打包,上传服务器,杀tomcat进程,重启,来回这么重复性工作,很快就有点不耐烦了.如果能自动化的东西,就绝不要手动了,所以自己搭建了个持续集 ...

  7. Jenkins + Jmeter +Ant自动化集成环境搭建(一)

    所需工具 一.jmeter 工具下载 https://jmeter.apache.org/  配置环境JDK等及各种插件可以看小七之前的教程 二.Ant安装(http://ant.apache.org ...

  8. Spring Boot 代码覆盖率测试

    代码覆盖率测试是规范软件开发流程里一个必不可少的环节.一般都是在PG末尾阶段,伴随着IT自测产生. ↑以上,是自己yy出来的啊,反正我司是这样要求的.不跑覆盖率,鬼知道你在代码里夹杂了一些什么东西. ...

  9. jmeter + ant + jenkins 自动化集成环境搭建

    所需工具 一.jmeter 工具下载 https://jmeter.apache.org/  配置环境JDK等及各种插件 二.Ant安装(http://ant.apache.org/) 安装Ant是为 ...

随机推荐

  1. CodeBlocks "no such file or directory" 错误解决方案(创建类找不到头文件)

    在CodeBlocks下,有时候需要自己定义类,当然就要添加相应的头文件,但添加进去的头文件明明包含在项目中了, 但编译时还是会报错:no such file or directory;这是为什么呢? ...

  2. 【C#】组件分享:FormDragger窗体拖拽器

    适用:.net2.0+ winform项目 介绍: 类似QQ.迅雷等讲究UI体验的软件,都支持在窗口内多处地方拖动窗口,而不必老实巴交的去顶部标题栏拖,这个组件就是让winform也能这样随性拖拽,随 ...

  3. 【转】关于JTA,XA,ACID

    对于我们这种初学者,可能会使用spring带给我们的@Transactional,可能了解JTA,可能会使用jotm.atomikos,又会遇到一些名词XA,支持XA的数据库驱动等等诸多问题,然后就会 ...

  4. centos7下更新firefox

    下载最新版firefox 1.点击三条线-问号-firefox帮助-安装和更新-linux安装-系统和语言下载 保存到指定目录,比如home下 2.解压 tar xjf firefox-*.tar.b ...

  5. vs中发布WebSever时启用HTTP-POST和HTTP-GET这两种协议

    一.问题介绍 在vs中建立一个websever项目时候默认是禁用HTTP-POST和HTTP-GET这两种协议的.但是如果你是在本机上去调试或者是在iis中浏览都会有HTTP-POST这种方式,因为这 ...

  6. BZOJ1597: [Usaco2008 Mar]土地购买(dp 斜率优化)

    题意 题目链接 Sol 重新看了一遍斜率优化,感觉又有了一些新的认识. 首先把土地按照\((w, h)\)排序,用单调栈处理出每个位置第向左第一个比他大的位置,显然这中间的元素是没用的 设\(f[i] ...

  7. php递归获取分类结构

    商城的菜单通常都是树状结构,我们来模仿实现以下. 原理都是相同的,所以我们来个简单点的结构就行.层级只有两层,有两大类:手机和电脑:每个大类下面分别有三个子类: //从数据库获取的分类数据(省略获取步 ...

  8. 初识js-charts和E-charts

    在前端开发的过程中,经常会使用到图表相关的东西,很多时候,图表在展示数据方面有着无与伦比的优势.下面我们就来看看两个常用的图表相关的插件jscharts和ECharts.前者,功能相对单一,但是不依赖 ...

  9. DBFlow(4.2)新版使用

    DBFlow新版使用 一.DBFlow4.2.4介绍 DBFlow是一个基于AnnotationProcessing(注解处理器)的ORM框架.此框架设计为了速度.性能和可用性.消除了大量死板的数据库 ...

  10. JQuery 元素操作 each循环

    参考:http://jquery.cuishifeng.cn/css.html 1.属性操作 --------------------------属性 $("").attr(); ...