代码行数覆盖和分支覆盖和条件覆盖的区别?

Life is short , "play" more!
本文来自lihao's Blog,转载请注明。

如何对白盒测试质量进行量化,通常就是使用代码覆盖。
line coverage(行数覆盖), branch coverage(分支覆盖),condition coverage(条件覆盖)到底有什么区别呢? 是否行数覆盖100%则意味着分支覆盖100%,条件覆盖100%呢? 如果条件覆盖100%,则是否意味着分支覆盖100%以及行数覆盖100%。

行覆盖,顾名思义代码行数(也可以成为statement 语句)的覆盖。
分支覆盖是指代码if else while等有条件导致的分支时,分支的覆盖情况。
条件覆盖(通常现代定义,例如sonarqube), 是指每一个分支条件表达式里,所有条件的覆盖。

那么我们回到这个问题。 是否行数覆盖100%则意味着分支覆盖100%,条件覆盖100%呢? 如果条件覆盖100%,则是否意味着分支覆盖100%以及行数覆盖100%。 借助这个问题,来更深入看看他们到底有什么区别。
下面举2个例子。

1. 行数覆盖100%, 但是条件覆盖率无法覆盖到100%。
下面的这个例子代码测试覆盖率如下:
Covered by Tests
Lines 9/9 (覆盖率100%)
Conditions 5/6 (不能覆盖100%)
branch 4/4 (覆盖完全)

被测代码如下:

测试代码如下:

if(a > 0 && c >0 ) 有4个条件情况,分别是 a>0 == false , a>0==true , c>0==false, c>0==true,
if(b > 0 ), 有2个条件情况, 分别是b>0==false, b>0==true, 所以上述测试代码仅覆盖了 6个情况中的5个。
但是代码行所有都覆盖到了。 4个分支(branch) 也覆盖到了。

2. 条件覆盖率100%, 分支覆盖率100%, 但是行数无法覆盖100%。

测试覆盖情况如下:

Covered by Tests
Lines 12/14 (行数未覆盖100%)
Conditions 6/6 (100%)
branch 4/4 (100%)

被测试代码如下:

测试代码如下:

行数未覆盖完全,是因为某些代码执行依赖于外部资源,因为抛出异常后, 代码不会继续执行。导致代码行数无法覆盖完全。 此时也属于覆盖未完全的情况。

针对于sonarqube, 根据代码覆盖率工具仅展示了2个代码覆盖率指标, 一个是line coverage 和一个condition coverage。 因为此处的condition coverage 实际上是修改版本的标准定义。 即condition + branch 的覆盖率。 除了path coverage外(目前暂未发现可以支持扫描并分析得出path coverage的工具), 综上, 行覆盖率+条件覆盖,可以通过此2个维度来衡量我们的白盒测试覆盖情况,来指导我们进行更有效的白盒测试。

此篇文章已被阅读449 次


发表评论

电子邮件地址不会被公开。 必填项已用*标注