【发布时间】:2012-01-03 23:31:51
【问题描述】:
我将 Cobertura Maven 插件用于我的一个项目。但我对生成的报告有疑问:
线路覆盖率和分支覆盖率有什么区别?
【问题讨论】:
标签: maven testing cobertura test-coverage
我将 Cobertura Maven 插件用于我的一个项目。但我对生成的报告有疑问:
线路覆盖率和分支覆盖率有什么区别?
【问题讨论】:
标签: maven testing cobertura test-coverage
行覆盖率衡量您使用了多少语句(语句通常是一行代码,不包括 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% 的分支覆盖率,因此您可以看到在您的测试中(通常在您的代码中)缺少一些东西。
【讨论】:
以这段代码为例:
if(cond) {
line1();
line2();
line3();
line4();
} else {
line5();
}
如果您的测试仅验证 cond 是否为真,而从未运行您拥有的 else 分支:
Cobertura report 本身在单击列标题时引入了一些不错的弹出帮助工具提示:
线路覆盖率 - 此测试运行所执行的线路百分比。
分支覆盖率 - 此测试运行执行的分支的百分比。
【讨论】:
if(cond){
//branch 1
}else{
//branch 2
}
您需要解决所有线路是分支 1 和分支 2 以获得 LineCoverage 和 BranchCoverage 的 100% 覆盖。
如果您完全错过了 else 中的任何内容,您将获得一半的分支覆盖率。 如果您在 if 和 else 中错过了 # of 行中的任何内容,您将获得 100% 的 BranchCoverage,但不会获得 100% 的行覆盖率。
希望这会有所帮助。
【讨论】: