我在一个项目中使用了 Cobertura Maven 插件,但是对于生成的报告我有一个问题:
行覆盖率和分支覆盖率的区别是什么?
以这段代码为例:
if(cond) { line1(); line2(); line3(); line4(); } else { line5(); }
如果你的测试只测试 cond为真,而从来没有运行过 else分支,那么你有:
cond
else
此外,Cobertura 报告本身在单击列标题时引入了一些不错的弹出式帮助提示:
Line Coverage -此测试运行执行的行的百分比。 Branch Coverage - The percent of branches executed by this test run.
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% 的分支覆盖率,因此您可以看到在您的测试中(并且通常在您的代码中)缺少了一些东西。
isCoolUser
true
false
if(cond){ //branch 1 }else{ //branch 2 }
您需要处理分支1和分支2的所有行,以获得 LineCoverage 和 Branch Coverage 的100% 覆盖率。
如果你错过了其他任何事情,你将得到一半的分行保险。 如果您在 If 和 else 中的 # of 行中遗漏了任何内容,那么您将获得100% 的 Branch Coverage,但不是100% 的 line Coverage。
希望这个能帮上忙。