首先对MCDC做一点说明
要实现 MCDC,您需要为布尔表达式中满足 MCDC 标准的每个条件找到至少一个测试对。
目前,认证机构(例如 FAA)定义和批准的 MCDC 有 3 种类型
- “唯一原因”——MCDC(原始定义):只有一个,具体而言,影响条件可能会在测试对的两个测试值之间发生变化。结果决定,即布尔表达式的结果,对于测试对的 2 个测试值也必须不同。测试对中的所有其他条件必须固定不变。
- “掩蔽” – MCDC”:布尔表达式中只有一个对决策结果有影响的条件可能会改变。其他情况也可能发生变化,但必须被掩盖。蒙面意味着,在表达式中使用布尔逻辑,它们不会对结果产生影响。如果 AND 的左侧为 FALSE,则完整的右侧表达式和子表达式无关紧要。他们是蒙面的。掩蔽是对“独特原因”MCDC 的一种放松。
- “独特的原因+掩饰” - MCDC。这是一种混合,尤其适用于具有强耦合条件的布尔表达式,例如“ab+ac”。无法找到满足“唯一原因”的条件“a”的测试对 - MCDC。因此,我们可以放宽原始定义,并允许对强耦合条件进行屏蔽。
通过这两个附加定义,可以找到更多的测试对。
另外请注意,当使用具有布尔快捷评估策略的语言(如 Java、C、C++)时,还有更多满足 MCDC 标准的测试对。
非常重要的是要了解真值表上的黑盒视图不允许找到任何类型的掩蔽或布尔快捷方式评估。
MCDC 是一种结构覆盖率度量,因此布尔表达式上的 WhiteBox 视图是绝对必需的。
所以,现在换成你的表达方式:“(a+b)c”。具有布尔快捷评估的蛮力分析将为您提供以下 3 个条件 a、b、c 的测试对:
Influencing Condition: 'a' Pair: 0, 5 Unique Cause
Influencing Condition: 'a' Pair: 0, 7 Unique Cause
Influencing Condition: 'a' Pair: 1, 5 Unique Cause
Influencing Condition: 'a' Pair: 1, 7 Unique Cause
Influencing Condition: 'b' Pair: 0, 3 Unique Cause
Influencing Condition: 'b' Pair: 1, 3 Unique Cause
Influencing Condition: 'c' Pair: 2, 3 Unique Cause
Influencing Condition: 'c' Pair: 2, 5 Masking
Influencing Condition: 'c' Pair: 2, 7 Masking
Influencing Condition: 'c' Pair: 3, 4 Masking
Influencing Condition: 'c' Pair: 3, 6 Masking
Influencing Condition: 'c' Pair: 4, 5 Unique Cause
Influencing Condition: 'c' Pair: 4, 7 Unique Cause
Influencing Condition: 'c' Pair: 5, 6 Unique Cause
Influencing Condition: 'c' Pair: 6, 7 Unique Cause
如果没有白盒视图,您将永远找不到“唯一原因”——MCDC 测试对,例如条件“a”的 0,7。此外,您将找不到任何有效的“Masking” – MCDC” 测试对。
下一步是现在找到一个最小测试集。这可以通过应用“设置覆盖”或“单覆盖”算法来完成。从上面的测试对中,我们可以创建一个表格,显示哪个测试值涵盖了什么条件。在您的情况下,这如下所示:
0 1 2 3 4 5 6 7
a X X X X
b X X X
c X X X X X X
简单消除双列已经将表格减少到
0 1 2 3 4 5 6 7 0 3 5
a X - X - ==> a X X
b X - X b X X
c - X - X - - c X X
请注意:我们采用了一些启发式方法来选择应该删除哪些完全相同的列。所以有效地有更多的解决方案来解决集合覆盖问题。但是随着与条件数量相关的计算时间和内存消耗的几何增长,这是唯一有意义的方法。
现在我们将应用 Petrick 的方法并找出所有覆盖集:
1. 0, 3
2. 0, 5
3. 3, 5
这意味着,我们需要从上述测试对列表中选择 a、b、c 的测试对,其中包含解决方案 1、0 和 3,解决方案 2、0 和 5,以及解决方案 3 3 和 5
同样在这里,我们将应用一些启发式函数来提出最小解决方案:
-------- For Coverage set 1
Test Pair for Condition 'a': 0 5 (Unique Cause)
Test Pair for Condition 'b': 0 3 (Unique Cause)
Test Pair for Condition 'c': 2 3 (Unique Cause)
Resulting Test Vector: 0 2 3 5
-------- For Coverage set 2
Test Pair for Condition 'a': 0 5 (Unique Cause)
Test Pair for Condition 'b': 0 3 (Unique Cause)
Test Pair for Condition 'c': 5 6 (Unique Cause)
Resulting Test Vector: 0 3 5 6
-------- For Coverage set 3
Test Pair for Condition 'a': 1 5 (Unique Cause)
Test Pair for Condition 'b': 1 3 (Unique Cause)
Test Pair for Condition 'c': 5 6 (Unique Cause)
Resulting Test Vector: 1 3 5 6
---------------------------------------
Test vector: Recommended Result: 0 2 3 5
0: a=0 b=0 c=0 (0)
2: a=0 b=1 c=0 (0)
3: a=0 b=1 c=1 (1)
5: a=1 b=0 c=1 (1)
您会看到,对于所有 3 种可能的解决方案,您拥有 4 个覆盖所有条件并满足 MCDC 标准的测试用例。如果您查看互联网上的出版物,那么您会看到测试的最小数量是 n+1(n = 条件数)。这听起来不是一个伟大的成就。但是查看 MCC(多条件覆盖),您将有 2^n 个测试用例。因此,对于 8 个条件 256 个测试用例。MCDC 将只有 9 个。这是提出 MCDC 的原因之一。
我还创建了一个软件来帮助更好地了解 MCDC 覆盖范围。它使用布尔表达式作为输入,简化(如果您愿意)并计算所有 MCDC 测试对。
你可以在这里找到它:
MCDC
我希望,我可以对这个话题有所了解。我很高兴回答进一步的问题。