【问题标题】:Differences between Line and Branch coverageLine 和 Branch 覆盖之间的差异
【发布时间】:2012-01-03 23:31:51
【问题描述】:

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

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

【问题讨论】:

    标签: maven testing cobertura test-coverage


    【解决方案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% 的行覆盖率。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-25
      • 2017-03-09
      • 1970-01-01
      • 2012-10-09
      • 1970-01-01
      • 2012-04-07
      • 1970-01-01
      • 2023-02-13
      相关资源
      最近更新 更多