线路和分支覆盖率的差异

我在一个项目中使用了 Cobertura Maven 插件,但是对于生成的报告我有一个问题:

行覆盖率和分支覆盖率的区别是什么?

69818 次浏览

以这段代码为例:

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

如果你的测试只测试 cond为真,而从来没有运行过 else分支,那么你有:

  • 5行中有4行已经写好了
  • 覆盖2个分支中的1个

此外,Cobertura 报告本身在单击列标题时引入了一些不错的弹出式帮助提示:

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

Branch Coverage - The percent of branches executed by this test run.

行覆盖率测量您执行了多少条语句(一条语句通常是一行代码,不包括注释、条件语句等)。分支覆盖检查是否为每个条件(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% 的语句覆盖率。听起来不错吧?不,如果用 false调用,将会有一个空指针。但是,在第一种情况下,您有50% 的分支覆盖率,因此您可以看到在您的测试中(并且通常在您的代码中)缺少了一些东西。

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

您需要处理分支1和分支2的所有行,以获得 LineCoverage 和 Branch Coverage 的100% 覆盖率。

如果你错过了其他任何事情,你将得到一半的分行保险。 如果您在 If 和 else 中的 # of 行中遗漏了任何内容,那么您将获得100% 的 Branch Coverage,但不是100% 的 line Coverage。

希望这个能帮上忙。