覆盖率已修改 condition/decision 的最小测试用例集
Minimal set of test cases with modified condition/decision coverage
我有一个关于修改后的 condition/decision 覆盖范围的问题,但我无法弄清楚。
因此,如果我有表达式 ((A || B) && C)
并且任务的测试用例数量最少,则接收 100% MD/DC。
我将其分为两部分,其中 (A || B)
和 (X && C)
的测试用例数量最少。
(A || B) : {F, F} = F, {F, T} = T, {T, -} = T
(X && C) : {F, -} = F, {T, F} = F, {T, T} = T
“-”表示它们是哪个值并不重要,因为它们不会被编译器计算。
因此,当我将这些组合起来时,我将其作为我的最小测试用例集:
((A || B) && C) : {{F, F}, -} = F, {{F, T}, F} = F, {{T, -}, T} = T
但是当我 google 它也在集合中:{{F, T}, T} = T
我不同意这一点,因为我在其他测试中单独测试了这组的部分,不是吗?
所以我似乎错过了第四个测试用例添加到集合中的内容,如果有人能解释为什么我必须拥有它就太好了?
回想一下,对于 MC/DC,您需要针对每个条件 P(在您的情况下为 A/B/C)两个测试用例 T 和 T',以便 P 在 T 中为真,在 T' 中为假,并且这样谓词的结果在一个测试用例中为真,在另一个测试用例中为假。
((A || B) && C) 的 MC/DC 封面是:
- T1: (F, F, T) -> F(你的第一个测试用例)
- T2: (F, T, T) -> T(与 T1 相比,B 反转结果,缺失)
- T3: (T, F, T) -> T(与第三个测试用例 T1 相比结果翻转)
- T4: (F, T, F) -> F(与第二个测试用例 T2 相比,C 反转结果)
在具体的测试用例中,你不能有“-”/无关值:你必须在运行系统时做出选择。
所以你的答案中缺少的是一对两个测试用例(T1 和 T2),其中仅翻转第二个条件 B 也会翻转结果。
首先对MCDC做一点说明
要实现 MCDC,您需要为满足 MCDC 标准的布尔表达式中的每个条件找到至少一个测试对。
目前有 3 种类型的 MCDC 被认证机构(例如 FAA)定义和批准
- "Unique Cause" – MCDC(原定义):只有一个,具体影响条件可能在测试对的两个测试值之间发生变化。布尔表达式的结果决定对于测试对的 2 个测试值也必须不同。测试对中的所有其他条件必须固定不变。
- "Masking" – MCDC”:布尔表达式中只有一个条件对决策结果有影响,可能会发生变化。其他条件也可能发生变化,但必须屏蔽。屏蔽意味着在表达式中使用布尔逻辑,它们不会对结果产生影响。如果 AND 的左侧为 FALSE,则完整的右侧表达式和子表达式无关紧要。他们被蒙面了。掩蔽是对“独特原因”MCDC的一种放松。
- "Unique Cause + Masking" – MCDC。这是一个混合体,尤其适用于具有强耦合条件的布尔表达式,例如“ab+ac”。不可能找到满足 "Unique Cause" – MCDC 的条件“a”的测试对。所以,我们可以放宽原来的定义,允许屏蔽强耦合条件。
有了这 2 个附加定义,可以找到更多的测试对。
另外请注意,当使用具有布尔快捷方式评估策略的语言(如 Java、C、C++)时,有更多的测试对满足 MCDC 标准。
非常重要的是要了解关于真相的 BlackBox 视图 table 不允许找到任何类型的 Masking 或布尔快捷方式评估。
MCDC 是一个结构覆盖率指标,因此布尔表达式上的 WhiteBox View 绝对是强制性的。
那么,现在你的表达方式是:“(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
没有白框视图,您将永远找不到“唯一原因”——条件“a”的 MCDC 测试对,例如 0,7。此外,您将找不到任何有效的 "Masking" – MCDC” 测试对。
下一步是找到一个最小测试集。这可以通过应用“set cover”或“unate covering”算法来完成。从上面的测试对我们可以创建一个 table 来显示哪个测试值涵盖什么条件。在您的情况下,这看起来像以下内容:
0 1 2 3 4 5 6 7
a X X X X
b X X X
c X X X X X X
简单消除双列已经将 table 减少到
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
请注意:我们对 select 采用了一些启发式方法,应该删除哪些完全相同的列。因此有效地有更多解决集合覆盖问题的方法。但是随着条件数量的增加,计算时间和内存消耗呈几何级数增长,这是唯一有意义的方法。
现在我们将应用 Petrick 的方法并找出所有覆盖集:
1. 0, 3
2. 0, 5
3. 3, 5
这意味着,我们需要 select,从上面的测试对列表中,测试对 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 标准。如果您查看 Internet 上的出版物,那么您会看到最小测试次数为 n+1(n = 条件数)。这听起来不像是一个了不起的成就。但是看看 MCC(多条件覆盖率),您将有 2^n 个测试用例。因此,对于 8 个条件 256 个测试用例。对于 MCDC,只有 9 个。这是提出 MCDC 的原因之一。
我还创建了一个软件来帮助更好地了解 MCDC 的报道。它使用布尔表达式作为输入,对其进行简化(如果您愿意)并计算所有 MCDC 测试对。
您可以在这里找到:
我希望,我可以阐明这个话题。我很乐意回答更多问题。
要实现 MCDC,需要在仅 1 个输入发生变化而其他输入保持不变时输出发生变化。例如你的情况
MCDC for (A || B) & C
因此,当 A 从 1 变为 0 时,B 和 C 保持不变,而输出从 1 变为 0。同样适用于 B 和 C。
通常他们说实现 MCDC 的最少步骤数是输入数 + 输出数。
因此,在您的情况下,MCDC 至少可以通过 4 个步骤实现。
我有一个关于修改后的 condition/decision 覆盖范围的问题,但我无法弄清楚。
因此,如果我有表达式 ((A || B) && C)
并且任务的测试用例数量最少,则接收 100% MD/DC。
我将其分为两部分,其中 (A || B)
和 (X && C)
的测试用例数量最少。
(A || B) : {F, F} = F, {F, T} = T, {T, -} = T
(X && C) : {F, -} = F, {T, F} = F, {T, T} = T
“-”表示它们是哪个值并不重要,因为它们不会被编译器计算。
因此,当我将这些组合起来时,我将其作为我的最小测试用例集:
((A || B) && C) : {{F, F}, -} = F, {{F, T}, F} = F, {{T, -}, T} = T
但是当我 google 它也在集合中:{{F, T}, T} = T
我不同意这一点,因为我在其他测试中单独测试了这组的部分,不是吗?
所以我似乎错过了第四个测试用例添加到集合中的内容,如果有人能解释为什么我必须拥有它就太好了?
回想一下,对于 MC/DC,您需要针对每个条件 P(在您的情况下为 A/B/C)两个测试用例 T 和 T',以便 P 在 T 中为真,在 T' 中为假,并且这样谓词的结果在一个测试用例中为真,在另一个测试用例中为假。
((A || B) && C) 的 MC/DC 封面是:
- T1: (F, F, T) -> F(你的第一个测试用例)
- T2: (F, T, T) -> T(与 T1 相比,B 反转结果,缺失)
- T3: (T, F, T) -> T(与第三个测试用例 T1 相比结果翻转)
- T4: (F, T, F) -> F(与第二个测试用例 T2 相比,C 反转结果)
在具体的测试用例中,你不能有“-”/无关值:你必须在运行系统时做出选择。
所以你的答案中缺少的是一对两个测试用例(T1 和 T2),其中仅翻转第二个条件 B 也会翻转结果。
首先对MCDC做一点说明
要实现 MCDC,您需要为满足 MCDC 标准的布尔表达式中的每个条件找到至少一个测试对。
目前有 3 种类型的 MCDC 被认证机构(例如 FAA)定义和批准
- "Unique Cause" – MCDC(原定义):只有一个,具体影响条件可能在测试对的两个测试值之间发生变化。布尔表达式的结果决定对于测试对的 2 个测试值也必须不同。测试对中的所有其他条件必须固定不变。
- "Masking" – MCDC”:布尔表达式中只有一个条件对决策结果有影响,可能会发生变化。其他条件也可能发生变化,但必须屏蔽。屏蔽意味着在表达式中使用布尔逻辑,它们不会对结果产生影响。如果 AND 的左侧为 FALSE,则完整的右侧表达式和子表达式无关紧要。他们被蒙面了。掩蔽是对“独特原因”MCDC的一种放松。
- "Unique Cause + Masking" – MCDC。这是一个混合体,尤其适用于具有强耦合条件的布尔表达式,例如“ab+ac”。不可能找到满足 "Unique Cause" – MCDC 的条件“a”的测试对。所以,我们可以放宽原来的定义,允许屏蔽强耦合条件。
有了这 2 个附加定义,可以找到更多的测试对。
另外请注意,当使用具有布尔快捷方式评估策略的语言(如 Java、C、C++)时,有更多的测试对满足 MCDC 标准。
非常重要的是要了解关于真相的 BlackBox 视图 table 不允许找到任何类型的 Masking 或布尔快捷方式评估。
MCDC 是一个结构覆盖率指标,因此布尔表达式上的 WhiteBox View 绝对是强制性的。
那么,现在你的表达方式是:“(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
没有白框视图,您将永远找不到“唯一原因”——条件“a”的 MCDC 测试对,例如 0,7。此外,您将找不到任何有效的 "Masking" – MCDC” 测试对。
下一步是找到一个最小测试集。这可以通过应用“set cover”或“unate covering”算法来完成。从上面的测试对我们可以创建一个 table 来显示哪个测试值涵盖什么条件。在您的情况下,这看起来像以下内容:
0 1 2 3 4 5 6 7
a X X X X
b X X X
c X X X X X X
简单消除双列已经将 table 减少到
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
请注意:我们对 select 采用了一些启发式方法,应该删除哪些完全相同的列。因此有效地有更多解决集合覆盖问题的方法。但是随着条件数量的增加,计算时间和内存消耗呈几何级数增长,这是唯一有意义的方法。
现在我们将应用 Petrick 的方法并找出所有覆盖集:
1. 0, 3
2. 0, 5
3. 3, 5
这意味着,我们需要 select,从上面的测试对列表中,测试对 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 标准。如果您查看 Internet 上的出版物,那么您会看到最小测试次数为 n+1(n = 条件数)。这听起来不像是一个了不起的成就。但是看看 MCC(多条件覆盖率),您将有 2^n 个测试用例。因此,对于 8 个条件 256 个测试用例。对于 MCDC,只有 9 个。这是提出 MCDC 的原因之一。
我还创建了一个软件来帮助更好地了解 MCDC 的报道。它使用布尔表达式作为输入,对其进行简化(如果您愿意)并计算所有 MCDC 测试对。
您可以在这里找到:
我希望,我可以阐明这个话题。我很乐意回答更多问题。
要实现 MCDC,需要在仅 1 个输入发生变化而其他输入保持不变时输出发生变化。例如你的情况
MCDC for (A || B) & C
因此,当 A 从 1 变为 0 时,B 和 C 保持不变,而输出从 1 变为 0。同样适用于 B 和 C。
通常他们说实现 MCDC 的最少步骤数是输入数 + 输出数。
因此,在您的情况下,MCDC 至少可以通过 4 个步骤实现。