测试的时候,我们常常关心,是否所有代码都测试到了。

这个指标就叫做"代码覆盖率"(code coverage)。它有四个测量维度。

  • 行覆盖率(line coverage):是否每一行都执行了?
  • 函数覆盖率(function coverage):是否每个函数都调用了?
  • 分支覆盖率(branch coverage):是否每个if代码块都执行了?
  • 语句覆盖率(statement coverage):是否每个语句都执行了?

Istanbul 是 JavaScript 程序的代码覆盖率工具,本文介绍它的用法。

这个软件以土耳其最大城市伊斯坦布尔命名,因为土耳其地毯世界闻名,而地毯是用来覆盖的。

一、安装

Istanbul 是一个 npm 模块,安装非常简单,就一行命令。


$ npm install -g istanbul

二、覆盖率测试

来看一个例子,怎么使用 Istanbul 。下面是脚本文件 simple.js 。


var a = 1;
var b = 1;
if ((a + b) > 2) {console.log('more than two');
}

使用 istanbul cover 命令,就能得到覆盖率。


$ istanbul cover simple.js===== Coverage summary =====
Statements   : 75% ( 3/4 )
Branches     : 50% ( 1/2 )
Functions    : 100% ( 0/0 )
Lines        : 75% ( 3/4 )
=============================

返回结果显示,simple.js 有4个语句(statement),执行了3个;有2个分支(branch),执行了1个;有0个函数,调用了0个;有4行代码,执行了3行。

这条命令同时还生成了一个 coverage 子目录,其中的 coverage.json 文件包含覆盖率的原始数据,coverage/lcov-report 是可以在浏览器打开的覆盖率报告,其中有详细信息,到底哪些代码没有覆盖到。

三、覆盖率门槛

完美的覆盖率当然是 100%,但是现实中很难达到。需要有一个门槛,衡量覆盖率是否达标。

istanbul check-coverage 命令用来设置门槛,同时检查当前代码是否达标。


$ istanbul check-coverage --statement 90ERROR: Coverage for statements (75%) does not meet global threshold (90%)

上面命令设置语句覆盖率的门槛是 90% ,结果就报错了,因为实际覆盖率只有75%。

除了百分比门槛,我们还可以设置绝对值门槛,比如只允许有一个语句没有被覆盖到。


$ istanbul check-coverage --statement -1

上面命令使用负数,表示绝对值门槛。这样一来,上面的例子就通过了覆盖率测试,不会再报错了。

百分比门槛和绝对值门槛,可以结合使用。


$ istanbul check-coverage --statement -5 --branch -3 --function 100

上面命令设置了3个覆盖率门槛:5个语句、3个 if 代码块、100%的函数。注意,这三个门槛是"与"(and)的关系,只要有一个没有达标,就会报错。

四、与测试框架的结合

实际开发时,istanbul 总是与测试框架结合使用,下面以常用的 Mocha 框架为例。

sqrt.js 是一个计算平方根的脚本。


var My = {sqrt: function(x) {if (x < 0) throw new Error("负值没有平方根");return Math.exp(Math.log(x)/2);}
};module.exports = My;

它的测试脚本 test.sqrt.js 放在 test 子目录。


var chai = require('chai');
var expect = chai.expect;
var My = require('../sqrt.js');describe("sqrt", function() {it("4的平方根应该等于2", function() {expect(My.sqrt(4)).to.equal(2);});it("参数为负值时应该报错", function() {expect(function(){ My.sqrt(-1); }).to.throw("负值没有平方根");});});

然后,执行下面的命令得到代码覆盖率。


$ istanbul cover _mocha
// or
$ istanbul cover _mocha test/test.sqrt.jssqrt✓ 4的平方根应该等于2 ✓ 参数为负值时应该报错 2 passing (7ms)===== Coverage summary =====
Statements   : 100% ( 5/5 )
Branches     : 100% ( 2/2 )
Functions    : 100% ( 1/1 )
Lines        : 100% ( 4/4 )
=============================

上面命令中,istanbul cover 命令后面跟的是 _mocha 命令,前面的下划线是不能省略的。

因为,mocha 和 _mocha 是两个不同的命令,前者会新建一个进程执行测试,而后者是在当前进程(即 istanbul 所在的进程)执行测试,只有这样, istanbul 才会捕捉到覆盖率数据。其他测试框架也是如此,必须在同一个进程执行测试。

如果要向 mocha 传入参数,可以写成下面的样子。


$ istanbul cover _mocha -- tests/test.sqrt.js -R spec

上面命令中,两根连词线后面的部分,都会被当作参数传入 Mocha 。如果不加那两根连词线,它们就会被当作 istanbul 的参数(参考链接1,2)。

如果想在浏览器运行 Istanbul ,可以参考这篇文章。

五、忽略某些代码

istanbul 提供注释语法,允许某些代码不计入覆盖率。


var object = parameter || /* istanbul ignore next */ {};

上面代码是为 object 指定默认值(一个空对象)。如果由于种种原因,没有为 object 为空对象的情况写测试,可以用注释,不将这种情况计入覆盖率。注意,注释要写在"或"运算符的后面。


