实验二+087+饶慧敏

被测代码地址:http://www.cnblogs.com/wangjiao0-0/p/6622442.html

一、实验目的

掌握基于覆盖理论与基本路径的基本白盒测试方法和实践

二、实验要求

运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。

三、实验内容

根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本。

所有的覆盖的技术:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,基本路径测试方法。

包括的内容有:

1) 被测原代码

 1 import java.util.Scanner;
 2 
 3 public class Triangle {
 4     public static String triangle(int a, int b, int c) {
 5         if (!((1 <= a && a <= 100) && (1 <= b && b <= 100) && (1 <= c && c <= 100)))
 6             return "边的值不在范围内!";
 7         if (!((a < b + c) && (b < a + c) && (c < a + b)))
 8             return "不构成三角形";
 9         if ((a == b) || (b == c) || (c == a))
10             if (a == b && b == c)
11                 return "等边三角形";
12             else
13                 return "等腰三角形";
14         else {
15             if ((a * a == b * b + c * c) || (b * b == a * a + c * c) || (c * c == a * a + b * b))
16                 return "直角三角形";
17             return "一般三角形";
18         }
19     }
20 
21     public static void main(String[] args) {
22         String input = "";
23         int a, b, c;
24         Scanner scan = new Scanner(System.in);
25         while (true) {
26             System.out.print("请输入三角形的三条边");
27             input = scan.nextLine().trim();
28             String[] buf = input.split("[\\s+,,]");
29             if (input.equals(""))
30                 continue;
31             else if (input.equalsIgnoreCase("return"))//退出程序
32                 break;
33             else if (buf.length == 3) {
34                 try {
35                     a = Integer.valueOf(buf[0]);
36                     b = Integer.valueOf(buf[1]);
37                     c = Integer.valueOf(buf[2]);
38                     System.out.println(triangle(a, b, c));
39                 } catch (NumberFormatException e) {
40                     System.out.println("请输入整数");
41                 }
42             } else//长度错误
43                 System.out.println("格式错误");
44         }
45         System.out.println("谢谢使用,再见~");
46         scan.close();
47     }
48 }
View Code

 

2)依据覆盖技术,测试用例列表:

(DD-路径图)

DD-路径(只压缩链路经)

程序图节点 DD-路径
4 A
5 B
6 C
7 D
8 E
9 F
10 G
11 H
12,13 I
14,15 J
16 K
17 L
18 M

 

I)语句覆盖:

A-B-C-M

A-B-D-E-M

A-B-D-F-J-L-M

A-B-D-F-J-K-M

A-B-D-F-G-I-M

A-B-D-F-G-H-M

测试用例:

用例ID

输入值

执行路径

 

预期输出

 

a

b

c

1

-1

-1

-1

A-B-C-M

边的值不在范围内

2

1

2

1

A-B-D-E-M

不构成三角形

3

3

3

3

A-B-D-F-J-L-M

等边三角形

4

3

3

4

A-B-D-F-J-K-M

等腰三角形

5

3

4

5

A-B-D-F-G-I-M

直角三角形

6

2

4

3

A-B-D-F-G-H-M

一般三角形

II)分支覆盖(判断覆盖):

 A-B-C-M

A-B-D-E-M

A-B-D-F-J-L-M

A-B-D-F-J-K-M

A-B-D-F-G-I-M

A-B-D-F-G-H-M

测试用例:

用例ID

输入值

执行路径

 

预期输出

 

a

b

c

1

0

0

0

A-B-C-M

边的值不在范围内

2

3

2

1

A-B-D-E-M

不构成三角形

3

5

5

5

A-B-D-F-J-L-M

等边三角形

4

5

5

6

A-B-D-F-J-K-M

等腰三角形

5

6

8

10

A-B-D-F-G-I-M

直角三角形

6

3

5

6

A-B-D-F-G-H-M

一般三角形

 

 

III)路径覆盖: 

A-B-C-M

A-B-D-E-M

A-B-D-F-J-L-M

A-B-D-F-J-K-M

A-B-D-F-G-I-M

A-B-D-F-G-H-M

测试用例:

 

用例ID

输入值

执行路径

 

预期输出

 

a

b

c

1

101

0

0

A-B-C-M

边的值不在范围内

2

4

2

2

A-B-D-E-M

不构成三角形

3

100

100

100

A-B-D-F-J-L-M

等边三角形

4

50

50

80

A-B-D-F-J-K-M

等腰三角形

5

6

8

10

A-B-D-F-G-I-M

直角三角形

6

10

15

20

A-B-D-F-G-H-M

一般三角形

 IV)条件覆盖:

 

编号

1<=a<=100

1<=b<=100

1<=c<=100

!(1<=a<=100&&1<=b<=100

&&1<=c<=100)

覆盖路径

1

F

