一、实验目的
掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
二、实验要求
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
三、实验内容
根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本。
所有的覆盖的技术:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,基本路径测试方法。
包括的内容有:
1) 被测原代码:http://www.cnblogs.com/ChainYugi/p/6612975.html
2)依据覆盖技术,测试用例列表:
程序图 DD-路径图
DD-路径:
程序图节点 |
DD-路径 |
19 |
A |
20 |
B |
23,24,26 |
C |
27 |
D |
29 |
E |
30 |
F |
33 |
G |
36 |
H |
55 |
I |
(I)语句覆盖:
A-C-D-H-I 和 A-C-E-F-H-I 和 A-C-E-G-H-I 和 A-B-I
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
||
headphone |
shell |
protector |
(string类型) |
||
1 |
1 |
2 |
3 |
A-C-D-H-I |
佣金金额:12.40元 |
2 |
10 |
20 |
5 |
A-C-E-F-H-I |
佣金金额:106.00元 |
3 |
100 |
1 |
1 |
A-C-E-G-H-I |
佣金金额:1463.60元 |
4 |
-1 |
-1 |
-1 |
A-B-I |
输入格式错误,请重试 |
(II)分支覆盖(判断覆盖):(与语句覆盖一样)
A-C-D-H-I 和 A-C-E-F-H-I 和 A-C-E-G-H-I 和 A-B-I
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
||
headphone |
shell |
protector |
(string类型) |
||
1 |
1 |
2 |
3 |
A-C-D-H-I |
佣金金额:12.40元 |
2 |
10 |
20 |
5 |
A-C-E-F-H-I |
佣金金额:106.00元 |
3 |
100 |
1 |
1 |
A-C-E-G-H-I |
佣金金额:1463.60元 |
4 |
-1 |
-1 |
-1 |
A-B-I |
输入格式错误,请重试 |
(III)路径覆盖:(与语句覆盖一样)
A-C-D-H-I 和 A-C-E-F-H-I 和 A-C-E-G-H-I 和 A-B-I
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
||
headphone |
shell |
protector |
(string类型) |
||
1 |
1 |
2 |
3 |
A-C-D-H-I |
佣金金额:12.40元 |
2 |
10 |
20 |
5 |
A-C-E-F-H-I |
佣金金额:106.00元 |
3 |
100 |
1 |
1 |
A-C-E-G-H-I |
佣金金额:1463.60元 |
4 |
-1 |
-1 |
-1 |
A-B-I |
输入格式错误,请重试 |
(IV)条件覆盖:各个条件取真或假的可能至少执行一次
编号 |
headphone < 0 |
shell < 0 |
protector < 0 |
headphone < 0 || shell < 0 || protector < 0 |
覆盖路径 |
1 |
F |
F |
F |
F |
A-C |
2 |
F |
T |
F |
T |
A-B |
3 |
T |
F |
F |
T |
A-B |
4 |
T |
T |
T |
T |
A-B |
编号 |
sum < 1000 |
5 |
T |
6 |
F |
编号 |
sum >= 1000 |
sum <= 1800 |
sum >= 1000 && sum <= 1800 |
覆盖路径 |
7 |
F |
F |
F |
E-G |
8 |
F |
T |
F |
E-G |
9 |
T |
F |
F |
E-G |
10 |
T |
T |
T |
E-F |
测试用例:
用例ID |
输入值 |
执行路径 |
覆盖 条件 |
预期输出 |
||
headphone |
shell |
protector |
(string类型) |
|||
1 |
1 |
6 |
4 |
A-C-D-H-I |
1,5,7 |
佣金金额:17.20元 |
2 |
1 |
-5 |
4 |
A-B-I |
2 |
输入格式错误,请重试 |
3 |
-1 |
120 |
1 |
A-B-I |
3 |
输入格式错误,请重试 |
4 |
-2 |
-4 |
-4 |
A-B-I |
4 |
输入格式错误,请重试 |
5 |
1 |
2 |
2 |
A-C-D-H-I |
1,5,8 |
佣金金额:11.60元 |
6 |
100 |
20 |
50 |
A-C-E-G-H-I |
1,6,9 |
佣金金额:1580.00元 |
7 |
10 |
50 |
60 |
A-C-E-F-H-I |
1,6,10 |
佣金金额:217.00元 |
3)相应Junit测试脚本、执行结果
A.语句覆盖:
1 public class CommissionTest { 2 3 4 @Before 5 public void setUp() throws Exception { 6 } 7 8 @After 9 public void tearDown() throws Exception { 10 } 11 12 @Test 13 public void TestStateCoverage1() { 14 assertEquals("佣金金额:12.40元 ",Commission.commission(1, 2, 3)); 15 } 16 17 @Test 18 public void TestStateCoverage2() { 19 assertEquals("佣金金额:106.00元 ",Commission.commission(10, 20, 5)); 20 } 21 22 @Test 23 public void TestStateCoverage3() { 24 assertEquals("佣金金额:1463.60元 ",Commission.commission(100, 1, 1)); 25 } 26 27 @Test 28 public void TestStateCoverage4() { 29 assertEquals("输入格式错误,请重试 ",Commission.commission(-1, -1, -1)); 30 } 31 32 }
结果:
B.条件覆盖:
1 public class CommissionConditionTest { 2 3 @Before 4 public void setUp() throws Exception { 5 } 6 7 @After 8 public void tearDown() throws Exception { 9 } 10 11 @Test 12 public void TestConditionCoverage1() { 13 assertEquals("佣金金额:17.20元 ",Commission.commission(1, 6, 4)); 14 } 15 16 @Test 17 public void TestConditionCoverage2() { 18 assertEquals("输入格式错误,请重试 ",Commission.commission(1, -5, 4)); 19 } 20 21 @Test 22 public void TestConditionCoverage3() { 23 assertEquals("输入格式错误,请重试 ",Commission.commission(-1, 120, 1)); 24 } 25 26 @Test 27 public void TestConditionCoverage4() { 28 assertEquals("输入格式错误,请重试 ",Commission.commission(-2, -4, -4)); 29 } 30 31 @Test 32 public void TestConditionCoverage5() { 33 assertEquals("佣金金额:11.60元 ",Commission.commission(1, 2, 2)); 34 } 35 36 @Test 37 public void TestConditionCoverage6() { 38 assertEquals("佣金金额:1580.00元 ",Commission.commission(100, 20, 50)); 39 } 40 41 @Test 42 public void TestConditionCoverage7() { 43 assertEquals("佣金金额:217.00元 ",Commission.commission(10, 50, 60)); 44 } 45 46 }
结果:
4)给出测试参数化和打包测试的脚本,并生成执行结果
1 import org.junit.runner.RunWith; 2 import org.junit.runners.Suite; 3 4 @RunWith(Suite.class) 5 @Suite.SuiteClasses({ 6 CommissionTest.class, 7 CommissionConditionTest.class, 8 }) 9 10 public class AllCommissionTest { 11 12 }
结果:
4、测试小结:
- 此次测试并未找到缺陷
- 对源代码的修改建议:
-
- 可以将判断不合法输入的工作放到方法(commission)外部,即在主函数内判断;commission方法仅仅用来计算佣金金额。
- commission的返回内容,我建议只有佣金金额(换行符可以放到外面来实现)
-
- 测试总结与心得体会
-
- 画路径图之前,最好先话程序的控制流图,这样更不容易出错;
- 根据路径图设计测试用例,发现分析各种覆盖测试变得容易多了,不容易漏掉情况,没有之前写着那么晕,思路会更加清楚
- 对Junit的使用比上次课更加熟悉了。之前在一个test方法里就写多个断言,出错之后,只能一个个检查,很麻烦;现在分方法进行测试,能够知道问题出在哪儿;但是对参数化测试还不是很熟练,课下要多练习练习。
-