看懂“代码覆盖率报告”
定义
代码覆盖(英语:Code coverage)是软件测试中的一种度量,描述程序中源代码被测试的比例和程度。通常,它有4个测量维度:
- 语句覆盖率(statement coverage):程序中的每条语句都执行了吗?
- 分支覆盖率(branch coverage):每个控制结构(例如if语句)的每个分支都执行了吗?
- 函数覆盖率(function coverage):程序中的每个函数都被调用了吗?
- 行覆盖率(line coverage):是否每一行都执行了?
Istanbul 是 JavaScript 程序的代码覆盖率工具,本文以它输出的代码覆盖率报告为例,介绍这4种覆盖度量方式的具体算法。
代码覆盖率算法
示例代码
function add(a, b) {
if ((a + b) > 2) { console.log('a plus b is greater than 2'); }
}
function sub(a, b) {
if ((a - b) > 2) {
console.log('a minus b is greater than 2');
}
}
add(0, 1);
使用 Istanbul 输出覆盖率报告
$ istanbul cover cov.js
说明
- 语句(statement): 指编程语句,如赋值语句、控制语句、返回语句等
- 分支(branch): 指控制结构的某个执行路径,如if语句中条件为true的路径即为1个分支
- 函数(function): 代码中定义的函数
- 行(line): 指可执行代码行(Lines of Executable Code),而不是源文件中所有的代码行
语句覆盖率
语句覆盖率 = 已覆盖的语句个数/语句总数 = 4/7 = 57.14%
特别注意:代码第2行,虽然书写上来说是1行,但是是2条语句(1条控制语句,1条函数调用语句)
分支覆盖率
分支覆盖率 = 已覆盖的分支个数/分支总数 = 1/4 = 25%
2个if语句,则共有4个分支。
函数覆盖率
函数覆盖率 = 已覆盖的函数个数/函数总数 = 1/4 = 25%
行覆盖率
行覆盖率 = 已覆盖的可执行代码行数/可执行代码行总数 = 4/6
应用
- 对于质量要求不高的程序,使用语句覆盖率进行评估即可。
- 对于质量要求非常严格的程序,则需要使用分支覆盖率,甚至条件覆盖率、修改条件/判断覆盖(MCDC)进行评估,这里就不一一赘述了。