基本条件与复合条件覆盖范围



我正试图了解这两个覆盖标准之间的差异,但我无法弄清楚它们之间的差异。我想我没有完全理解什么是决策覆盖。我的软件测试教科书指出,复合决策覆盖可能代价高昂(n个基本条件下的2n组合)。

我本以为基本医疗保险会更贵。

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

那么,实际的区别是什么,以及所谓的"基本条件"是什么。在上面的例子中,a是一个基本条件吗?

谢谢。

关于术语,我手头没有一个使用确切术语"基本条件覆盖"one_answers"多条件覆盖"的单一来源。Binder的"面向对象系统测试"中提到了"条件覆盖"one_answers"多条件覆盖"。Everett&McLeod的"软件测试"中提到了"简单条件覆盖"one_answers"复合条件覆盖"。但我确信,在每种情况下,第一个术语是你的"基本条件保险",第二个术语是"复合条件保险"。我将在下面使用这些术语。

基本条件覆盖意味着程序中的每个基本条件在某些测试中为真,在某些测试中将为假,而与其他条件无关。在以下中

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

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

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

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

首先,决策条件之间的差异。

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

决策是具有零个或多个布尔运算符的条件的组合。没有运算符的决策也是一个条件。例如:(a or b) and c,但也有a and b或仅a

让我们举一个简单的例子

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

你需要两个测试来覆盖两个分支。这是决策覆盖分支覆盖本条件覆盖,这是单个条件的两个分支的覆盖。

decision可以分解为多个条件。

让我们以为例

decision = (a or b) and c

决策覆盖将通过实现

  • a、 b,c=0
  • a、 b,c=1

但其布尔子表达式的所有组合的排列是全条件覆盖多条件覆盖),这是-基本条件覆盖的复合:

| 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值无关紧要。

因此,你应该坐下来,动动脑筋,思考哪种组合的总体结果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)

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

关于术语,我在某个地方找不到"复合决策覆盖率"这个术语。在我看来,"复合决策"是条件的复合,换句话说:条件的复合。

最新更新