白盒测试之条件组合覆盖(蓝桥课学习笔记)
实验介绍
使用分支-条件覆盖法设计白盒测试用例时可以使程序中所有判断语句中的条件取值为真、为假的情况和整个判断语句取真分支、假分支的情况都至少被执行过一次,但无法覆盖到所有路径,仍然会有一些逻辑运算等错误未被测试到。
条件组合覆盖又称为多条件覆盖,是指设计足够数据的测试用例,使每个判定语句中的所有判定条件的各种可能的组合都至少被执行一次。条件组合覆盖与分支-条件覆盖的不同之处在于:条件组合覆盖不是简单的要求每个条件为真、为假两种情况都至少被执行一次,而是要求让每个条件为真、为假情况所有可能的组合都至少被执行一次。例如,判断语句 if ( a == 0 or b > 2 ) 中有两个条件 a == 0 和 b > 2 ,使用条件组合覆盖法设计测试用例时,要求这两个条件的取真值和取假值的组合至少各执行一次,即 a == 0(真)与 b > 2 (真)、a == 0(真)与 b > 2 (假)、 a == 0(假)与 b > 2 (真)、 a == 0(假)与 b > 2 (假)这四种组合情况。
本实验主要通过实例介绍使用条件组合覆盖法设计白盒测试用例。
知识点
- 条件组合覆盖法设计白盒测试用例
实验内容
为了方便作比较,本实验仍然使用如下的代码作为测试对象:
public static int test(int a,int b,int c) {
1 int result = 0;
2 if(a == 0 or b > 2) {
3 result = b - a;
}
4 if(a > 0 and c > 0) {
5 result = c * a;
}
6 return result;
}
使用条件组合覆盖法设计白盒测试用例的具体步骤如下:
第 1 步:分析待测试代码,画出程序的流程图。上述代码的参考流程图如下图所示:
标识了路径的流程图如下:
第 2 步:分析流程图。
由流程图可知:这段代码中有两个判断语句,分别是上图中标识为 ② 和 ③ 的语句,语句 ② 中有两个条件语句,分别为 a == 0 和 b > 2 ;语句 ③ 中也有两个条件,分别为 a > 0 和 c > 0 。为了使后续的分析过程更加清晰明了,我们先将条件语句进行相应的标识,具体如下:
条件 | 取值 | 标识 |
---|---|---|
a == 0 | 真 | Y1 |
a == 0 | 假 | N1 |
b > 2 | 真 | Y2 |
b > 2 | 假 | N2 |
a > 0 | 真 | Y3 |
a > 0 | 假 | N3 |
c > 0 | 真 | Y4 |
c > 0 | 假 | N4 |
根据条件组合覆盖法的定义,我们需要设计一些测试用例分别使判断语句 ② 中两个条件的四种组合及判断语句 ③ 中两个条件的四种组合都至少执行一次,如下表所示:
组合编号 | 判断语句 | 条件组合 |
---|---|---|
1 | a == 0 or b > 2 | Y1 + Y2 |
2 | a == 0 or b > 2 | Y1 + N2 |
3 | a == 0 or b > 2 | N1 + Y2 |
4 | a == 0 or b > 2 | N1 + N2 |
5 | a > 0 and c > 0 | Y3 + Y4 |
6 | a > 0 and c > 0 | Y3 + N4 |
7 | a > 0 and c > 0 | N3 + Y4 |
8 | a > 0 and c > 0 | N3 + N4 |
第 3 步:使用条件组合覆盖法编写测试用例。
分别设计测试用例覆盖上表中的各种组合,具体如下:
测试用例编号 | 输入数据 | 预期结果 | 条件组合覆盖 | 条件覆盖 | 路径覆盖 |
---|---|---|---|---|---|
testcase_01 | a = 0 , b = 3 , c = 1 | result = 3 | 组合 1 、组合 7 | Y1、Y2、N3、Y4 | B - C |
testcase_02 | a = 0 , b = 1 , c = 0 | result = 1 | 组合 2 、组合 8 | Y1、N2、N3、N4 | B - C |
testcase_03 | a = 1 , b = 5 , c = 3 | result = 3 | 组合 3 、组合 5 | N1、Y2、Y3、Y4 | B - D |
testcase_04 | a = 2 , b = 0 , c = -1 | result = 1 | 组合 4 、组合 6 | N1、N2、Y3、N4 | A - C |
通过对上表的分析我们可以发现 :条件组合覆盖可以使程序判断断语句中的条件组合都至少被执行一次,但是,满足了条件组合覆盖也不能保证所有的路径都已经得到覆盖,在本例中,四个测试用例实现了条件组合的 100% 覆盖,但是仍有路径 A - D 未被覆盖到。如果要将路径全部覆盖,需要再增加一个覆盖路径 A - D 的测试用例,即使用条件组合 + 分支覆盖的全部测试用例如下:
测试用例编号 | 输入数据 | 预期结果 | 条件组合覆盖 | 条件覆盖 | 路径覆盖 |
---|---|---|---|---|---|
testcase_01 | a = 0 , b = 3 , c = 1 | result = 3 | 组合 1 、组合 7 | Y1、Y2、N3、Y4 | B - C |
testcase_02 | a = 0 , b = 1 , c = 0 | result = 1 | 组合 2 、组合 8 | Y1、N2、N3、N4 | B - C |
testcase_03 | a = 1 , b = 5 , c = 3 | result = 3 | 组合 3 、组合 5 | N1、Y2、Y3、Y4 | B - D |
testcase_04 | a = 2 , b = 0 , c = -1 | result = 0 | 组合 4 、组合 6 | N1、N2、Y3、N4 | A - C |
testcase_05 | a = 2 , b = 0 , c = 5 | result = 10 | 组合 4 、组合 5 | N1、N2、Y3、Y4 | A - D |
实验总结
条件组合覆盖可以使程序所有判断语句中的条件组合都被覆盖,但是仍然不能保证覆盖所有路径,需要再补充用例进行路径覆盖。另外,如果程序中的条件和分支比较多,需要设计的测试用例数量会很庞大。