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

arv*_*man 5 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
}
Run Code Online (Sandbox Code Playgroud)

现在,我已经写了2个案例,第一个覆盖路径A,第二个覆盖路径B.这应该给我100%的线路覆盖率.但是,这只给了我50%的分支覆盖率,因为我只覆盖(True && True)+(False && False)而省略(True && False)+(False && True).

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

对我来说,似乎开发人员决定是否选择覆盖分支案例,只要他认为重要的逻辑(在A部分中的忍者代码的情况下)被覆盖.

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

Dav*_*uth 8

首先,术语:您描述的不是分支覆盖,而是“多重条件覆盖”或“复合条件覆盖”

你肯定不想为多条件覆盖设定一个标准;工作太多,收获却太少。例如,如果您的条件是a & b & c & d & e,其中五个基本条件都是布尔值,则您需要编写 32 个测试,这是不合理的。争取基本条件覆盖会更合理:编写一个所有五个条件都为假的测试,然后编写一个每个条件都为真的测试,总共六个。

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

  • 实际上,如果代码使用“逻辑”非短路运算符而不是“条件”运算符(“&&”),则像“a & b & ...”这样的表达式只需要进行大量测试即可覆盖。被短路。在实践中,程序员使用短路测试,需要的测试数量要少得多。例如,给定一个带有“a == false”的测试,我们不需要另一个带有“b == false”的测试来完全覆盖包含“a && b”的表达式。无法使用条件覆盖的真正原因很简单,就是现有的代码覆盖工具不支持它。 (3认同)

Rae*_*ald 5

分支覆盖是比线路覆盖更有用的度量,因为代码格式的变化会改变线路覆盖度量的值。

考虑这两个代码片段,对于条件始终为真的情况:

 If (condition) {
    good();
 } else {
    bad();
 }
Run Code Online (Sandbox Code Playgroud)

 If (condition) {good();} else {bad();}
Run Code Online (Sandbox Code Playgroud)

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

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