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

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 (覆盖完全)

被测代码如下:


package test;
public class TobeTest {
private String member ;
public static final String NOTUSED = "not used";
public void tobeTestMethod(int a , int b,int c) {

if(a > 0 && c >0 ){
this.member = "a > 0 && c>0 ";
}
else {
this.member = "a <= 0 or c <=0"; } if(b > 0 )
{
this.member += "b > 0 ";
}
else {
this.member += "b <= 0"; } System.out.println(this.member); } }

测试代码如下:

@Test
public void testTobeTestMethod() {

TobeTest test = new TobeTest();

test.tobeTestMethod(1,1,1);
test.tobeTestMethod(0,0,1);
test.tobeTestMethod(0,0,0);

}

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%)

被测试代码如下:

package test;
public class TobeTest2 {
private String member ;
public static final String NOTUSED = "not used";
public void tobeTestMethod(int a , int b,int c) {
if(a > 0 && c >0 )
{
try {
throwException();
this.member = "a > 0 && c>0 ";
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else {
this.member = "a <= 0 or c <=0"; } if(b > 0 )
{
this.member += "b > 0 ";
}
else {
this.member += "b <= 0"; } System.out.println(this.member); } private void throwException() throws Exception { throw new Exception(); } }

测试代码如下:

@Test
public void testTobeTestMethod2() {

TobeTest2 test = new TobeTest2();

test.tobeTestMethod(1,1,1);
test.tobeTestMethod(0,0,1);
test.tobeTestMethod(0,0,0);
test.tobeTestMethod(1,0,0);
test.tobeTestMethod(0,0,0);

}

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

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


发表评论

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