代码覆盖率
代码覆盖率是一种度量,它描述了程序源代码已经过测试的程度,它可以帮助我们评估测试执行的效率, 简单来理解代码覆盖率就是单元测试中代码执行量与代码总量之间的比率。代码覆盖率主要包括语句覆盖率、分支覆盖率、条件覆盖率和路径覆盖率。Java常用的单元测试覆盖率框架有:JaCoCo、EMMA和Cobertura,其中jacoco使用最为广泛。
实例
为了让大家了解不同语句覆盖率的区别,接下来讲解的语句覆盖率、分支覆盖率、条件覆盖率和路径覆盖率都是根据下面这个实例讲解的。
如果满足条件A and B 执行 事件1
如果满足条件C or D 执行 事件2
语句覆盖率
只需要让程序中的语句都执行一遍即可 。上例中只需设计测试用例使得A=true B=true C=true 即可。
总结
必要的、最简单的,但也是最弱的标准
无法检测到缺失的语句
但能发现无法执行到的语句(死代码)
覆盖率:
语句覆盖 = 已执行的语句数目 / 所有语句的总数目 * 100%
分支覆盖率
分支覆盖又称判定覆盖:使得程序中每个判断的取真分支和取假分支至少经历一次,即判断的真假均曾被满足。上例需要设计测试用例使其分别满足下列条件即可
(1)A=true,B=true,C=true,D=false 真分支覆盖
(2)A=true,B=false,C=false,D=false。假分支覆盖
总结
在控制流程图内的每一条控制流都至少被执行一次!每一条边即每一条控制流(有向线)都走过了,才为 100% 分支覆盖
在实践中作为最小的测试标准
能发现无法执行到的程序分支
无法发现缺失的分支
没有测试到分支的组合
覆盖率:
分支覆盖 = 已执行的分支数目 / 分支总数目 * 100%
条件覆盖率
程序各判定中的每个条件获得各种可能的取值至少满足一次即可,不考虑路径的覆盖。
上例中第一个判断应考虑到A=true,A=false,B=true,B=false;
第二个判断应考虑到C=true,C=false,D=true,D=false
所以设计出下面2条测试用例就能够满足条件覆盖
(1)A=true,B=true,C=true,D=true 满足 ABCD都取true
(2)A=false,B=false,C=false,D=false。满足 ABCD都取false
总结
条件覆盖率是一种测试方法,用于测试和评估条件语句中的变量或子表达式。条件覆盖的目标是检查每个逻辑条件的单个结果。与分支覆盖相比,条件覆盖对控制流的敏感性更高。
条件覆盖比较复杂,具体包括:
简单条件覆盖
判定/条件覆盖
复合条件覆盖
它们的区别是测试的深度从上往下越来越深入,需要的测试用例数越来越多,能发现缺陷越来越多,这里就不再一一展开了。
覆盖率
条件覆盖 = 已执行的条件数目 / 条件总数目 * 100%
路径覆盖率
要求覆盖程序中所有可能的路径,我们可以设计测试用例,如下:
(1)A=true,B=true,C=true,D=true
(2)A=false,B=false,C=false,D=false
(3)A=true,B=true,C=false,D=false
(4)A=false,B=false,C=true,D=true。
总结
路径覆盖率比前面讲的几种方法覆盖度都要高,缺点是我们需要设计数量非常巨大的而且较为复杂的测试用例。
代码覆盖率优缺点总结
代码覆盖率的优点
· 有助于评估量化的代码覆盖率
· 可以创建额外的测试用例以增加覆盖范围
· 可以找到一组测试用例无法执行的程序区域
代码覆盖率的缺点
· 即使在设计中未实现任何特定功能,代码覆盖率仍然可能报告为100%覆盖率。
· 无法确定是否在代码覆盖率的帮助下测试了功能的所有可能值
· 无法告诉大家覆盖逻辑的程度