Istanbul
课堂笔记
代码覆盖率:一个程序的代码被运行程度的量度
基本准则:函数覆盖(一函数为单位)、语句覆盖(以每行代码为单位)、分支覆盖(if判断的不同分支-trueORfalse都是不同分支)、条件覆盖(会检测到条件中任一条件是否覆盖到)
Istanbuljs程序的代码覆盖率测试工具
1可检查包括语句、分支的函数覆盖
2命令行工具
3可生成html和lcov报表
istanbul
第一章 代码覆盖率简介
1.1 代码覆盖率介绍
代码覆盖(Code coverage)是用来描述在特定的测试套件(条件)下,一个程序的代码被运行程度的量度(一般指比例),具有高的 代码覆盖率(以百分比为单位)的程序,表示在测试期间执行了更多的程序源代码;这表明与具有低代码覆盖率的程序相比,该程序具有较低的可能性检测到程序的bug。
1.2 代码覆盖率基本准则
函数覆盖(Function Coverage)
程序中每一个function
或者子程序是否被调用到
语句覆盖(Statement Coverage)
最常用也是最常见的一种覆盖方式,就是度量被测代码中每个可执行语句是否被执行到了,也称作行覆盖
分支覆盖(Branch Coverag)
度量程序中每一个判定的分支是否被检测到了
条件覆盖
每一个字表达是结果为true
或者false
是否被检测到了
参考以下的JavaScript的函数
假设这个方法使我们某个项目的一个function
,并且我们使用一些测试套件来测试该函数:
测试过程中,该函数至少被调用一次;
如调用
test(1, 1)
,则满足该函数的语句覆盖,这种情况下执行函数的每一行;
如调用
test(1, 1)
和
test(0, 1)
,那么将满足分支覆盖,在第一种情况下,将满足if条件分支,第二种情况,第一个条件
a
>
0
不被满足, 这会阻止执行
c=a
;
如果调用
test(1,0)
和
test(0,1)
,那么将满足条件覆盖,第一种情况下
a
>
0
将被满足,第二种情况下
b
>
0
将被满足
满足了条件覆盖并代表满足了分支覆盖;上面的第四种情况,满足了a和b均大于零,但是并不能满足if的true和false两种条件;
第二章 istanbul简介
Istanbul 是 JavaScript 程序的代码覆盖率检查工具;
特性
可检查包括语句、分支和函数覆盖,以及反向工程的代码行覆盖
命令行工具 可运行带覆盖率检查的 node 单元测试,不需要对测试运行进行协作
可生成 HTML 和 LCOV 报表
在浏览器和 node 0.4.x, 0.6.x, 0.8.x 上测试通过
第三章 Istanbul安装使用
3.1 Istanbul安装
Istanbul 是一个 npm 模块,基于node,使用npm安装即可:
3.2 Istanbul简明实例
通过以下实例来了解使用Istanbul来测试代码覆盖率:
有需要测试的脚本文件:test.js, 代码如下:
命令行使用istanbul cover
就可以得到覆盖率:
终端输出如下图所示:
返回结果显示,simple.js 有9个语句(statement),执行了6个;有4个分支(branch), 执行了1个;有2个函数,调用了1个;有9行代码,执行了6行。
这条命令同时还生成了一个 coverage 子目录,其中的 coverage.json 文件包含覆盖率的原始数据,coverage/lcov-report 是可以在浏览器打开的覆盖率报告,其中有详细信息,到底哪些代码没有覆盖到。
3.3 覆盖率标准
完美的覆盖率当然是 100%,但是现实中很难达到。一般会设置一个标准来衡量覆盖率是否达标。
istanbul check-coverage 命令用来设置门槛,同时检查当前代码是否达标。
上面命令设置语句覆盖率的门槛是 90% ,结果就报错了,因为实际覆盖率只有75%。
除了百分比门槛,我们还可以设置绝对值门槛,比如只允许有一个语句没有被覆盖到。
上面命令使用负数,表示绝对值门槛。
百分比门槛和绝对值门槛,可以结合使用。
上面命令设置了3个覆盖率门槛:5个语句、3个 if 代码块、100%的函数。 注意,这三个门槛是"与"(and)的关系,只要有一个没有达标,就会报错。
3.4 与测试框架的结合
实际开发时,istanbul 总是与测试框架结合使用,下面以常用的 Mocha 框架为例。
sqrt.js 是一个计算平方根的脚本:
它的测试脚本 test.sqrt.js 放在 test 子目录。
然后,执行下面的命令得到代码覆盖率。
上面命令中,istanbul cover 命令后面跟的是 _mocha 命令,前面的下划线是不能省略的。
因为,mocha 和 _mocha 是两个不同的命令,前者会新建一个进程执行测试,而后者是在当前进程(即 istanbul 所在的进程)执行测试,只有这样, istanbul 才会捕捉到覆盖率数据。其他测试框架也是如此,必须在同一个进程执行测试。
如果要向 mocha 传入参数,可以写成下面的样子。
上面命令中,两根连词线后面的部分,都会被当作参数传入 Mocha 。如果不加那两根连词线,它们就会被当作 istanbul 的参数
3.5 忽略某些代码
istanbul 提供注释语法,允许某些代码不计入覆盖率。
上面代码是为 object 指定默认值(一个空对象)。如果由于种种原因,没有为 object 为空对象的情况写测试,可以用注释,不将这种情况计入覆盖率。注意,注释要写在"或"运算符的后面。
上面代码的 if 语句块,在计算覆盖率的时候会被忽略。
参考文档
Last updated