105

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

线路覆盖率和分支覆盖率有什么区别?

4

3 回答 3

203

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

你为什么在乎?考虑这个例子:

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

如果您使用isCoolUserset to调用此方法true,您将获得 100% 的语句覆盖率。听起来不错?不,如果你用false. 但是,在第一种情况下,您有 50% 的分支覆盖率,因此您可以看到在您的测试中(通常是在您的代码中)缺少一些东西。

于 2011-11-22T15:56:24.020 回答
64

以这段代码为例:

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

如果您的测试只练习cond真实性并且从不运行else您拥有的分支:

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

当单击列标题时, Cobertura报告本身还引入了一些不错的弹出帮助工具提示:

Line Coverage - 此测试运行执行的行的百分比。

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

于 2011-11-22T15:27:29.297 回答
3
if(cond){
    //branch 1
}else{  
    //branch 2
}

您需要解决所有线路是分支 1 和分支 2,以获得 LineCoverage 和 BranchCoverage 的 100% 覆盖。

如果您完全错过其他任何内容,您将获得一半的分支覆盖率。如果您在 if 和 else 中都错过了 # of lines 中的任何内容,您将获得 100% 的 BranchCoverage 但不是 100% 的行覆盖率。

希望这可以帮助。

于 2013-04-19T18:19:22.180 回答