【问题标题】:How to do MCDC for conditions that depend on each other?相互依赖的条件如何做MCDC?
【发布时间】:2017-09-17 12:06:40
【问题描述】:

我在为下面的表达式执行MCDC 时遇到了问题:

if( 
(t_Active_b == FALSE)
&& 
(
   (t_State_ub != HOLD) && 
   (t_State_ub != RELEASE) &&
   (t_State_ub != CAPTURE) 
)
||
t_signal_ub == FAILED
)

从表达式来看,我一共有5个条件

[ A && (B && C && D) || E]

正如 MCDC 要求的那样:“一个条件的变化导致输出的变化”,

这意味着如果 A 发生变化(t_Active_b 的值为 TRUE,然后是 FALSE)并且其他条件必须保持其状态,则输出会发生变化(从 TRUE 到 FALSE)

如何设计条件 B、C 和 D 的测试用例?

顺便问一下,您知道任何可以生成 MCDC 测试用例的商业或免费工具吗?

【问题讨论】:

    标签: unit-testing testing automated-tests testcase mc-dc


    【解决方案1】:

    MCDC(Modified Condition Decision Coverage)的原始定义没有考虑几种情况。其中之一是您的问题的原因。你有“耦合条件”。这意味着,相同的条件被多次使用。有强耦合条件和弱耦合条件。例如:在布尔表达式中: "ab+ac" 变量 "a" 存在于 2 个乘积项中。根据最初的定义,不可能找到满足唯一原因 MCDC 的测试对。

    这导致了很多问题,并且基本上导致了 3 种 MCDC 形式的新定义

    1. 唯一原因(根据原始定义)
    2. 独特的原因 + 掩蔽
    3. 屏蔽

    什么是屏蔽?

    Masking 考虑了布尔 Annihilator 的属性。意思是“A 和 FALSE”--> FALSE 和“A 或 TRUE”--> TRUE。

    因此,如果对布尔表达式求值,并且很早就清楚子项不能对结果做出贡献,则无需对其求值。子项被屏蔽。没关系。

    顺便说一下,同样的机制也用于布尔快捷评估。

    通过这种放松,您可以找到更多针对影响变量的测试对。 NASA 和 FAA 也将接受这些额外形式的 MCDC。

    如果我们对影响变量使用 Masking,那么我们将 test-pair-MCDC-property 称为“Unique Cause + Masking”。如果我们允许所有被屏蔽的变量发生变化,那么我们将 test-pair-MCDC-property 称为“Masking”。

    对于上述示例“ab+ac”,您可以找到以下测试对:

    Influencing Condition: 'a'  Pair:  1,  5   Unique Cause + Masking
    Influencing Condition: 'a'  Pair:  2,  6   Unique Cause + Masking
    Influencing Condition: 'a'  Pair:  3,  5   Masking
    Influencing Condition: 'a'  Pair:  3,  6   Masking
    Influencing Condition: 'b'  Pair:  4,  6   Unique Cause
    Influencing Condition: 'c'  Pair:  4,  5   Unique Cause
    

    (例如,5 是变量 abc 设置的十进制等值,在本例中为 101)。

    应用集合覆盖问题将导致 3 个可能的测试集

    -------- 覆盖集 1 ------------------------------------ ----------------

    Test Pair for Condition 'a':    1   5   (Unique Cause + Masking)
    Test Pair for Condition 'b':    4   6   (Unique Cause)
    Test Pair for Condition 'c':    4   5   (Unique Cause)
    

    结果测试向量:1 4 5 6

    -------- 覆盖集 2 ------------------------------------ ----------------

    Test Pair for Condition 'a':    2   6   (Unique Cause + Masking)
    Test Pair for Condition 'b':    4   6   (Unique Cause)
    Test Pair for Condition 'c':    4   5   (Unique Cause)
    

    结果测试向量:2 4 5 6

    -------- 覆盖集 3 ------------------------------------ ----------------

    Test Pair for Condition 'a':    1   5   (Unique Cause + Masking)
    Test Pair for Condition 'b':    4   6   (Unique Cause)
    Test Pair for Condition 'c':    4   5   (Unique Cause)
    

    结果测试向量:1 4 5 6

    最后的结果是:


    测试向量:推荐结果:1 4 5 6

    1:  a=0  b=0  c=1    (0)
    4:  a=1  b=0  c=0    (0)
    5:  a=1  b=0  c=1    (1)
    6:  a=1  b=1  c=0    (1)
    

    请注意:

    了解您需要使用 WhiteBox 视图查看布尔表达式非常重要。 MCDC 是一种结构覆盖率指标,因此您需要了解源代码。反正。在许多视频和解释中,人们开始从真值表 (BlackBox) 中解释 MCDC。这对于掩蔽或更复杂的表达式永远不起作用。在上面的示例中,您不会发现 3 和 5 是有效的 MCDC 测试对。这只能通过 WhiteBox 方法找到。

    我对问题进行了深入分析,并发布了一个查看测试用例的工具

    GitHub:MCDC

    如果您需要这方面的支持,请与我联系。

    【讨论】:

      【解决方案2】:

      在我看来,您可以将 ( B, C , D) 视为一个大条件,例如 BC 并为表达式 (A && BC || E) 执行 MCDC

      另一种方法,你可以看看这篇文章

      https://www.digitalobjectivo.com/mcdc-test-cases-generator/

      【讨论】:

      • 确实,这是有道理的。然后,您在我的回答中确实需要像 RUNNING 这样的第 4 个状态,才能使您的 BigCondition 为 false。
      • digitalobjectivo 的链接已损坏 :-(
      【解决方案3】:

      这里的问题是条件 B/C/D 不是独立的:如果你让其中一个为假,另外两个自动为真。

      因此,如果您想坚持布尔型 MC/DC,您需要一个“第四个”案例,这将使所有 B/C/D 都为真,例如第四个状态 t_State_ub == RUNNING

      测试用例会变成:

      • T1: (A,B,C,D,!E) -> T(非活动,正在运行,未失败)
      • T2: (A,!B,C,D,!E) -> F(非活动,保持,未失败)
      • T3: (A,B,!C,D,!E) -> F(非活动,RELEASE,未失败)
      • T4: (A,B,C,!D,!E) -> F(非活动,捕获,未失败)
      • T5: (!A,B,C,D,!E) -> F(活动,正在运行,未失败)
      • T6: (!A,B,C,D,E) -> T(活动、运行、失败)

      T2-T5在一个条件和结果上都与T1不同,T6在一个条件和结果上都与T5不同,满足MC/DC要求。

      请注意,条件 BCD 实际上是 !(ub == HOLD || ub == RELEASE || ub == CAPTURE)。如果没有RUNNING这样的第四个状态,这个条件是不必要的,可以去掉。

      【讨论】:

        【解决方案4】:

        在这种情况下,B/C/D 是耦合的,但不代表不能生成测试用例。这取决于t_State_ub 的定义。

        如果t_State_ub 只有HOLDRELEASECAPTURE这3种状态,那么就无法得到符合原mc/dc原理的B/C/D条件的测试用例(即唯一原因 MC/DC)。

        不过,我猜t_State_ub 似乎还有其他状态。所以它正在生成 mcdc 案例。

        如果t_State_ub 没有其他状态,(t_State_ub != HOLD) && (t_State_ub != RELEASE) && (t_State_ub != CAPTURE)永远不可能为TRUE,所以逻辑是冗余的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-04
          相关资源
          最近更新 更多