F

F

T

B-C-M

2

F

F

T

T

B-C-M

3

T

F

F

T

B-C-M

4

T

F

T

T

B-C-M

5

T

T

T

F

B-D

6

F

T

F

T

B-C-M

7

F

T

T

T

B-C-M

8

T

T

F

F B-D

 

 

编号

a < b + c

b < a + c

c < a + b

!(a < b +c&&b < a + c

&&c < a + b)

覆盖路径

9

F

F

F

T

D-E-M

10

F

F

T

T

D-E-M

11

T

F

F

T

D-E-M

12

T

F

T

T

D-E-M

13

T

T

T

F

D-F

14

F

T

F

T

D-E-M

15

F

T

T

T

D-E-M

16

T

T

F

T D-E-M

 

编号

a == b

b == c

c==a

(a == b) || (b == c) || (c == a)

覆盖路径

17

F

F

F

F

F-J

18

F

F

T

T

F-G

19

T

F

F

T

F-G

20

T

F

T

T

F-G

21

T

T

T

T

F-G

22

F

T

F

T

F-G

23

F

T

T

T

D-F

24

T

T

F

T D-F

 

编号

a == b

b == c

(a == b) &&(b == c) 

覆盖路径

25

F

F

F

G-I

26

F

T

F

G-I

27

T

T

T

G-H

28

T

F

F

G-I

 

编号

a * a == b * b + c * c

b * b == a * a + c * c

c * c == a * a + b * b

(a == b) || (b == c) || (c == a)

覆盖路径

29

F

F

F

F

J-L

30

F

F

T

T

J-K

31

T

F

F

T

J-K

32

T

F

T

T

J-K

33

T

T

T

T

J-K

34

F

T

F

T

J-K

35

F

T

T

T

J-K

36

T

T

F

T J-K

 

测试用例:

用例ID

输入值

执行路径

覆盖条件

 

预期输出

 

a

b

c

1

0

0

0

A-B-C-M

1

边的值不在范围内

2

1

2

4

A-B-D-E-M

5,9

不构成三角形

3

4 

4

4

A-B-D-F-G-H-M

5,13,21,27

等边三角形

4

2

3

2

A-B-D-F-G-I-M

5,13,18,25

等腰三角形

5

2

6

7

A-B-D-F-J-L-M

  5,13,17,30

一般三角形

6

3

5

4

A-B-D-F-J-K-M

5,13,17,29

直角三角形

7

2

2

3

A-B-D-F-G-I-M

5,13,19,26

等腰三角形

8

3

2

2

A-B-D-F-G-I-M

5,13,22,26

等腰三角形

