我有一种情况,我需要编写几个测试用例来完全覆盖代码。在一个特定的分支上,我遇到了以下情况 if((A && B && C) || D)
if((A && B && C) || D)
{
//perform task 1'
}
else
{
//perform task 2;
}
但是有了这个,我无法获得 MCDC 的测试用例组合..这里的出路是什么......
我有一种情况,我需要编写几个测试用例来完全覆盖代码。在一个特定的分支上,我遇到了以下情况 if((A && B && C) || D)
if((A && B && C) || D)
{
//perform task 1'
}
else
{
//perform task 2;
}
但是有了这个,我无法获得 MCDC 的测试用例组合..这里的出路是什么......
您的出路可能是使用工具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)
使用 MC/DC,您必须为每个条件 (输入) 找到i
一对仅i
切换且输出发生变化的组合。对, and need to be和needs to beA
的结果产生切换效果。同样,for to 具有切换效果,并且需要是,并且需要是。有了它有点不同:输出切换,因为至少有一个, ,是。这给出了以下组合(代表切换输入):(A && B && C) || D
B
C
true
D
false
B
A
C
true
D
false
D
D
A
B
C
false
x
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
我们得到(结果的行号和列相加):B
C
R
# 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
这是一种可能的解决方案。
我认为一种方法可能是 (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