线和分支覆盖范围之间的差异

时间:2011-11-22 15:24:20

标签: maven testing cobertura test-coverage

我使用Cobertura Maven插件进行我的一个项目。但我对生成的报告有疑问:

线和分支覆盖范围有什么区别?

3 个答案:

答案 0 :(得分:128)

行覆盖率衡量您所采用的语句数量(语句通常是一行代码,不包括注释,条件等)。分支覆盖率检查您是否为每个条件(if,while,for)采用了true和false分支。你的分支数量是条件数的两倍。

为什么要关心?考虑一下这个例子:

public int getNameLength(boolean isCoolUser) {
    User user = null;
    if (isCoolUser) {
        user = new John(); 
    }
    return user.getName().length(); 
}

如果您将isCoolUser设置为true来调用此方法,则可获得100%的语句覆盖率。听起来不错? NOPE,如果你用false打电话,会有一个空指针。但是,在第一种情况下,您有50%的分支覆盖率,因此您可以看到测试中缺少某些内容(通常在代码中)。

答案 1 :(得分:54)

将此代码作为简化示例:

if(cond) {
    line1();
    line2();
    line3();
    line4();
} else {
    line5();
}

如果您的测试仅执行cond为真,并且永远不会运行else分支:

  • 涵盖5行中的4行
  • 涵盖2个分支中的1个

当点击列标题时,Cobertura report本身也会引入一些不错的弹出式帮助工具提示:

  

行覆盖率 - 此测试运行执行的行数百分比。

     

分支覆盖率 - 此测试运行执行的分支百分比。

答案 2 :(得分:2)

if(cond){
    //branch 1
}else{  
    //branch 2
}

您需要解决所有行是分支1和分支2才能获得LineCoverage和BranchCoverage的100%覆盖率。

如果你完全没有错过任何其他内容,你将获得一半的分支覆盖率。 如果您错过了if和else中的#行中的任何内容,那么您将获得100%的BranchCoverage,但不会获得100%的行覆盖率。

希望这有帮助。