分支覆盖是否与线路覆盖一样有用?

时间:2016-05-11 17:08:59

标签: unit-testing code-coverage code-metrics

我的组织正在强调80%的线和分支覆盖率。我对线路覆盖要求完全没有问题,但分支覆盖范围给了我一个问题。

让我们采取以下案例:

if(decisionA && decisionB)
{
  // path A - do some complex ninja code stuff
}
else
{
  // path B - tell user i can't do anything
}

现在,我写了两个案例,第一个案例涉及路径A,第二个案例涉及路径B.这应该给我100%的行覆盖率。然而,这只给了我50%的分支覆盖率,因为我只覆盖(真和&真)+(假&& False)而省略(真&& False)+(False&&&真)。

从我的角度来看,decisionA和decisionB的值是微不足道的,几乎不值得测试。但是,我的组织中的一揽子要求现在意味着我必须编写4个测试用例而不是2个。带来多个if和嵌套if,这变得复杂。

对我而言,似乎开发人员决定是否选择覆盖分支机构,只要他认为重要的逻辑(在A部分中的忍者代码的情况下)被覆盖。< / p>

您对此有何看法?您认为可接受的分支机构覆盖率是多少?我对于强制执行高分支机构覆盖率是否合理,或者我是否不足以强调代码质量?我知道这是一个主观问题,但肯定已经建立了良好的模式。

2 个答案:

答案 0 :(得分:4)

分支覆盖率是一种比线覆盖范围更有用的指标,因为代码格式更改可能会改变行覆盖率指标的值。

考虑这两个代码片段,条件是条件始终为真:

 If (condition) {
    good();
 } else {
    bad();
 }

 If (condition) {good();} else {bad();}

两种情况的分支覆盖率均为50%。第二种情况的线覆盖率为100%,第一种情况较少。

使用行覆盖率作为指标可以鼓励开发人员对代码格式进行无用的更改,而不是通过添加更多测试用例来简化复杂逻辑和提高质量保证来提高质量。

答案 1 :(得分:4)

首先,术语:你所描述的不是分支覆盖,即"multiple condition coverage" or "compound condition coverage"

您绝对不希望为多个条件覆盖设置标准;获得太少的收益太多了。例如,如果您的条件是a & b & c & d & e,其中五个基本条件是布尔值,那么您需要编写32个测试,这是不合理的。拍摄基本条件覆盖更为合理:写一个测试,所有五个条件都是假的,然后一个测试,每个条件都是真的,总共六个。

分支覆盖率意味着测试会遍历每个分支的所有路径,例如您的示例中包含ifelse。在您的示例行中,分支覆盖率均通过两次测试实现;如果没有else或一行上有多个分支,则分支覆盖范围不同。分支覆盖比多个(或基本)条件覆盖更容易实现,一些工具测量它,并且为它设置标准而不是线覆盖是合理的。拉德瓦尔德的观点很好,尽管我通过禁止在单行中隐藏决策的结构来解决这个问题。