一、实验目的
掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
二、实验要求
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
三、实验内容
根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的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元\n |
2 | 10 | 20 | 5 | A-C-E-F-H-I | 佣金金额:106.00元\n |
3 | 100 | 1 | 1 | A-C-E-G-H-I | 佣金金额:1463.60元\n |
4 | -1 | -1 | -1 | A-B-I | 输入格式错误,请重试\n |
(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元\n |
2 | 10 | 20 | 5 | A-C-E-F-H-I | 佣金金额:106.00元\n |
3 | 100 | 1 | 1 | A-C-E-G-H-I | 佣金金额:1463.60元\n |
4 | -1 | -1 | -1 | A-B-I | 输入格式错误,请重试\n |
(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元\n |
2 | 10 | 20 | 5 | A-C-E-F-H-I | 佣金金额:106.00元\n |
3 | 100 | 1 | 1 | A-C-E-G-H-I | 佣金金额:1463.60元\n |
4 | -1 | -1 | -1 | A-B-I | 输入格式错误,请重试\n |
(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元\n |
2 | 1 | -5 | 4 | A-B-I | 2 | 输入格式错误,请重试\n |
3 | -1 | 120 | 1 | A-B-I | 3 | 输入格式错误,请重试\n |
4 | -2 | -4 | -4 | A-B-I | 4 | 输入格式错误,请重试\n |
5 | 1 | 2 | 2 | A-C-D-H-I | 1,5,8 | 佣金金额:11.60元\n |
6 | 100 | 20 | 50 | A-C-E-G-H-I | 1,6,9 | 佣金金额:1580.00元\n |
7 | 10 | 50 | 60 | A-C-E-F-H-I | 1,6,10 | 佣金金额:217.00元\n |
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元\n",Commission.commission(1, 2, 3)); 15 } 16 17 @Test 18 public void TestStateCoverage2() { 19 assertEquals("佣金金额:106.00元\n",Commission.commission(10, 20, 5)); 20 } 21 22 @Test 23 public void TestStateCoverage3() { 24 assertEquals("佣金金额:1463.60元\n",Commission.commission(100, 1, 1)); 25 } 26 27 @Test 28 public void TestStateCoverage4() { 29 assertEquals("输入格式错误,请重试\n",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元\n",Commission.commission(1, 6, 4)); 14 } 15 16 @Test 17 public void TestConditionCoverage2() { 18 assertEquals("输入格式错误,请重试\n",Commission.commission(1, -5, 4)); 19 } 20 21 @Test 22 public void TestConditionCoverage3() { 23 assertEquals("输入格式错误,请重试\n",Commission.commission(-1, 120, 1)); 24 } 25 26 @Test 27 public void TestConditionCoverage4() { 28 assertEquals("输入格式错误,请重试\n",Commission.commission(-2, -4, -4)); 29 } 30 31 @Test 32 public void TestConditionCoverage5() { 33 assertEquals("佣金金额:11.60元\n",Commission.commission(1, 2, 2)); 34 } 35 36 @Test 37 public void TestConditionCoverage6() { 38 assertEquals("佣金金额:1580.00元\n",Commission.commission(100, 20, 50)); 39 } 40 41 @Test 42 public void TestConditionCoverage7() { 43 assertEquals("佣金金额:217.00元\n",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方法里就写多个断言,出错之后,只能一个个检查,很麻烦;现在分方法进行测试,能够知道问题出在哪儿;但是对参数化测试还不是很熟练,课下要多练习练习。
-