实验二+101+谢艳敏
一、实验目的
掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
二、实验要求
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
三、实验内容
根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本。
所有的覆盖的技术:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,基本路径测试方法。
包括的内容有:
1) 被测源代码:
1 public class GetData { 2 3 public static char triangle(int a, int b, int c) { 4 if(a<=b+c ||b<=a+c || c<=a+b) 5 { 6 if ((a==b)&& (b==c)&&(c==a)) { 7 return '1'; 8 }else if ((a==b) || (b==c) || (a==c)) { 9 return '2'; 10 }else if (a*a+b*b==c*c || b*b+c*c==a*a || a*a+c*c==b*b) { 11 return '3'; 12 }else { 13 return '4'; 14 } 15 }else 16 { 17 return '5'; 18 } 19 } 20 } 21 22 23 import java.util.Scanner; 24 25 public class Main { 26 static String equaltrianger = "等边三角形"; 27 static String isotrianger = "等腰三角形"; 28 static String comtrianger = "一般三角形"; 29 static String rigtrianger = "直角三角形"; 30 static String sidewrong = "边值不存在"; 31 static String noconstruct = "不构成三角形"; 32 33 public static void main(String[] args) { 34 char resulet = ' '; 35 System.out.println(" 1 进行三角形判断操作"); 36 System.out.println(" x 退出程序"); 37 38 while(true) 39 { 40 Scanner sc = new Scanner(System.in); 41 String temp =sc.nextLine(); 42 43 switch (temp) 44 { 45 case "1":{ 46 System.out.println("请输入三角形的三条边:"); 47 try { 48 49 Scanner sca = new Scanner(System.in); 50 int a = sca.nextInt(); 51 Scanner scb = new Scanner(System.in); 52 int b = scb.nextInt(); 53 Scanner scc = new Scanner(System.in); 54 int c = scc.nextInt(); 55 if (a<1 || a>100 || b<1 || b>100 || c<1 || c>100) { 56 System.out.println("边值不存在!"); 57 }else { 58 resulet = GetData.triangle(a, b, c); 59 if (resulet == '1') { 60 System.out.println(equaltrianger); 61 }else if (resulet == '2') { 62 System.out.println(isotrianger); 63 }else if (resulet == '3') { 64 System.out.println(rigtrianger); 65 }else if (resulet == '4') { 66 System.out.println(comtrianger); 67 }else { 68 System.out.println(noconstruct); 69 } 70 } 71 72 System.out.println(" 1 进行三角形判断操作"); 73 System.out.println(" x 退出程序"); 74 break; 75 } catch (Exception e) { 76 System.out.println("请输入正确的边值!"); 77 System.out.println(" 1 进行三角形判断操作"); 78 System.out.println(" x 退出程序"); 79 break; 80 } 81 } 82 83 case "x": 84 System.exit(1); 85 default: 86 System.out.println("请选择正确的操作!") ; 87 } 88 } 89 } 90 }
2)依据覆盖技术,测试用例列表:
DD-路径(只压缩链路经)
程序图节点 |
DD-路径 |
4 |
A |
6 |
B |
17 |
C |
8 |
D |
7 |
E |
10 |
F |
9 |
G |
11 |
H |
13 |
I |
58 |
J |
(I)语句覆盖:
A-C-J
A-B-E-J
A-B-D-G-J
A-B-D-F-I-J
A-B-D-F-H-J
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
||
a |
b |
c |
result |
||
1 |
3 |
1 |
7 |
A-C-J |
不构成三角形 |
2 |
3 |
3 |
3 |
A-B-E-J |
等边三角形 |
3 |
3 |
1 |
3 |
A-B-D-G-J |
等腰三角形 |
4 |
3 |
7 |
5 |
A-B-D-F-I-J |
一般三角形 |
5 |
3 |
4 |
5 |
A-B-D-F-H-J |
直角三角形 |
(II)分支覆盖(判断覆盖):
A-C-J
A-B-E-J
A-B-D-G-J
A-B-D-F-I-J
A-B-D-F-H-J
测试用例同语句覆盖测试用例
(III)路径覆盖:
A-C-J
A-B-E-J
A-B-D-G-J
A-B-D-F-I-J
A-B-D-F-H-J
测试用例同语句覆盖测试用例
(IV)条件覆盖:各个条件取真或假的可能至少执行一次
A-B-E-J
A-C-J
A-B-D-G-J
A-B-D-F-H-J
A-B-D-F-I-J
编号 |
a<=b+c
|
b<=a+c
|
c<=a+b
|
a<=b+c ||b<=a+c || c<=a+b
|
覆盖路径 |
1 |
F |
F |
F |
F |
A-C |
2 |
F |
F |
T |
T |
A-B |
3 |
F |
T |
F |
T |
A-B |
4 |
F |
T |
T |
T |
A-B |
5 |
T |
T |
T |
T |
A-B |
6 |
T |
T |
F |
T |
A-B |
7 |
T |
F |
T |
T |
A-B |
8 |
T |
F |
F |
T |
A-B |
编号 |
a==b
|
b==c
|
c==a
|
(a==b)&& (b==c)&&(c==a)
|
覆盖路径 |
9 |
F |
F |
F |
F |
A-C |
10 |
F |
F |
T |
F |
A-C |
11 |
F |
T |
F |
F |
A-C |
12 |
F |
T |
T |
F |
A-B |
13 |
T |
T |
T |
T |
A-B |
14 |
T |
T |
F |
F |
A-C |
15 |
T |
F |
T |
F |
A-C |
16 |
T |
F |
F |
F |
A-C |
编号 |
a==b
|
b==c
|
c==a
|
(a==b) || (b==c) || (a==c)
|
覆盖路径 |
17 |
F |
F |
F |
F |
D-F |
18 |
F |
F |
T |
T |
D-G |
19 |
F |
T |
F |
T |
D-G |
20 |
F |
T |
T |
T |
D-G |
21 |
T |
T |
T |
T |
D-G |
22 |
T |
T |
F |
T |
D-G |
23 |
T |
F |
T |
T |
D-G |
24 |
T |
F |
F |
T |
D-G |
编号 |
a*a+b*b==c*c
|
b*b+c*c==a*a
|
a*a+c*c==b*b
|
a*a+b*b==c*c || b*b+c*c==a*a || a*a+c*c==b*b
|
覆盖路径 |
25 |
F |
F |
F |
F |
F-I |
26 |
F |
F |
T |
T |
F-H |
27 |
F |
T |
F |
T |
F-H |
28 |
F |
T |
T |
T |
F-H |
29 |
T |
T |
T |
T |
F-H |
30 |
T |
T |
F |
T |
F-H |
31 |
T |
F |
T |
T |
F-H |
32 |
T |
F |
F |
T |
F-H |
测试用例:
用例ID |
输入值 |
执行路径 |
覆盖条件 |
预期输出 |
||
a |
b |
c |
result |
|||
1 |
3 |
1 |
7 |
A-C-J
|
1,9-11,14-16 |
不构成三角形 |
2 |
3 |
3 |
3 |
A-B-E-J
|
2-8,12,13 |
等边三角形 |
3 |
3 |
1 |
3 |
A-B-D-G-J
|
2-8,12,13,18-24 |
等腰三角形 |
4 |
3 |
4 |
5 |
A-B-D-F-H-J
|
2-8,12,13,17,26-32 |
直角三角形 |
5 |
3 |
7 |
5 |
A-B-D-F-I-J
|
2-8,12,13,17,25 |
一般三角形 |
3)相应Junit测试脚本、执行结果
package triangle01; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; public class GetDataTest { @Before public void setUp() throws Exception { } public String change(char c) { switch (c) { case '1': return "等边三角形"; case '2': return "等腰三角形"; case '3': return "直角三角形"; case '4': return "一般三角形"; case '5': return "不构成三角形"; default: break; } return null; } @Test public void test() { String s1 = change(GetData.triangle(3, 4, 5)); assertEquals("直角三角形", s1); String s2 = change(GetData.triangle(3, 7, 5)); assertEquals("一般三角形", s2); String s3 = change(GetData.triangle(3, 1, 7)); assertEquals("不构成三角形", s3); String s4 = change(GetData.triangle(3, 3, 3)); assertEquals("等边三角形", s4); String s5 = change(GetData.triangle(3, 1, 1)); assertEquals("等腰三角形", s5); } }
4)给出测试参数化和打包测试的脚本,并生成执行结果
参数化测试
package triangle01; import static org.junit.Assert.*; import java.util.Arrays; import java.util.Collection; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) public class GetDataParamTest { private int param1; private int param2; private int param3; private String result; GetData triangle = new GetData(); //把被测代码所返回的字符类型转换为字符串类型 public String change(char c) { switch (c) { case '1': return "等边三角形"; case '2': return "等腰三角形"; case '3': return "直角三角形"; case '4': return "一般三角形"; case '5': return "不构成三角形"; default: break; } return null; } @Parameters public static Collection data(){ return Arrays.asList(new Object[][]{ {3, 1, 7,"不构成三角形"}, {3, 3, 3,"等边三角形"}, {3, 1, 3,"等腰三角形"}, {3, 4, 5,"直角三角形"}, {3, 7, 5,"一般三角形"} }); } public GetDataParamTest(int param1,int param2,int param3,String result){ this.param1 = param1; this.param2 = param2; this.param3 = param3; this.result = result; } @Test public void testParam(){ String rs = change(triangle.triangle(param1, param2, param3)); assertEquals(rs,result); } }
打包测试
package triangle01; import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses( { GetDataTest.class, GetDataParamTest.class, }) public class AllTriangleTest { }
4、测试小结:
1、测试找到的缺陷清单:测试代码对“不构成三角形”的判断有错误。
2、修改建议:建议修改对“不构成三角形”的判断。
3、总结: 通过本次实验,我加深了对白盒测试的理解。学会了画控制流图,加深了对白盒测试的基本路径测试方法的理解,能够进一步设计出测试用例。同时,我还学会了Junit脚本的使用方法,包括测试参数化和打包测试。参数化测试,简化了测试,只写一个测试函数,把若干种情况作为参数传递进去,一次性地完成测试。打包测试,将所有需要运行的测试类集中起来,一次性地运行完毕,大大地方便了我们的测试工作。