改进条件 /判定范围 (MC/DC :ModifiedCondition/Decision Coverage):程序中的每个入口点和出口点至少被调用一次;判定中每个条件的所有取值至少出现一次;每个判定的所有可能结果至少出现一次;每个条件都能独立地影响判定的结果,即在其它所有条件不变的情况下改变该条件的值,使得判定结果改变。
不同的测试工具对于代码的覆盖能力也是不同的,通常能够支持修正条件判定覆盖的测试工具价格是极其昂贵的。
MC/DC对: 一个MC/DC对是一对真值向量, 这对真值向量使得判定语句有不同的结果, 但结果的不同仅仅是由于真值向量中一个条件值的变化; 同时, 这对真值向量又称为对偶真值向量。
由MC/DC对的定义, 可以看出, 符合MC/DC对的两组真值向量能够独立影响结果。即某个条件的 MC/DC对, 对于结果的影响来说, 该条件是惟一的。那么, 我们就可以穷举出一个判定中所有条件的真值组合, 通过两两对照因果, 从而确定出每个条件的MC/DC对。
l 最小测试用例集快速设计方法
考虑一个最简单的仅包含一个布尔操作符的布尔表达式“A and B”,其中 A和B 均为布尔变量,取值为{0, 1}。“A and B”完备的测试用例集见表 1。
表1 “A and B”完备测试用例集
用例组号 |
A |
B |
结果 |
1 |
1 |
1 |
1 |
2 |
0 |
1 |
0 |
3 |
1 |
0 |
0 |
4 |
0 |
0 |
0 |
考察表 1 中的第 1、2 组测试用例:条件A 的所有取值均出现一次;判定“A and B”的所有可能结果出现一次;条件A在条件B不变的情况下独立地影响判定的结果。
考察表 1 中的第 1、3 组测试用例:条件 B 的所有取值均出现一次;条件B在条件A不变的情况下独立地影响判定的结果。
综上分析可得出满足 MC/DC 准则的测试用例集(见表 2)。
表2 “A and B”满足MC/DC 测试用例集
用例组号 |
A |
B |
结果 |
1 |
1 |
1 |
1 |
2 |
0 |
1 |
0 |
3 |
1 |
0 |
0 |
布尔表达式“A or B”完备的测试用例集中的条件组合与“A and B”相同(参见表1)。参照上面的分析,可以得出满足 MC/DC 准则的测试用例集(见表 3)。
表 3 “A or B”满足MC/DC 测试用例集
用例组号 |
A |
B |
结果 |
1 |
1 |
0 |
1 |
2 |
0 |
0 |
0 |
3 |
0 |
1 |
1 |
已知对于具有 N 个条件的布尔表达式,其完备的测试用例有2N组。当N 的取值比较大时,若还是采取先列出完备的测试用例集,然后再选出适合 MC/DC 的组合的方法,则此方法不仅繁琐而且耗时。Chilenski研究发现,对于一个具有N个条件的布尔表达式,满足 MC/DC 准则的测试用例至少有N+1组。为此,将满足MC/DC 准则的N+1组测试用例集合称为最小测试用例集。下面给出一种最小测试用例集的快速设计方法。
针对一个相对复杂的布尔表达式,如“ ( A or B ) and (C or D )”,首先按照自左向右的顺序,分别列出布尔表达式中的每个条件。针对第一个条件 A,任取其一个可能值,比如 1,并让其直接作用到结果1。为此将B 设为0 (此处使用表3中“or”的测试用例设计思路),将( C or D )设为 1 (此处使用表2 中“and”的测试用例设计思路),再次使用表 3 中“or”的测试用例设计思路将条件C 和D设为(1, 0)或(0, 1),在此我们选用(1,0),至此完成第1 组测试用例的设计:
用例组号 |
A |
B |
C |
D |
结果 |
1 |
1 |
0 |
1 |
0 |
1 |
继续针对第一个条件 A,取其另一可能值 0,不改变其它所有条件的值,并且条件 A 直接作用到结果0。第2 组测试用例的设计如下:
用例组号 |
A |
B |
C |
D |
结果 |
1 |
1 |
0 |
1 |
0 |
1 |
2 |
0 |
0 |
1 |
0 |
0 |
完成条件 A 的所有取值后,针对第二个条件B,在前面已设计的测试用例中,选取条件 B 的取值直接作用到结果的测试用例作为参照对象(此处为第 2 组测试用例),改变条件 B 的取值1,同时保持其它所有条件的值不变,此时条件B的取值直接作用到结果1。第3 组测试用例的设计如下:
用例编号 |
A |
B |
C |
D |
结果 |
1 |
1 |
0 |
1 |
0 |
1 |
2 |
0 |
0 |
1 |
0 |
0 |
3 |
0 |
1 |
1 |
0 |
1 |
依照上述方法,设计出最小测试用例集如下:
用例编号 |
条件组合 |
判定结果 |
MC/DC对的对应编号 |
||||||
A |
B |
C |
D |
(A||B) && (C || D ) |
A |
B |
C |
D |
|
1 |
1 |
0 |
1 |
0 |
1 |
2 |
|
|
|
2 |
0 |
0 |
1 |
0 |
0 |
1 |
3 |
|
|
3 |
0 |
1 |
1 |
0 |
1 |
|
2 |
4 |
|
4 |
0 |
1 |
0 |
0 |
0 |
|
|
3 |
5 |
5 |
0 |
1 |
0 |
1 |
1 |
|
|
|
4 |
总结上面的方法得出如下结论:
(1)牢记关于“and”和“or”最简布尔表达式的测试用例,因为任何复杂的布尔表达式均可视为“and”和“or”最简布尔表达式的逻辑组合(如上述“( A or B ) and ( C or D )”可分解为“X and Y”,其中X = A or B,Y = C or D;
(2)针对第一个条件,设计其直接作用到结果的第1 组测试用例,在对其它条件取值的时候不断地使用关于“and”和“or”最简布尔表达式的测试用例设计思路;
(3)每个条件应取到所有可能的值;
(4)针对每个条件,在前面已经设计的测试用例中,选取该条件直接作用到结果的测试用例为参照对象,改变该条件的取值,同时保持其它所有条件的值不变;
(5)按照上述的思路设计出来的最小测试用例集不是唯一的,因为某些条件的第一次取值不是唯一的(如上述第 1 组用例中条件 A、C、D 的取值)。
if( A && (B||C) ) 的MC/DC覆盖的用例:
{ TTT, FTT, TTF, TFF }
给出下列布尔表达式的MC/DC最小测试用例集合:
1. (A||B) && (C&&D)
用例编号 |
条件组合 |
判定结果 |
MC/DC对的对应编号 |
||||||
A |
B |
C |
D |
(A||B) && (C&&D) |
A |
B |
C |
D |
|
1 |
1 |
0 |
1 |
0 |
0 |
2 |
|
|
|
2 |
0 |
0 |
1 |
0 |
0 |
1 |
3 |
|
|
3 |
0 |
1 |
1 |
0 |
0 |
|
2 |
4 |
|
4 |
0 |
1 |
1 |
1 |
1 |
|
|
3 |
5 |
5 |
0 |
1 |
0 |
1 |
0 |
|
|
|
4 |
2. (A and B) and (C or D)
用例编号 |
条件组合 |
判定结果 |
MC/DC对的对应编号 |
||||||
A |
B |
C |
D |
(A and B) and (C or D) |
A |
B |
C |
D |
|
1 |
1 |
0 |
1 |
0 |
0 |
2 |
|
|
|
2 |
1 |
0 |
0 |
0 |
0 |
1 |
3 |
|
|
3 |
1 |
0 |
0 |
1 |
0 |
|
2 |
4 |
|
4 |
1 |
1 |
0 |
1 |
1 |
|
|
3 |
5 |
5 |
0 |
1 |
0 |
1 |
0 |
|
|
|
4 |
3. (A&&B)||(C&&D)
用例编号 |
条件组合 |
判定结果 |
MC/DC对的对应编号 |
||||||
A |
B |
C |
D |
(A&&B)||(C&&D) |
A |
B |
C |
D |
|
1 |
1 |
0 |
1 |
0 |
0 |
2 |
|
|
|
2 |
1 |
0 |
1 |
1 |
1 |
1 |
3 |
|
|
3 |
1 |
0 |
0 |
1 |
0 |
|
2 |
4 |
|
4 |
1 |
1 |
0 |
1 |
1 |
|
|
3 |
5 |
5 |
0 |
1 |
0 |
1 |
0 |
|
|
|
4 |
4. A&&(B||C)
用例编号 |
条件组合 |
判定结果 |
MC/DC对的对应编号 |
||||
A |
B |
C |
A&&(B||C) |
A |
B |
C |
|
1 |
1 |
0 |
1 |
1 |
|
|
2 |
2 |
1 |
0 |
0 |
0 |
|
3 |
1 |
3 |
1 |
1 |
0 |
1 |
4 |
2 |
|
4 |
0 |
1 |
0 |
0 |
3 |
|
|
5. (A&&B)|(C&D&&E)
用例编号 |
条件组合 |
判定结果 |
MC/DC对的对应编号 |
|||||||||
A |
B |
C |
D |
E |
(A&&B)|(C&D&&E) |
A |
B |
C |
D |
E |
||
1 |
0 |
1 |
0 |
1 |
1 |
0 |
2 |
|
|
|
|
|
2 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
3 |
|
|
|
|
3 |
1 |
0 |
0 |
1 |
1 |
0 |
|
2 |
4 |
|
|
|
4 |
1 |
0 |
1 |
1 |
1 |
1 |
|
|
3 |
5 |
6 |
|
5 |
1 |
0 |
1 |
0 |
1 |
0 |
|
|
|
4 |
|
|
6 |
1 |
0 |
1 |
1 |
0 |
0 |
|
|
|
|
4 |
6. (A&&B&&C)||(D&&E&&F)
用例编号 |
条件组合 |
判定结果 |
MC/DC对的对应编号 |
|||||||||||
A |
B |
C |
D |
E |
F |
(A&&B&&C)||(D&&E&&F) |
A |
B |
C |
D |
E |
F |
||
1 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
2 |
|
|
|
|
|
|
2 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
3 |
4 |
|
|
|
|
3 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
|
2 |
|
|
|
|
|
4 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
|
|
2 |
5 |
|
|
|
5 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
|
|
|
4 |
6 |
7 |
|
6 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
|
|
|
|
5 |
|
|
7 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
|
|
|
|
|
5 |
7. (A&&B&&C)||(D&&(E||F)||G)
用例编号 |
条件组合 |
判定结果 |
MC/DC对的对应编号 |
||||||||||||
A |
B |
C |
D |
E |
F |
G |
(A&&B&&C)||(D&&(E||F)||G) |
A |
B |
C |
D |
E |
F |
G |
|
1 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
2 |
|
|
|
|
|
|
2 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
3 |
4 |
|
|
|
|
3 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
|
2 |
|
|
|
|
|
4 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
|
|
2 |
|
|
5 |
|
5 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
|
|
|
|
6 |
4 |
|
6 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
|
|
|
7 |
5 |
|
|
7 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
|
|
|
6 |
|
|
8 |
8 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
|
|
|
|
|
|
7 |