如何计算单元测试的覆盖率
单元测试,计算语句覆盖率、分支覆盖率、条件覆盖率、分支条件覆盖率、路径覆盖率
一、概念
单元测试的覆盖率有:语句覆盖率(即行覆盖率)、分支覆盖率、条件覆盖率、分支条件覆盖率、路径覆盖率等。
-
语句覆盖率
所谓语句就是那些非分支、非判断的语句。
计算公式:程序执行到的语句总数 / 全部语句的总数 -
分支覆盖率
有判定语句的地方都会出现2个分支。
计算公式:程序执行到的分支总数 / 全部分支总数 -
条件覆盖率
分支覆盖率与条件覆盖率有细微差别,条件覆盖率在判定语句的组合上有更细的划分。判定结果为True 或 False即为一个条件,例如: a = 1,依据判定的结果(True 或 False)可作为2个条件。再举个例子,代码如下:public void demo(int aa, int bb) { int a = aa; int b = bb; if (a == 1 && b = 1) { ... } }
以上代码中总共有多少个条件呢?a == 1有 True 或 Fasle 2 个条件,b == 1 同样有 True 或 False 2个条件,所以,总共有 4 个条件。
计算公式:程序执行到的条件总数 / 全部条件总数
-
分支条件覆盖率
分支条件覆盖率是根据分支覆盖率和条件覆盖率得出的。
计算公式:分支覆盖率分子/分母 + 条件覆盖率分子/分母,如:1/4 + 2/6 = 1+2 / 4+6 = 3/10 -
路径覆盖率
程序从开始到结束的过程为路径
计算公式:程序执行的路径数 / 全部路径数
二、计算覆盖率
我们来基于下边的代码段来进行详细的说明,如下:
public void demo(int aa, int bb) {
int a = aa; // 语句1
int b = bb; // 语句2
if (a == 0 && b == 0) {
System.out.println("a = 0 and b = 0"); // 语句3
} else if (a == 1 || b == 1) {
System.out.println("a = 1 or b = 1"); // 语句4
} else {
System.out.println("a = " + a+ ", b = " + b); // 语句5
}
}
让我们来分别计算下以上的代码段中的语句总数、分支总数、条件总数、路径总数。
-
语句总数
总共有 5 条语句
序号 描述 语句1 int a = aa 语句2 int b = bb 语句3 System.out.println(“a = 0 and b = 0”) 语句4 System.out.println(“a = 1 or b = 1”) 语句5 System.out.println("a = " + a+ ", b = " + b) -
分支总数
总共有 4 条分支
序号 描述 分支1 a == 0 && b == 0 判定结果为 True 分支2 a == 0 && b == 0 判定结果为 False 分支3 a == 1 || b == 1 判定结果为 True 分支4 a == 1 || b == 1 判定结果为 False -
条件总数
总共有 8 个条件
序号 描述 条件1 a == 0 判定结果为 True 条件2 a == 0 判定结果为 False 条件3 b == 0 判定结果为 True 条件4 b == 0 判定结果为 False 条件5 a == 1 判定结果为 True 条件6 a == 1 判定结果为 False 条件7 b == 1 判定结果为 True 条件8 b == 1 判定结果为 False -
路径总数
总共有 3 条路径
序号 描述 路径1 a == 0 && b == 0 判定结果为 True 路径2 a == 0 && b == 0 判定结果为 False,a == 1 || b == 1 判定结果为 True 路径3 a == 0 && b == 0 判定结果为 False,a == 1 || b == 1 判定结果为 False
总数都已经统计好了,下边通过两张图例(也是两种情况)来说明,如果计算各个覆盖率。
- 入参为 aa = 0、bb = 0
(这里需要纠正一下图中一个错误:路径覆盖率应该是1/3,而不是1/8) - 入参为 aa = 1、bb = 0
(这里需要纠正一下图中一个错误:路径覆盖率应该是1/3,而不是1/8)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)