基本与复合条件覆盖范围

时间:2016-05-09 18:29:41

标签: testing code-coverage test-coverage

我试图了解这两个覆盖标准之间的差异,但我无法弄清楚它们之间的区别。我认为我未能准确理解决策的覆盖范围。我的软件测试教科书指出,复合决策覆盖范围可能很高(n n 组合用于n个基本条件)。

我原本以为基本条件覆盖率会更高。

考虑a && b && c && d && e。我的理解是,在基本条件覆盖中,这些原子变量中的每一个必须在测试用例中具有值TRUE和FALSE,以使测试用例具有基本条件充分性 - 即32个不同的测试用例。

那么实际差异是什么,以及什么被称为"基本条件"。在上面的示例中,a是基本条件吗?

感谢。

2 个答案:

答案 0 :(得分:1)

关于术语,我没有一个使用确切术语“基本条件覆盖”和“多条件覆盖”的单一来源。 Binder的“测试面向对象系统”表示“条件覆盖”和“多条件覆盖”。埃弗雷特& McLeod的“软件测试”称“简单条件覆盖”和“复合条件覆盖”。但我确信每种情况下的第一个术语是你的“基本条件覆盖”,第二个术语是你的“复合条件覆盖”。我将在下面使用这些条款。

基本条件覆盖率表示程序中的每个基本条件在某些测试中都为true,在某些测试中为false,与其他条件无关。在下面的

if a && b && c
  # do stuff
else
  # do other stuff
end

复合条件a && b && c有三个基本条件,abc。它只需要两个测试用例,一个是所有基本条件都为真,另一个是全误的,以获得完整的基本条件覆盖。基本条件恰好是复合条件的一部分并不重要。

请注意,基本条件覆盖率不是分支覆盖率。如果复合条件为a && b && !c,那么上述两个测试用例仍将实现基本条件覆盖,但不会实现分支覆盖。

针对基本条件覆盖的不太积极优化的测试用例集将有一个测试用例,其中所有三个基本条件都是假的,并且每个具有不同基本条件的三个测试用例都是真的。这仍然只是复合条件下八种可能的基本条件组合中的四种。我们忽略其他四种不舒服的感觉是为什么复合条件覆盖。这需要对复合条件下的每种可能的基本条件组合进行测试。在上面的示例中,您需要进行八次测试,每种测试针对abc的可能值的每种可能组合,以获得完整的复合条件覆盖率。

答案 1 :(得分:0)

首先,决策条件之间的区别。

Condition 是一个atomar布尔表达式,不能分解为更简单的布尔表达式。例如:a(如果a是布尔值)。

决策是具有零个或多个布尔运算符的条件的复合。没有操作员的决定也是一个条件。例如:(a or b) and c,还有a and ba

让我们举一个简单的例子

if(decision)  {
  //branch 1
} else {
  //branch 2
}

您需要两个测试来覆盖两个分支。那是决策覆盖分支覆盖。如果决定是条件(即仅a),那也称为基本条件覆盖,这是单个条件的两个分支的覆盖范围。

decision可以细分为条件。

让我们举个例子

decision = (a or b) and c

决策范围将通过

实现
  • a,b,c = 0
  • a,b,c = 1

但是布尔子表达式的所有组合的排列是完整条件覆盖多条件覆盖),它是 basic的复合体条件覆盖率

| a | b | c |
| 0 | 0 | 1 |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 1 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
| 1 | 1 | 0 |

这将是相当多的测试,但其中一些是多余的,因为其他人已经涵盖了一些条件。这反映在修改条件/决策覆盖(MC / DC)中,它是条件覆盖功能覆盖的组合。

对于MC / DC,要求每个条件必须独立地影响结果。通过上述测试(全部为0或全部为1),我们忽略了这样的事实:如果a和b为0,则c值无关紧要,或者,如果a和c为1,则b值无关紧要。 / p>

所以你应该坐下来,使用你的大脑,并考虑总体结果R为1或0的组合。

  | a | b | c | a or b | c | R |  eq
1 | 0 | 0 | 0 |    0   | 0 | 0 |  A
2 | 0 | 0 | 1 |    0   | 1 | 0 |  B
3 | 0 | 1 | 0 |    1   | 0 | 0 |  A
4 | 0 | 1 | 1 |    1   | 1 | 1 |  C
5 | 1 | 0 | 0 |    1   | 0 | 0 |  A
6 | 1 | 0 | 1 |    1   | 1 | 1 |  D
7 | 1 | 1 | 0 |    1   | 0 | 0 |  A
8 | 1 | 1 | 1 |    1   | 1 | 1 |  D

最后一列显示等价类:

  • A:c = 0,结果为0,a和b都没有影响
  • B:a,b = 0,结果为0,c无影响
  • C:b,c = 1,结果为1,a无影响
  • D:a,c = 1,结果为1,b无影响

对于B和C来说,选择哪一个是非常明显的,A和D不是这样。对于每个你必须检查,如果我替换运算符会发生什么,即或者>和,和 - >或者,这将如何影响(子)决定的结果。如果结果会受到影响,你会得到一个候选人 - 如果没有,你就没有。

  • A:(0和/或0)和/或0 - >没关系
  • A:(0和1)vs(0或1) - >确实很重要! - >候选
  • A:(1和0)vs(1或0) - >确实很重要! - >候选
  • A:(1和/或1) - >没关系
  • D:(1和0)vs(1或0) - >重要 - >候选
  • D:(1和1) - >没关系

所以你得到了如上所述的最终测试集:

  • a = 0,b = 1,c = 0 - >假分支(A)或a = 1,b = 0,c = 0
  • a = 0,b = 0,c = 1 - >假分支(B)
  • a = 0,b = 1,c = 1 - >真分支(C)
  • a = 1,b = 0,c = 1 - >真分支(D)

特别是后一个测试 - 更改运算符 - 可以使用突变测试等工具来完成,这些工具不仅可以重放运算符,还可以完成更多工作,即翻转操作数,删除语句,更改执行顺序,替换返回值等等。对于代码的每次更改,它都会验证测试是否确实失败。这是测试套件质量的良好指标,并确保代码不仅仅被覆盖,但您对代码的测试实际上是有效的。

关于术语,我在某处找不到“复合决策覆盖”一词。在我看来,“复合决定”将是条件化合物的复合物,换句话说:条件的复合物。