Line 和 Branch 覆盖之间的差异
Posted
技术标签:
【中文标题】Line 和 Branch 覆盖之间的差异【英文标题】:Differences between Line and Branch coverage 【发布时间】:2012-01-03 23:31:51 【问题描述】:我将 Cobertura Maven 插件用于我的一个项目。但我对生成的报告有疑问:
线路覆盖率和分支覆盖率有什么区别?
【问题讨论】:
【参考方案1】:行覆盖率衡量您使用了多少语句(语句通常是一行代码,不包括 cmets、条件等)。分支覆盖检查您是否为每个条件(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% 的分支覆盖率,因此您可以看到在您的测试中(通常在您的代码中)缺少一些东西。
【讨论】:
很好的答案!它显示了行覆盖率何时给人一种拥有良好代码的错误感觉! 由于线路覆盖或分支覆盖,您可能会遇到哪些错误?【参考方案2】:以这段代码为例:
if(cond)
line1();
line2();
line3();
line4();
else
line5();
如果您的测试仅验证 cond
是否为真,而从未运行您拥有的 else
分支:
Cobertura report 本身在单击列标题时引入了一些不错的弹出帮助工具提示:
线路覆盖率 - 此测试运行所执行的线路百分比。
分支覆盖率 - 此测试运行执行的分支的百分比。
【讨论】:
我希望写下这个答案,但你抢占了我(很多年)。明确的答案。谢谢。【参考方案3】:if(cond)
//branch 1
else
//branch 2
您需要解决所有线路是分支 1 和分支 2 以获得 LineCoverage 和 BranchCoverage 的 100% 覆盖。
如果您完全错过了 else 中的任何内容,您将获得一半的分支覆盖率。 如果您在 if 和 else 中错过了 # of 行中的任何内容,您将获得 100% 的 BranchCoverage,但不会获得 100% 的行覆盖率。
希望这会有所帮助。
【讨论】:
以上是关于Line 和 Branch 覆盖之间的差异的主要内容,如果未能解决你的问题,请参考以下文章
line,tiggke,fsm,condition,branch,assert coverage