【问题标题】:Unconditional branching and code coverage无条件分支和代码覆盖
【发布时间】:2016-05-05 17:31:44
【问题描述】:

所以我了解到分支覆盖与决策覆盖不同,因为分支覆盖通常还包括无条件分支,例如方法调用,在 C# 中使用 throw、break 和其他关键字。 但我想知道,这种分支覆盖是否真的用在代码分析器中?我怀疑他们使用决策覆盖,确保所有决策结果(即结果分支)都被覆盖。 我的意思是,以下代码有 2 个条件分支,但有 5 个无条件分支:

if(A)
  B();
  C();
  D();
  E();
else
 X();

而且我相信,如果我编写一个测试来评估 A 为假,代码分析器会告诉我分支覆盖率为 50%。但从无条件分支的角度来看,将不会执行更多。 对吗?

【问题讨论】:

  • 这真的取决于分析仪。 dotCover 将识别测试命中的代码行,因此可用于确定是否将执行所有可能的代码行。
  • @drz:OP 没有询问 line 的覆盖范围。他询问了分支与决策覆盖率。

标签: branch code-coverage code-analysis control-flow


【解决方案1】:

分支覆盖不会告诉您某个决定是否已被测试为真假。

例子:

 if (c) {
    x=...
 }
 y=...

如果 c 的计算结果为 TRUE,则执行包含 x=... 的块,并且 分支覆盖将检测到这一点。它还将检测到从 y 开始的代码已被执行。因此,如果 C 为真,您将获得 100% 的覆盖率,而不知道如果 C 为假会发生什么。

使用决策覆盖率,如果覆盖率为 100%,您将知道 C 已被评估并产生 TRUE 和 FALSE。

如果你的条件 if 有一个 then 块一个 else 块,那么分支覆盖和决策覆盖将为你提供相同的信息。

【讨论】:

  • 是的,我相信是的。但是我不知道为什么几乎所有的书(查看谷歌书籍)都说分支覆盖与决策覆盖是一回事。
  • 但是我不确定这个例子——我认为 if 实际上是一个分支点并且分支覆盖确实检测到另一个分支没有运行——从控制流图中很明显。跨度>
  • 想象一下我有一个语句 bool z = ( i > j) ;可以说没有分支。 (x86 机器码是 mov r1,i; cmp r1, j; setle r1; mov z, r1... no branch)。但显然有一个决定。
  • 是的,我认为这就是 DO-178B 认为决策覆盖范围更强的原因。据他们说,它也应该处理布尔赋值。但大多数其他定义不接受这一点。
  • 如果决策覆盖和分支覆盖相同,DO-178B 不能认为其中一个比另一个强:-} 是的,这是定义问题,但在一般情况下覆盖> > 决策覆盖率 >> 分支覆盖率。大约有 150 种“代码覆盖率”定义,其中这 3 种往往是最常见的。实际上,人们很难达到 80% 的分支覆盖率。将目标放低以便实现目标可能不是一个糟糕的起点。
猜你喜欢
  • 2012-01-11
  • 2021-03-28
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
相关资源
最近更新 更多