有一个函数如下:
1 public static void SortNum(int numA, int numB) 2 { 3 int x = 0; 4 int y = 0; 5 while (numA--> 0) 6 { 7 if (numB == 0) 8 x = y +2; 9 else 10 if (numB == 1) 11 x = y + 10; 12 else 13 x = y +20; 14 } 15 }
下面先画出程序控制流图
根据以上的控制流图,可以计算出以下路径:
路径1:5-7-8-14-5-15
路径2:5-10-11-14-5-15
路径3:5-13-14-5-15
路径4:5-15
导出测试用例:
下面使用语句覆盖测试:
通过路径 | 输入数据 | 预期结果 | 测试结果 | |
case1 | 5-7-8-14-5-15 | numA=2,numB=0 | X=2 | X=2 |
case2 | 5-10-11-14-5-15 | numA=2,numB=1 | X=10 | X=10 |
case3 | 5-13-14-5-15 | numA=2,numB=3 | X=20 | X=20 |
case4 | 5-15 | numA=0,numB=1 | X=0 | X=0 |
二、下面来做一道面试题目
使用基本路径测试方法,为以下程序段设计测试用例。
1 public static void DoSomething(int X, int A, int B)
2 {
3 if ((A > 1) && (B == 0))
4 X = X / A;
5 if ((A == 1) && (X > 1))
6 X = X + 1;
7 }
(1) 画出程序的控制流图
(2) 导出基本路径集,确定程序的独立路径,并设计测试用例,写出的输入数据和预期输出
(1)答:
(2)答:使用白盒测试的路径测试方法:
A.语句覆盖进行测试用例的设计:
通过路径 | 输入数据 | 预期结果 | 测试结果 | |
case1 | 3-4-5 | X=10, A=2, B=0 | X=5 | X=5 |
case2 | 5-6-7 | X=10, A=1, B=0 | X=11 | X=11 |
B.判定覆盖进行测试用例的设计:特点:条件中只要有一个真一个假,就完成了判定覆盖;
比如需要设计:
- case1的时候需要让条件1:if ((A > 1) && (B == 0))条件真的
- case2的时候需要让条件2:if ((A == 1) && (X > 1))条件真的
- case3的时候需要让条件1:if ((A > 1) && (B == 0))条件假的,并且需要让条件2:if ((A == 1) && (X > 1))条件假的
通过路径 | 输入数据 | 预期结果 | 测试结果 | |
case1 | 3-4-5 | X=10, A=2, B=0 | X=5 | X=5 |
case2 | 5-6-7 | X=10, A=1, B=0 | X=11 | X=11 |
case3 | T-7 | X=10, A=2, B=3 | X=10 | X=10 |
C.条件覆盖进行测试用例的设计:特点是必须考虑到IF分支里面的各个条件的真/假
比如需要设计:
- case1的时候需要让条件1:if ((A > 1) && (B == 0))条件里面的值全真的
- case2的时候需要让条件2:if ((A == 1) && (X > 1))条件里面的值全真的,并且需要让条件1:if ((A > 1) && (B == 0))条件里面的值全假的
- case3的时候需要让条件1:if ((A > 1) && (B == 0))条件里面的值全假的,并且需要让条件2:if ((A == 1) && (X > 1))条件里面的值全假的
通过路径 | 输入数据 | 预期结果 | 测试结果 | |
case1 | 3-4-5 | X=10, A=2, B=0 | X=5 | X=5 |
case2 | 5-6-7 | X=10, A=1, B=2 | X=11 | X=11 |
case3 | T-7 | X=-1, A=-1, B=2 | X=-1 | X=-1 |
D.判定/条件覆盖进行测试用例的设计:特点是必须考虑到IF分支里面的各个条件的真/假,并且每个分支的真和假都要出现一次
比如需要设计:
- case1的时候需要让条件1:if ((A > 1) && (B == 0))条件为真;需要让条件2:if ((A == 1) && (X > 1))条件为假
- case2的时候需要让条件1:if ((A > 1) && (B == 0))条件为假;需要让条件2:if ((A == 1) && (X > 1))条件为假
- case3的时候需要让条件2:if ((A == 1) && (X > 1))条件为真;需要让条件1:if ((A > 1) && (B == 0))条件为假
- case4的时候需要让条件2:if ((A == 1) && (X > 1))条件为假;需要让条件1:if ((A > 1) && (B == 0))条件为假
通过路径 | 输入数据 | 预期结果 | 测试结果 | |
case1 | 3-4-5 | X=10, A=2, B=0 | X=5 | X=5 |
case2 | 3-4-5 | X=10, A=-2, B=2 | X=10 | X=10 |
case3 | 5-6-7 | X=10, A=1, B=2 | X=11 | X=11 |
case4 | 5-6-7 | X=10, A=-2, B=2 | X=10 | X=10 |
由表格可以看出case2和case4相同,所以合并为一个case
E.组合覆盖进行测试用例的设计:特点是必须考虑到IF分支里面的各个条件的各个值的真/假,并且每个分支的值的真和假都要出现一次
比如需要设计:
- case1的时候需要让条件1:if ((A > 1) && (B == 0))条件为真;需要让条件2:if ((A == 1) && (X > 1))条件为假
- case2的时候需要让条件1:(A > 1) 为真,(B == 0)为假;需要让条件2:if ((A == 1) && (X > 1))条件为假
- case3的时候需要让条件1:(A > 1) 为假,(B == 0)为真;需要让条件2:if ((A == 1) && (X > 1))条件为假
- case4的时候需要让条件2:if ((A == 1) && (X > 1))条件为真;需要让条件1:if ((A > 1) && (B == 0))条件为假
- case5的时候需要让条件2:(A == 1)为真,(X > 1)条件为假;需要让条件1:if ((A > 1) && (B == 0))条件为假
- case6的时候需要让条件2:(A == 1)为假,(X > 1)条件为真;需要让条件1:if ((A > 1) && (B == 0))条件为假
- case7的时候需要让条件2:(A == 1)为假,(X > 1)条件为假并且让条件1:if ((A > 1) && (B == 0))条件为假
通过路径 | 输入数据 | 预期结果 | 测试结果 | |
case1 | 3-4-5 | X=10, A=2, B=0 | X=5 | X=5 |
case2 | 3-4-5 | X=10, A=2, B=2 | X=10 | X=10 |
case3 | 3-4-5 | X=10, A=-1, B=0 | X=10 | X=10 |
case4 | 5-6-7 | X=10, A=1, B=2 | X=11 | X=11 |
case5 | 5-6-7 | X=1, A=1, B=2 | X=1 | X=1 |
case6 | 5-6-7 | X=10, A=0, B=2 | X=10 | X=10 |
case7 | T-7 | X=1, A=0, B=2 | X=1 | X=1 |