覆盖率已修改 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)定义和批准

  1. "Unique Cause" – MCDC(原定义):只有一个,具体影响条件可能在测试对的两个测试值之间发生变化。布尔表达式的结果决定对于测试对的 2 个测试值也必须不同。测试对中的所有其他条件必须固定不变。
  2. "Masking" – MCDC”:布尔表达式中只有一个条件对决策结果有影响,可能会发生变化。其他条件也可能发生变化,但必须屏蔽。屏蔽意味着在表达式中使用布尔逻辑,它们不会对结果产生影响。如果 AND 的左侧为 FALSE,则完整的右侧表达式和子表达式无关紧要。他们被蒙面了。掩蔽是对“独特原因”MCDC的一种放松。
  3. "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

我希望,我可以阐明这个话题。我很乐意回答更多问题。

要实现 MCDC,需要在仅 1 个输入发生变化而其他输入保持不变时输出发生变化。例如你的情况

MCDC for (A || B) & C

因此,当 A 从 1 变为 0 时,B 和 C 保持不变,而输出从 1 变为 0。同样适用于 B 和 C。

通常他们说实现 MCDC 的最少步骤数是输入数 + 输出数。

因此,在您的情况下,MCDC 至少可以通过 4 个步骤实现。