/* istanbul ignore if  */
if (hardToReproduceError)) {return callback(hardToReproduceError);
}

上面代码的 if 语句块,在计算覆盖率的时候会被忽略。

(完)

出处:http://www.ruanyifeng.com/blog/2015/06/istanbul.html

代码覆盖率工具 Istanbul 入门教程相关推荐

  1. truffle (ETH以太坊智能合约集成开发工具) 入门教程

    truffle (ETH以太坊智能合约集成开发工具) 入门教程 前言 在你了解区块链开发之前,你有必要了解区块链的一些基础知识,什么是DApp,DApp与传统app的区别, 什么是以太坊,以太坊中的智 ...

  2. qpython3绘图_比Excel制图更强大,Python可视化工具Altair入门教程

    比 Excel 制图更强大,Python 可视化工具 Altair 入门教程 数据转化成更直观的图片,对于理解数据背后的真相很有帮助.如果你有这方面的需求,而且还在使用 Python,那么强烈推荐你试 ...

  3. python图表可视化工具_比Excel制图更强大,Python可视化工具Altair入门教程

    原作者 Parul Pandey 晓查 编译整理 量子位 出品 | 公众号 QbitAI 数据转化成更直观的图片,对于理解数据背后的真相很有帮助.如果你有这方面的需求,而且还在使用Python,那么强 ...

  4. 比Excel制图更强大,Python可视化工具Altair入门教程

    原作者 Parul Pandey  晓查 编译整理 量子位 出品 | 公众号 QbitAI 数据转化成更直观的图片,对于理解数据背后的真相很有帮助.如果你有这方面的需求,而且还在使用Python,那么 ...

  5. Arthas(1):Java诊断工具Arthas入门教程

    文章目录 前言 第一节 Arthas 能为你做什么? 第二节 环境准备 第三节 快速入门 1. 启动math-game 2. 启动arthas 3. 查看dashboard 4. 通过 thread ...

  6. 自动化运维工具(ansible入门教程)

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 Ansible是一个配置管理和配置工具,类似于Chef,Puppet或Salt.这是一款很简单也很容易入门的部署工具,它使用SSH连接到服务器并运行配 ...

  7. cygwin linux 教程,Cygwin工具使用入门教程

    简介 从使用角度来看:Cygwin就是一个Windows软件,该软件就是在Windows上仿真Linux操作系统.简而言之,Cygwin是一个在Windows平台上运行的 Linux模拟环境,使用一个 ...

  8. 加密工具GPG入门教程

    http://www.open-open.com/lib/view/open1373767754138.html 今天,就接着来看,现实中怎么使用这个算法,对信息加密和解密.这要用到 GnuPG 软件 ...

  9. 『Python爬虫』抓包工具 Fiddler 入门教程

    如今Python爬虫越来越火,有想学好Python爬虫的小伙伴可以前往gzh[Python编程学习圈]领取系统的学习资料以及教程视频,还分享有大量的技术干货文章可以阅读学习,欢迎大家关注学习. 传统的 ...

最新文章

  1. [20170606]11G _optimizer_null_aware_antijoin.txt
  2. 《几何与代数导引》习题1.36.2
  3. thinkphp mysql 中文 问号_thinkphp分页中文参数乱码解决
  4. Centos普通用户权限报错:** is not in the sudoers file. This incident will be reported.
  5. 微信品牌小程序开启公测 认证通过即享专属产品能力
  6. 二分搜索:lower_bound 与 upper_bound 函数
  7. pow,sqrt使用时需注意
  8. 清明节偷偷训练“熊猫烧香”,结果我的电脑为熊猫“献身了”!
  9. 自然语言处理之中英语料库
  10. android appium 原理,天天使用Appium,但是你真的理解Appium的工作原理吗
  11. 计算机科学与技术总体培养目标,计算机科学与技术专业培养目标
  12. vmware虚拟机搭建网络拓扑教程
  13. php工程师具备技能,PHP工程师具备的技能及素质
  14. 无人机测量技术在房地一体项目中的应用
  15. 饥荒交际服务器显示,饥荒联机版服务器挂礼物教程
  16. acwing-小猫爬山
  17. SMT在生产时,对环境温度的要求有哪些?
  18. 画一个单实线,方向可以定制
  19. Excel问题及解决方法汇总1-图表数据源丢失问题
  20. 10个简单的hacker加速你在Python中的数据分析

热门文章

  1. 深入理解分布式技术 - 缓存高可用
  2. MySQL - 并发事务问题及解决方案
  3. 拦截器获取请求参数post_SpringBoot拦截器如何获取http请求参数
  4. exfat最佳单元大小_047|仓储物流自动化系统中的物料单元
  5. vue中的组件导航守卫,个人理解
  6. 5种JavaScript中常用的排序方法
  7. Vue+element-ui 实现表格的分页功能示例
  8. 半潜式深海平台动力定位控制技术研究
  9. python实现冒泡排序算法的非递归版本_python排序算法速度比较:快速排序,归并排序,冒泡排序...
  10. 批量模糊查询_Django之ORM表高级操作、增删改查、F/Q查询等