3)相应Junit测试脚本、执行结果

  1 package com.test;
  2 import com.junit.Triangle;
  3 import static org.junit.Assert.*;
  4 
  5 import org.junit.Before;
  6 import org.junit.Test;
  7 
  8 
  9 public class TriangleTest {
 10     private static Triangle trangle = new Triangle();
 11 
 12     @Before
 13     public void setUp() throws Exception {
 14 
 15     }
 16 
 17 
 18 
 19     // 语句覆盖
 20     @Test
 21     public void statementTest() {
 22         assertEquals("边的值不在范围内!", trangle.triangle(-1, -1, -1));
 23         assertEquals("不构成三角形", trangle.triangle(1, 2, 1));
 24         assertEquals("等边三角形", trangle.triangle(3, 3, 3));
 25         assertEquals("等腰三角形", trangle.triangle(3, 3, 4));
 26         assertEquals("直角三角形", trangle.triangle(3, 4, 5));
 27         assertEquals("一般三角形", trangle.triangle(2, 4, 3));
 28     }
 29 
 30     // 判定覆盖
 31     @Test
 32     public void judgeTest1() {
 33 
 34         assertEquals("不构成三角形", trangle.triangle(3, 2, 1));
 35 
 36     }
 37 
 38     @Test
 39     public void judgeTest2() {
 40         assertEquals("边的值不在范围内!", trangle.triangle(0, 0, 0));
 41 
 42     }
 43 
 44     @Test
 45     public void judgeTest3() {
 46 
 47         assertEquals("等边三角形", trangle.triangle(5, 5, 5));
 48     }
 49 
 50     @Test
 51     public void judgeTest4() {
 52 
 53         assertEquals("等腰三角形", trangle.triangle(5, 5, 6));
 54     }
 55 
 56     @Test
 57     public void judgeTest5() {
 58 
 59         assertEquals("直角三角形", trangle.triangle(6, 8, 10));
 60 
 61     }
 62 
 63     @Test
 64     public void judgeTest6() {
 65 
 66         assertEquals("一般三角形", trangle.triangle(3, 5, 6));
 67     }
 68 
 69     // 路径覆盖
 70     @Test
 71     public void pathTest1() {
 72         assertEquals("边的值不在范围内!", trangle.triangle(101, 0, 0));
 73 
 74     }
 75 
 76     @Test
 77     public void pathTest2() {
 78 
 79         assertEquals("不构成三角形", trangle.triangle(4, 2, 2));
 80 
 81     }
 82 
 83     @Test
 84     public void pathTest3() {
 85 
 86         assertEquals("等边三角形", trangle.triangle(100, 100, 100));
 87 
 88     }
 89 
 90     @Test
 91     public void pathTest4() {
 92 
 93         assertEquals("等腰三角形", trangle.triangle(50, 50, 80));
 94 
 95     }
 96 
 97     @Test
 98     public void pathTest5() {
 99 
100         assertEquals("直角三角形", trangle.triangle(6, 8, 10));
101 
102     }
103 
104     @Test
105     public void pathTest6() {
106         assertEquals("一般三角形", trangle.triangle(10, 15, 20));
107     }
108 
109     // 条件覆盖
110     @Test
111     public void conditionTest1() {
112         assertEquals("边的值不在范围内!", trangle.triangle(0, 0, 0));
113 
114     }
115 
116 
117     @Test
118     public void conditionTest2() {
119 
120         assertEquals("不构成三角形", trangle.triangle(1, 2, 4));
121     }
122 
123 
124     @Test
125     public void conditionTest3() {
126 
127         assertEquals("等边三角形", trangle.triangle(4, 4, 4));
128 
129     }
130 
131 
132     @Test
133     public void conditionTest4() {
134 
135         assertEquals("等腰三角形", trangle.triangle(2, 3, 2));
136 
137     }
138 
139 
140     @Test
141     public void conditionTest5() {
142 
143         assertEquals("直角三角形", trangle.triangle(3, 5, 4));
144 
145     }
146 
147 
148     @Test
149     public void conditionTest6() {
150 
151         assertEquals("一般三角形", trangle.triangle(2, 6, 7));
152 
153     }
154 
155 
156     @Test
157     public void conditionTest7() {
158 
159         assertEquals("等腰三角形", trangle.triangle(2, 2, 3));
160 
161     }
162 
163 
164     @Test
165     public void conditionTest8() {
166 
167         assertEquals("等腰三角形", trangle.triangle(3, 2, 2));
168     }
169 
170 }
View Code

 

4)给出测试参数化和打包测试的脚本,并生成执行结果

 参数化测试

 1 package com.test;
 2 
 3 import static org.junit.Assert.*;
 4 
 5 import java.util.Arrays;
 6 import java.util.Collection;
 7 
 8 import org.junit.Test;
 9 import org.junit.runner.RunWith;
10 import org.junit.runners.Parameterized;
11 import org.junit.runners.Parameterized.Parameters;
12 
13 import com.junit.Triangle;
14  
15 
16 @RunWith(Parameterized.class)
17 public class TriangleParamTest {
18     private int param1;
19     private int param2;
20     private int param3;
21     private String result;
22     
23     Triangle triangle = new Triangle();
24     
25     @Parameters
26     public static Collection data(){
27         return Arrays.asList(new Object[][]{
28             {-1, -1, -1,"边的值不在范围内!"},
29             {1, 2, 1,"不构成三角形"},
30             {3, 3, 3,"等边三角形"},
31             {3, 3, 4,"等腰三角形"},
32             {3, 4, 5,"直角三角形"},
33             {2, 4, 3,"一般三角形"}
34             
35         });
36     }
37     
38     public TriangleParamTest(int param1,int param2,int param3,String result){
39         this.param1 = param1;
40         this.param2 = param2;
41         this.param3 = param3;
42         this.result = result;
43     }
44     
45     @Test
46     public void testParam(){
47         String rs = triangle.triangle(param1, param2, param3);
48         assertEquals(rs,result);
49     }
50 
51 }
View Code

 

 

打包测试

 1 package com.test;
 2 
 3 import org.junit.runner.RunWith;
 4 import org.junit.runners.Suite;
 5 
 6 
 7 @RunWith(Suite.class)
 8 @Suite.SuiteClasses(
 9         {
10             TriangleTest.class,
11             TriangleParamTest.class,
12         
13         })
14 public class AllTriangleTest {
15 
16 }
View Code

 

 

4、测试小结:

  代码能够通过所有测试用例,未发现缺陷。

  修改建议:程序的退出方式不够友好,建议修改。

    通过本次实验我对白盒测试有了更深刻的理解。进一步掌握了白盒测试的基本路径测试方法,能够更好的设计测试用例。同时,我还掌握了Junit脚本的使用方法。其中测试参数化和打包测试可以让测试更加简洁明了。

posted @ 2017-04-13 10:22  Lucerner  阅读(271)  评论(0编辑  收藏  举报