2

我有一种情况,我需要编写几个测试用例来完全覆盖代码。在一个特定的分支上,我遇到了以下情况 if((A && B && C) || D)

if((A && B && C) || D)
{
  //perform task 1'
}
else
{
  //perform task 2;
}

但是有了这个,我无法获得 MCDC 的测试用例组合..这里的出路是什么......

4

3 回答 3

3

您的出路可能是使用工具MCDC 来识别可能的测试用例。

由于许多可能的测试对组合,手动执行此操作可能确实需要大量工作。

很抱歉,我无法分享我研究的所有细节。我建议先阅读 FAA (DOT/FAA/AR-01/18) 出版的“对三种形式的修正条件决策覆盖 (MCDC) 标准的调查”。

包括掩蔽,有 52 个可能的测试对。如果您进行适当的白盒分析,包括布尔快捷评估,那么您甚至会发现 63 个 MCDC 测试对。应用集合覆盖算法将产生 3 个可能的最小测试集。

做一些启发式方法将导致可能令人惊讶的测试向量:

 Test Pair for Condition 'a':    0  14   (Unique Cause)
 Test Pair for Condition 'b':    8  14   (Unique Cause)
 Test Pair for Condition 'c':   12  14   (Unique Cause)
 Test Pair for Condition 'd':    0   1   (Unique Cause)

测试向量:推荐结果:0 1 8 12 14

0:   a=0  b=0  c=0  d=0    (0)
1:   a=0  b=0  c=0  d=1    (1)
8:   a=1  b=0  c=0  d=0    (0)
12:  a=1  b=1  c=0  d=0    (0)
14:  a=1  b=1  c=1  d=0    (1)
于 2019-05-04T09:56:21.917 回答
2

使用 MC/DC,您必须为每个条件 (输入) 找到i一对仅i切换且输出发生变化的组合。对, and need to be和needs to beA的结果产生切换效果。同样,for to 具有切换效果,并且需要是,并且需要是。有了它有点不同:输出切换,因为至少有一个, ,是。这给出了以下组合(代表切换输入):(A && B && C) || DBCtrueDfalseBACtrueDfalseDDABCfalsex

A B C D
x 1 1 0 - for A
1 x 1 0 - for B
1 1 x 0 - for C
q r s x - for D, where q + r + s < 3

通过将 、 和 的行相乘,A我们得到(结果的行号和列相加):BCR

#  A B C D  R
1  0 1 1 0  0 - for A
2  1 1 1 0  1 - for A
3  1 0 1 0  0 - for B
4  1 1 1 0  1 - for B (duplicate)
5  1 1 0 0  0 - for C
6  1 1 1 0  1 - for C (duplicate)
7  q r s x    - for D, where q + r + s < 3

第 4 行和第 6 行是第 2 行的副本。为了表示第 7 行,我们可以使用第 1、3、5 行之一,并将同一行D设置为 1,得到以下结果(选择第 1 行):

#  A B C D  R
1  0 1 1 0  0 - for A and D
2  1 1 1 0  1 - for A,B,C
3  1 0 1 0  0 - for B
4  1 1 0 0  0 - for C
5  0 1 1 1  1 - for D

这是一种可能的解决方案。

于 2018-11-22T17:08:19.833 回答
-1

我认为一种方法可能是 (A && B && C) 的所有错误组合保持 D = 1,而 (A && B && C) 的真实组合保持 D = 0,最后保持所有输入 0。所以测试案例组合可以是:

a b c d
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0
0 0 0 0
于 2016-06-07T08:24:27.040 回答