实验二+149+肖雷
一、实验目的
掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
二、实验要求
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
三、实验内容
被测代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.test; 2 import java.util.Scanner; 3 4 public class SoftTest_1 { 5 6 public static String commission(int headphone,int shell,int protector){ 7 float sum = headphone * 80 + shell * 10 + protector * 8; 8 float com=0; 9 if(sum>=0&&sum<=1000){ 10 com=(float) (sum*0.1); 11 }else if(sum<=1800){ 12 com=(float) (100+(sum-1000)*0.15); 13 }else{ 14 com=(float) (220+(sum-1800)*0.2); 15 } 16 return "佣金额为:"+com; 17 } 18 19 public static void main(String[] args) { 20 boolean b=true; 21 int headphone,shell,protector; 22 while(b){ 23 System.out.println("请分别输入三种手机配件的销售情况:\n"); 24 Scanner scanner = new Scanner(System.in); 25 try{ 26 headphone = scanner.nextInt(); 27 shell = scanner.nextInt(); 28 protector = scanner.nextInt(); 29 if(headphone<0 || shell<0 || protector<0){ 30 if(headphone==-1){ 31 System.out.println("退出"); 32 break; 33 }else{ 34 System.out.println("输入数量不满足条件"); 35 } 36 }else{ 37 String info = commission(headphone,shell,protector); 38 System.out.println(info); 39 } 40 }catch(java.util.InputMismatchException e){ 41 System.out.println("输入的不是整数,请再次输入"); 42 b = true; 43 } 44 } 45 } 46 }
DD-路径图
<1>语句覆盖
A-B-C-E-K; A-B-C-F-K ; A-B-D-G-K; A-B-D-H-I-K; A-B-D-H-J-K
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
实际输出 |
通过 |
|||||||
hp |
sh |
pr |
||||||||||
1 |
-1 |
0 |
0 |
A-B-C-E-K |
退出 |
退出 |
√ |
|||||
2 |
-2 |
-3 |
0 |
A-B-C-F-K |
输入数量不满足 |
输入数量不满足 |
√ |
|||||
3 |
5 |
10 |
5 |
A-B-D-G-K |
佣金额为:54.0 |
佣金额为:54.0 |
√ |
|||||
4 |
10 |
20 |
50 |
A-B-D-H-I-K |
佣金额为:160.0 |
佣金额为:160.0 |
√ |
|||||
5 |
20 |
20 |
50 |
A-B-D-H-J-K |
佣金额为:300.0 |
佣金额为:300.0 |
√ |
<2>分支覆盖(判定覆盖)
A-B-C-E-K; A-B-C-F-K ; A-B-D-G-K; A-B-D-H-I-K; A-B-D-H-J-K
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
实际输出 |
通过 |
|||||||
hp |
sh |
pr |
||||||||||
1 |
-1 |
0 |
0 |
A-B-C-E-K |
退出 |
退出 |
√ |
|||||
2 |
-10 |
-5 |
-8 |
A-B-C-F-K |
输入数量不满足 |
输入数量不满足 |
√ |
|||||
3 |
8 |
10 |
3 |
A-B-D-G-K |
佣金额为:76.4 |
佣金额为:76.4 |
√ |
|||||
4 |
15 |
20 |
3 |
A-B-D-H-I-K |
佣金额为:163.6 |
佣金额为:163.6 |
√ |
|||||
5 |
30 |
15 |
62 |
A-B-D-H-J-K |
佣金额为:469.2 |
佣金额为:469.2 |
√ |
<3>路径覆盖
A-B-C-E-K; A-B-C-F-K ; A-B-D-G-K; A-B-D-H-I-K; A-B-D-H-J-K
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
实际输出 |
通过 |
|||||||
hp |
sh |
pr |
||||||||||
1 |
-1 |
0 |
0 |
A-B-C-E-K |
退出 |
退出 |
√ |
|||||
2 |
-5 |
-3 |
0 |
A-B-C-F-K |
输入数量不满足 |
输入数量不满足 |
√ |
|||||
3 |
5 |
2 |
1 |
A-B-D-G-K |
佣金额为:42.8 |
佣金额为:42.8 |
√ |
|||||
4 |
14 |
16 |
5 |
A-B-D-H-I-K |
佣金额为:148.0 |
佣金额为:148.0 |
√ |
|||||
5 |
20 |
45 |
30 |
A-B-D-H-J-K |
佣金额为:318.0 |
佣金额为:318.0 |
√ |
<4>条件覆盖
编号 |
hp<0 |
sh<0 |
pr<0 |
hp<0||sh<0||pr<0 |
覆盖路径 |
1 |
F |
F |
F |
F |
B-D |
2 |
F |
F |
T |
T |
B-C |
3 |
F |
T |
F |
T |
B-C |
4 |
F |
T |
T |
T |
B-C |
5 |
T |
T |
T |
T |
B-C |
6 |
T |
T |
F |
T |
B-C |
7 |
T |
F |
T |
T |
B-C |
8 |
T |
F |
F |
T |
B-C |
编号 |
hp=-1 |
覆盖路径 |
1 |
T |
C-E |
2 |
F |
C-F |
编号 |
sum>=0 |
sum<=1000 |
sum>=0&sum<=1000 |
覆盖路径 |
1 |
T |
F |
F |
D-H |
2 |
T |
T |
T |
D-G |
3 |
F |
F |
F |
D-H |
4 |
F |
T |
F |
D-H |
编号 |
sum<=1800 |
覆盖路径 |
1 |
T |
H-I |
2 |
F |
H-J |
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
实际输出 |
通过 |
|||||||
hp |
sh |
pr |
||||||||||
1 |
-1 |
0 |
0 |
A-B-C-E-K |
退出 |
退出 |
√ |
|||||
2 |
-2 |
-2 |
0 |
A-B-C-F-K |
输入数量不满足 |
输入数量不满足 |
√ |
|||||
3 |
-2 |
0 |
-2 |
A-B-C-F-K |
输入数量不满足 |
输入数量不满足 |
√ |
|||||
4 |
-2 |
-2 |
-2 |
A-B-C-F-K |
输入数量不满足 |
输入数量不满足 |
√ |
|||||
5 |
0 |
0 |
0 |
A-B-D-G-K |
佣金金额为:0.0 |
佣金金额为:0.0 |
√ |
|||||
6 |
0 |
0 |
-2 |
A-B-C-F-K |
输入数量不满足 |
输入数量不满足 |
√ |
|||||
7 |
0 |
-2 |
0 |
A-B-C-F-K |
输入数量不满足 |
输入数量不满足 |
√ |
|||||
8 |
0 |
-2 |
-2 |
A-B-C-F-K |
输入数量不满足 |
输入数量不满足 |
√ |
|||||
9 |
5 |
10 |
5 |
A-B-D-G-K |
佣金额为:54.0 |
佣金额为:54.0 |
√ |
|||||
10 |
10 |
20 |
50 |
A-B-D-H-I-K |
佣金额为:160.0 |
佣金额为:160.0 |
√ |
|||||
11 |
20 |
20 |
50 |
A-B-D-H-J-K |
佣金额为:300.0 |
佣金额为:300.0 |
√ |
四、junit测试脚本
1 @RunWith(Parameterized.class) 2 public class SoftTest_1Test { 3 private int ph; 4 private int sh; 5 private int pr; 6 private String comm; 7 @Parameters 8 public static Collection<Object[]> data(){ 9 return Arrays.asList(new Object[][]{ 10 {5,10,5,"佣金额为:54.0"}, 11 {10,20,50,"佣金额为:160.0"}, 12 {20,20,50,"佣金额为:300.0"}, 13 {8,10,3,"佣金额为:76.4"}, 14 {15,20,3,"佣金额为:163.6"}, 15 {30,15,62,"佣金额为:469.2"}, 16 {5,2,1,"佣金额为:42.8"}, 17 {14,16,5,"佣金额为:148.0"}, 18 {20,45,30,"佣金额为:318.0"}, 19 {0,0,0,"佣金额为:0.0"} 20 }); 21 } 22 23 public SoftTest_1Test(int ph, int sh, int pr, String comm){ 24 this.ph = ph; 25 this.sh = sh; 26 this.pr = pr; 27 this.comm = comm; 28 } 29 @Test 30 public void testCommission() { 31 assertEquals(comm, SoftTest_1.commission(ph, sh, pr)); 32 } 33 34 }
执行结果
五、测试总结:
(1)这一次将百合测试中的覆盖发放比较完全的列出来了,测试结果也为全部通过。
(2)在这一次的用例设计中发现,源代码中有非常多的地方不方便使用Junit测试的地方,就比如源代码中的main函数包含了大量的处理代码,如果单独分离让其中部分代码变成一个独立的方法,这样整个程序的可测试性也会变高很多,
正是因为没有分离,所以我设计的好多测试用例都没办法用junit来实现,都只能以运行源代码,输入测试值的方式得到测试结果。
(3)做完junit单元测试才发现这个真的非常方便,因为自己同时进行了手动输入的方式来进行测试,遇到这种只要输入参数就可以自动测试并得出结果正确性的工具真的非常棒。
(3)对源代码的一些建议:希望主函数里面的东西能少一点,不然主函数太过冗余不方便单元测试的进行,还有就是开发人员的代码上次没有按照我提出的要求进行更改,所以我直接对他的源文件进行了修改以便使用junit进行测试,修
改后的源码我以评论的方式放在了他的博客里面。
ps:原博客地址 http://www.cnblogs.com/lkx1995/p/6636170.html