如何将MCDC用于相互依赖的条件?

时间:2017-09-17 12:06:40

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

在为以下表达式执行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测试用例的任何商业或免费工具?

4 个答案:

答案 0 :(得分:1)

在我看来,你可以认为(B,C,D)是一个以BC为例的大条件,并为表达式做了MCDC(A&& BC || E)

对于另一种方法,您可以查看本文

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

答案 1 :(得分:0)

这里的问题是条件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(无效,释放,未失败)
  • 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这样的第四种状态,则此条件是不必要的,可以删除。

答案 2 :(得分:0)

MCDC(修改后的条件决策覆盖率)的原始定义未考虑几种情况。其中之一是您遇到问题的原因。您有“耦合条件”。这就是说,相同的条件被多次使用。存在强耦合条件和弱耦合条件。例如:在布尔表达式中: “ ab + ac”变量“ a”以2个乘积项存在。按照原始定义,不可能找到能够满足唯一原因MCDC的测试对。

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

  1. 唯一原因(按照原始定义)
  2. 独特原因+掩盖
  3. 掩盖

什么是掩蔽?

遮罩将布尔歼灭者的属性考虑在内。意思是“ A和FALSE”-> FALSE和“ A或TRUE”-> TRUE。

因此,如果对布尔表达式求值,并且很早就清楚子项不能对结果有所贡献,那么就不需要求值。该子项被屏蔽。没关系。

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

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

如果我们对影响变量使用掩蔽,则将测试对MCDC属性称为“唯一原因+掩蔽”。如果我们允许所有屏蔽的变量都更改,那么我们将test-pair-MCDC属性称为“屏蔽”。

对于上面的示例“ 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

最终结果:


Testvector:推荐结果: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

如果您需要支持,请与我联系。

答案 3 :(得分:0)

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

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

但是,我猜 t_State_ub 似乎还有其他状态。所以它正在努力生成 mcdc 案例。

如果 t_State_ub 没有其他状态,则 (t_State_ub != HOLD) && (t_State_ub != RELEASE) && (t_State_ub != CAPTURE) 永远不会为 TRUE,因此逻辑是冗余的。