分支覆盖和线路覆盖一样有用吗?

Is branch coverage as useful as line coverage?

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

让我们以下面的例子为例:

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

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

在我看来,decisionA 和 decisionB 的值微不足道,几乎不值得测试。但是,现在我组织的全面要求意味着我必须编写 4 个测试用例而不是 2 个。引入多个 if 和嵌套 if,这会变得很复杂。

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

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

分支覆盖率比行覆盖率更有用,因为代码格式更改会改变行覆盖率指标的值。

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

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

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

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

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

首先,术语:您所描述的不是分支覆盖,而是

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

分支覆盖意味着测试通过每个分支执行所有路径,例如您示例中的 ifelse。在您的示例中,行和分支覆盖率都是通过两个测试实现的;如果没有 else 或一条线上有多个分支,则分支覆盖范围不同。分支覆盖比多(或基本)条件覆盖更容易实现,一些工具对其进行测量,并且为其设置标准而不是线覆盖是合理的。 Raedwald 的观点很好,尽管我通过禁止将决定隐藏在一行中的结构来解决它。