2

我有一个关于修改条件/决策覆盖率的问题,我无法弄清楚。

因此,如果我有表达式((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

但是当我用谷歌搜索它时,它也在集合中:{{F, T}, T} = T 我不同意,因为我在其他测试中单独测试了这个集合的部分,不是吗?

所以我似乎错过了第四个测试用例添加到集合中的内容,如果有人能解释为什么我必须拥有它会很棒?

4

3 回答 3

2

首先对MCDC做一点说明

要实现 MCDC,您需要为布尔表达式中满足 MCDC 标准的每个条件找到至少一个测试对。

目前,认证机构(例如 FAA)定义和批准的 MCDC 有 3 种类型

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

我希望,我可以对这个话题有所了解。我很高兴回答进一步的问题。

于 2019-05-05T15:32:49.030 回答
1

回想一下,对于 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 相比,A 翻转结果)
  • T4:(F,T,F)-> F(与第二个测试用例 T2 相比,C 翻转结果)

在具体的测试用例中,您不能有“-”/不关心值:您必须在运行系统时做出选择。

因此,您在答案中缺少的是一对两个测试用例(T1 和 T2),其中仅翻转第二个条件 B 也会翻转结果。

于 2019-01-16T21:14:42.040 回答
0

为了实现 MCDC,它需要在只有 1 个输入发生变化而其他输入保持不变时改变输出。例如在你的情况下

(A || B) 和 C 的 MCDC

图片

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

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

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

于 2020-04-09T12:34:29.150 回答