2016-04-30 29 views
0

使用EclEmma Eclipse代码覆盖插件运行此单元测试后,它返回100%的分支覆盖率,即覆盖4个分支中的4个,我预计只有2个这里覆盖的4个分支中有50%覆盖。 如果我证明是正确的,任何人都可以提出更好的分支机构覆盖工具。提前致谢。请确认/评论分支覆盖问题我看到EclEmma Eclipse Plugin

@Test 
public void testTT(){; 
    assertTrue(bar(true, true)==3); 
} 

@Test 
public void testFF(){; 
    assertTrue(bar(false, false)==8); 
} 


int bar(boolean cond1, boolean cond2) { 
     int answer = 1; 
     if (cond1) { 
      answer = answer * a(); 
     } else { 
      answer = answer * b(); 
     } 

     if (cond2) { 
      answer = answer * c(); 
     } else { 
      answer = answer * d(); 
     } 
    return answer; 
    } 

private int a(){ 
    return 1; 
} 

private int b(){ 
    return 2; 
} 

private int c(){ 
    return 3; 
} 

private int d(){ 
    return 4; 
} 
+0

感谢您的意见,看了一轮后,我发现JMockit:http://jmockit.org提供路径覆盖,似乎适用于我测试过的简单情况它与。我也看到了一些商业工具似乎提供了路径覆盖,https://www.parasoft.com和http://www.coverity.com/products/coverity-save/ – newlogic

回答

1

该工具正确。代码中有4个分支,所有4个分支都被执行。

我相信你正在寻找的是整个代码中有多少独特路径的组合复杂性,并有一个测量。在你的例子中,分支的数量恰好等于整个方法的路径数量。

我能显示差与稍长例如:

@Test 
public void testTTT(){; 
    assertTrue(bar(true, true, true)==3); 
} 

@Test 
public void testFFF(){; 
    assertTrue(bar(false, false, false)==8); 
} 


int bar(boolean cond1, boolean cond2, boolean cond3) { 
     int answer = 1; 
     if (cond1) { 
      answer = answer * a(); 
     } else { 
      answer = answer * b(); 
     } 

     if (cond2) { 
      answer = answer * c(); 
     } else { 
      answer = answer * d(); 
     } 

     if (cond3) { 
      answer = answer * c(); 
     } else { 
      answer = answer * d(); 
     } 
     return answer; 
} 

在上述示例中,有6个分支条件,都覆盖有仅两个测试。但是在整个函数中有8个代码路径。

没有任何工具可以绘制出每条可能的代码路径(相当肯定这样做会解决NP-complete问题。)当然,测试(非平凡)程序的所有可能输入是不现实的。使用代码覆盖是帮助确保您的程序经过充分测试的工具之一。

1

您需要区分分支覆盖和路径覆盖。您的函数bar有四个分支,即两个IF语句中的每一个的一个THEN和一个ELSE分支。而且,您的两个测试用例实际上涵盖了这四个分支。第一个测试涵盖了两个THEN分支,第二个测试覆盖了两个ELSE分支。这是所有分支机构的100%。

关于路径覆盖,您的代码示例有四条路径:a-c,a-d,b-c,b-d,其中只有a-c和b-d被覆盖。当你预期只有50%的覆盖率时,你可能有想法。

通常情况下,覆盖工具不处理路径覆盖:路径的数量很快就会爆炸,并且在工具需要将循环视为无限的情况下(除非特殊情况且只有覆盖工具会关心必要的静态分析以发现这些情况)。如果你关心的是你的测试套件的质量,我建议不要把你的注意力集中在代码覆盖率分析上,而且还要考虑设计/评估测试套件的其他可能性,例如需求覆盖率,等价性分区与边界案例分析,突变测试,...