【问题标题】:Minimal set of test cases with modified condition/decision coverage具有修改的条件/决策覆盖率的最小测试用例集
【发布时间】:2015-05-29 23:11:42
【问题描述】:

我有一个关于修改后的条件/决策覆盖率的问题,我想不通。

因此,如果我有表达式 ((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 我不同意,因为我在其他测试中分别测试了这组的各个部分,不是吗?

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

【问题讨论】:

    标签: testing code-coverage mc-dc


    【解决方案1】:

    首先对MCDC做一点说明

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

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

    1. “唯一原因”- MCDC(原始定义):只有一个,具体而言,影响条件可能会在测试对的两个测试值之间发生变化。结果决定,即布尔表达式的结果,对于测试对的 2 个测试值也必须不同。测试对中的所有其他条件必须固定不变。
    2. “Masking” – 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

    我希望,我可以对这个话题有所了解。我很乐意回答更多问题。

    【讨论】:

    • 多么美妙的解释。我印象深刻。
    • 在三种可能的解决方案中,0235 或 0356 或 1356 更好
    • 基本上没关系。他们都会工作。您可以使用一些启发式方法进行选择。例如,最小设置位或清除位,或更改位的数量。但是,没有偏好。
    • 你消除了双列你用了什么逻辑?并根据您的点数选择对 1 。你告诉过 3 个变量中只有一个变量应该从真变为假,反之亦然,而且结果也需要改变。但是在第 0,5 对中,A 和 C 都发生了变化。您能否详细说明这一点。
    • 这在评论中很难解释。请谷歌“减少主要蕴涵表”
    【解决方案2】:

    回想一下,对于 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 也会翻转结果。

    【讨论】:

      【解决方案3】:

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

      用于 (A || B) 和 C 的 MCDC

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-09-13
        • 1970-01-01
        • 2018-08-06
        • 2019-06-11
        • 1970-01-01
        • 2021-10-23
        • 1970-01-01
        • 2018-10-18
        • 2017-04-09
        相关资源
        最近更新 更多