首页 文章

线和分支覆盖范围之间的差异

提问于
浏览
77

我使用Cobertura Maven插件进行我的一个项目 . 但我对生成的报告有疑问:

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

3 回答

  • 124

    行覆盖率衡量您采用的语句数量(语句通常是一行代码,不包括注释,条件等) . 分支覆盖率检查您是否为每个条件(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%的语句覆盖率 . 听起来不错? NOPE,如果用 false 调用,那么将会有一个空指针 . 但是,在第一种情况下,您有50%的分支覆盖率,因此您可以看到测试中缺少某些内容(通常在代码中) .

  • 1

    以此代码为简单示例:

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

    如果您的测试仅运行 cond 为真并且从未运行 else 分支,则您具有:

    • 涵盖5行中的4行

    • 涵盖2个分支中的1个

    此外,Cobertura report本身在单击列 Headers 时会引入一些不错的弹出式帮助工具提示:

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

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

    您需要解决所有行是分支1和分支2,以获得LineCoverage和BranchCoverage的100%覆盖率 .

    如果你完全没有错过任何其他内容,你将得到一半的分支覆盖率 . 如果你错过了if和else中的#行中的任何内容,你将获得100%但不是100%的行覆盖率的BranchCoverage .

    希望这可以帮助 .

相关问题