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 分支:

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

Cobertura report 本身在单击列标题时引入了一些不错的弹出帮助工具提示:

线路覆盖率 - 此测试运行所执行的线路百分比。

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

【讨论】:

我希望写下这个答案,但你抢占了我(很多年)。明确的答案。谢谢。【参考方案3】:
if(cond)
    //branch 1
else  
    //branch 2

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

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

希望这会有所帮助。

【讨论】:

以上是关于Line 和 Branch 覆盖之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

git 对比两个分支差异

line,tiggke,fsm,condition,branch,assert coverage

如何查看两个分支之间的差异?

分支和当前分支之间的git差异

“如何在 Line-plot 中显示两条线的数据点之间的差异值?”

Git修剪远程和本地分支