实验二_078_刘玲志

 

一、实验目的

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

二、实验要求

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

三、实验内容

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

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

包括的内容有:

1) 被测原代码

  1 import java.util.Scanner;
  2 public class NextDay {
  3     static String nextdate(int year, int month, int day) {
  4         // 闰年
  5         if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
  6             if (month == 1 || month == 3 || month == 5 || month == 7
  7                     || month == 8 || month == 10) {
  8                 
  9                 if (day == 31) {
 10                     day = 1;
 11                     month++;
 12                 } else
 13                     day++;
 14 
 15             } else if (month == 2) {
 16                 if (day == 29) {
 17                     day = 1;
 18                     month++;
 19                 } else
 20                     day++;
 21 
 22             } else if (month == 12) {
 23                 if (day == 31) {
 24                     day = 1;
 25                     month = 1;
 26                     year++;
 27                 } else
 28                     day++;
 29             } else if (month == 4 || month == 6 || month == 9 || month == 11) {
 30                 if (day == 30) {
 31                     day = 1;
 32                     month++;
 33                 } else
 34                     day++;
 35             }
 36         } else// 平年
 37         {
 38             if (month == 1 || month == 3 || month == 5 || month == 7
 39                     || month == 8 || month == 10) {
 40 
 41                 if (day == 31) {
 42                     day = 1;
 43                     month++;
 44                 } else
 45                     day++;
 46 
 47             } else if (month == 2) {
 48                 if (day == 28) {
 49                     day = 1;
 50                     month++;
 51                 } else
 52                     day++;
 53 
 54             } else if (month == 12) {
 55                 if (day == 31) {
 56                     day = 1;
 57                     month = 1;
 58                     year++;
 59                 } else
 60                     day++;
 61             } else if (month == 4 || month == 6 || month == 9 || month == 11) {
 62                 if (day == 30) {
 63                     day = 1;
 64                     month++;
 65                 } else
 66                     day++;
 67             }
 68         }
 69         String Year = year + "";
 70         String Month = month + "";
 71         String Day = day + "";
 72 
 73         return Year + "年" + Month + "月" + Day + "日";
 74 
 75     }
 76 
 77     public static void main(String[] args) {
 78 
 79         String tmp = "0";
 80         int month = 0, year = 0, day = 0;
 81         String date = " ";
 82         while (true) {
 83             Scanner sc = new Scanner(System.in);
 84 
 85             System.out.println("请输入日期(以1个空格区分年月日)");
 86             try {
 87                 String str = sc.nextLine();
 88                 String[] st = str.split(" ");
 89                 year = Integer.parseInt(st[0]);
 90                 month = Integer.parseInt(st[1]);
 91                 day = Integer.parseInt(st[2]);
 92             } catch (Exception e) {
 93                 System.out.print("输入有误重新输入");
 94                 continue;
 95             }
 96 
 97             if (year < 1912 || year > 2050) {
 98                 System.out.println("年份超过范围");
 99                 continue;
100             } else if (month > 12 || month < 1) {
101                 System.out.println("月份超过范围");
102                 continue;
103             }
104             // 日期有效判断
105             else if (month == 1 || month == 3 || month == 5 || month == 7
106                     || month == 8 || month == 10) {
107                 if (day > 31 || day < 1) {
108                     System.out.println("日期超过范围");
109                     continue;
110                 }
111 
112             } else if (month == 4 || month == 6 || month == 9 || month == 11) {
113                 if (day > 30 || day < 1) {
114                     System.out.println("日期超过范围");
115                     continue;
116                 }
117             } else if (month == 2) {
118                 if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
119                     if (day < 1 || day > 29) {
120                         System.out.println("日期超过范围");
121                         continue;
122                     }
123                 } else {
124                     if (day < 1 || day > 28) {
125                         System.out.println("日期超过范围");
126                         continue;
127                     }
128                 }
129             }
130             date = nextdate(year, month, day);
131             System.out.println("下一天是 ");
132             System.out.print(date);
133             System.out.println("\n是否停止 1 Or -1 -1为停止");
134             tmp = sc.nextLine();
135 
136         }
137 
138     }
139 
140 }
View Code

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

                                                

                                                 程序图                                                                                                     DD路径图 

 

 

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

程序图节点

DD-路径

5

A

7

B

8,9

C

11

D

12,13

E

14,15

F

17

G

18

H

19,20

I

21,22

J

24

K

25

L

26,27,28

M

29,30

N

31,32

O

33,34

P

35,36

Q

38

c

40,41

d

43,44

e

46,47

f

49

g

50

h

51,52

i

53,54

j

56

k

57

l

58,59,60

m

61,62

n

63,64

o

65,66

p

67,68

q

75

Z

(I)语句覆盖(画出路径图后发现语句覆盖、判定覆盖与路径覆盖的测试路径是一样,为了避免重复,这里选取的判定覆盖、路径覆盖的用例是相同的):

A-B-C-D-E-Z

A-B-C-D-F-Z

A-B-C-G-H-I-Z

A-B-C-G-H-J-Z

A-B-C-G-K-L-M-Z

A-B-C-G-K-L-N-Z

A-B-C-G-K-O-P-Z

A-B-C-G-K-O-Q-Z

A-B-c-d-e-Z

A-B-c-d-f-Z

A-B-c-g-h-i-Z

A-B-c-g-h-j-Z

A-B-c-g-k-l-m-Z

A-B-c-g-k-l-n-Z

A-B-c-g-k-o-p-Z

A-B-c-g-k-o-p-Z

 

测试用例:

用例ID

输入值

执行路径

预期输出

year

month

day

X

1

2000

1

31

A-B-C-D-E-Z

2000年2月1日

2

2000

3

29

A-B-C-D-F-Z

2000年3月30日

3

2004

2

29

A-B-C-G-H-I-Z

2004年3月1日

4

2004

2

18

A-B-C-G-H-J-Z

2004年2月19日

5

2008

12

31

A-B-C-G-K-L-M-Z

2009年1月1日

6

2008

12

19

A-B-C-G-K-L-N-Z

2008年12月20日

7

2012

4

30

A-B-C-G-K-O-P-Z

2012年5月1日

8

2012

4

18

A-B-C-G-K-O-Q-Z

2012年4月19日

9

2001

1

31

A-B-c-d-e-Z

2001年2月1日

10

2001

3

20

A-B-c-d-f-Z

2001年3月1日

11

2002

2

28

A-B-c-g-h-i-Z

2002年3月1日

12

2002

2

18

A-B-c-g-h-j-Z

2002年2月18日

13

2003

12

31

A-B-c-g-k-l-m-Z

2004年1月1日

14

2003

12

1

A-B-c-g-k-l-n-Z

2003年12月2日

15

2005

4

30

A-B-c-g-k-o-p-Z

2005年5月1日

16

2005

4

28

A-B-c-g-k-o-p-Z

2005年4月29日

 

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

A-B-C-D-E-Z

A-B-C-D-F-Z

A-B-C-G-H-I-Z

A-B-C-G-H-J-Z

A-B-C-G-K-L-M-Z

A-B-C-G-K-L-N-Z

A-B-C-G-K-O-P-Z

A-B-C-G-K-O-Q-Z

A-B-c-d-e-Z

A-B-c-d-f-Z

A-B-c-g-h-i-Z

A-B-c-g-h-j-Z

A-B-c-g-k-l-m-Z

A-B-c-g-k-l-n-Z

A-B-c-g-k-o-p-Z

A-B-c-g-k-o-p-Z

 

测试用例:

用例ID

输入值

执行路径

预期输出

year

month

day

X

1

2000

1

31

A-B-C-D-E-Z

2000年2月1日

2

2000

3

29

A-B-C-D-F-Z

2000年3月30日

3

2004

2

29

A-B-C-G-H-I-Z

2004年3月1日

4

2004

2

18

A-B-C-G-H-J-Z

2004年2月19日

5

2008

12

31

A-B-C-G-K-L-M-Z

2009年1月1日

6

2008

12

19

A-B-C-G-K-L-N-Z

2008年12月20日

7

2012

4

30

A-B-C-G-K-O-P-Z

2012年5月1日

8

2012

4

18

A-B-C-G-K-O-Q-Z

2012年4月19日

9

2001

1

31

A-B-c-d-e-Z

2001年2月1日

10

2001

3

20

A-B-c-d-f-Z

2001年3月1日

11

2002

2

28

A-B-c-g-h-i-Z

2002年3月1日

12

2002

2

18

A-B-c-g-h-j-Z

2002年2月18日

13

2003

12

31

A-B-c-g-k-l-m-Z

2004年1月1日

14

2003

12

1

A-B-c-g-k-l-n-Z

2003年12月2日

15

2005

4

30

A-B-c-g-k-o-p-Z

2005年5月1日

16

2005

4

28

A-B-c-g-k-o-p-Z

2005年4月29日

 

(III)路径覆盖:

A-B-C-D-E-Z

A-B-C-D-F-Z

A-B-C-G-H-I-Z

A-B-C-G-H-J-Z

A-B-C-G-K-L-M-Z

A-B-C-G-K-L-N-Z

A-B-C-G-K-O-P-Z

A-B-C-G-K-O-Q-Z

A-B-c-d-e-Z

A-B-c-d-f-Z

A-B-c-g-h-i-Z

A-B-c-g-h-j-Z

A-B-c-g-k-l-m-Z

A-B-c-g-k-l-n-Z

A-B-c-g-k-o-p-Z

A-B-c-g-k-o-p-Z

 

测试用例:

用例ID

输入值

执行路径

预期输出

year

month

day

X

1

2000

1

31

A-B-C-D-E-Z

2000年2月1日

2

2000

3

29

A-B-C-D-F-Z

2000年3月30日

3

2004

2

29

A-B-C-G-H-I-Z

2004年3月1日

4

2004

2

18

A-B-C-G-H-J-Z

2004年2月19日

5

2008

12

31

A-B-C-G-K-L-M-Z

2009年1月1日

6

2008

12

19

A-B-C-G-K-L-N-Z

2008年12月20日

7

2012

4

30

A-B-C-G-K-O-P-Z

2012年5月1日

8

2012

4

18

A-B-C-G-K-O-Q-Z

2012年4月19日

9

2001

1

31

A-B-c-d-e-Z

2001年2月1日

10

2001

3

20

A-B-c-d-f-Z

2001年3月1日

11

2002

2

28

A-B-c-g-h-i-Z

2002年3月1日

12

2002

2

18

A-B-c-g-h-j-Z

2002年2月18日

13

2003

12

31

A-B-c-g-k-l-m-Z

2004年1月1日

14

2003

12

1

A-B-c-g-k-l-n-Z

2003年12月2日

15

2005

4

30

A-B-c-g-k-o-p-Z

2005年5月1日

16

2005

4

28

A-B-c-g-k-o-p-Z

2005年4月29日

 

(IV)条件覆盖:各个条件取真或假的可能至少执行一次

A-B-C-D-E-Z                  A-B-c-d-e-Z

A-B-C-D-F-Z                  A-B-c-d-f-Z

A-B-C-D-E-Z                  A-B-c-d-e-Z

A-B-C-D-F-Z                  A-B-c-d-f-Z

A-B-C-D-E-Z                  A-B-c-d-e-Z

A-B-C-D-F-Z                  A-B-c-d-f-Z

A-B-C-G-H-I-Z                A-B-c-g-h-i-Z

A-B-C-G-H-J-Z                A-B-c-g-h-j-Z

A-B-C-G-K-L-M-Z             A-B-c-g-k-l-m-Z

A-B-C-G-K-L-N-Z             A-B-c-g-k-l-n-Z

A-B-C-G-K-O-P-Z              A-B-c-g-k-o-p-Z

A-B-C-G-K-O-Q-Z              A-B-c-g-k-o-q-Z

编号

y%4==0

y%100!==0

y%400==0

y%4==0&&   y%100!==0

||y%400==0

覆盖路径

1

T

T

T

T

B-C

2

T

T

F

T

B-C

3

F

F

F

F

B-c

 

编号

m==1

m==3

m==5

m==7

m==8

m==10

覆盖路径

4

T

F

F

F

F

F

C-D

5

F

T

F

F

F

F

C-D

6

F

F

T

F

F

F

C-D

7

F

F

F

T

F

F

C-D

8

F

F

F

F

T

F

C-D

9

F

F

F

F

F

T

C-D

10

F

F

F

F

F

F

C-G

 

编号

d==31

覆盖路径

11

T

D-E

12

F

D-F

 

编号

m==2

覆盖路径

13

T

G-H

14

F

G-K

 

 

编号

d==29

覆盖路径

15

T

H-I

16

F

D-F

 

编号

m==12

覆盖路径

17

T

K-L

18

F

K-O

 

编号

d==31

覆盖路径

19

T

L-M

20

F

L-N

 

编号

d==31

覆盖路径

21

T

D-E

22

F

D-F

 

编号

m==1

m==3

m==5

m==7

m==8

m==10

覆盖路径

23

T

F

F

F

F

F

c-d

24

F

T

F

F

F

F

c-d

25

F

F

T

F

F

F

c-d

26

F

F

F

T

F

F

c-d

27

F

F

F

F

T

F

c-d

28

F

F

F

F

F

T

c-d

29

F

F

F

F

F

F

c-g

 

编号

d==31

覆盖路径

30

T

d-e

31

F

d-f

 

编号

m==2

覆盖路径

32

T

g-h

33

F

g-k

 

 

编号

d==29

覆盖路径

34

T

h-i

35

F

d-f

 

编号

m==12

覆盖路径

36

T

k-l

37

F

k-o

 

编号

d==31

覆盖路径

38

T

l-m

39

F

l-n

 

编号

d==31

覆盖路径

40

T

d-e

41

F

d-f

 

测试用例:

用例ID

输入值

执行路径

覆盖条件

预期输出

A

B

X

X

1

2000

1

31

A-B-C-D-E-Z                 

1,4,11

2000年2月1日

2

2004

3

3

A-B-C-D-F-Z                 

2,5,12

2004年3月4日

3

2008

5

31

A-B-C-D-E-Z                 

2,6,11

2008年6月1日

4

2000

7

4

A-B-C-D-F-Z                

1,7,12

2000年7月5日

5

2004

8

31

A-B-C-D-E-Z                 

2,8,11

2004年9月1日

6

2008

10

5

A-B-C-D-F-Z                 

2,9,12

2008年10月6日

7

2000

2

29

A-B-C-G-H-I-Z               

1,10,13,15

2000年2月1日

8

2000

2

20

A-B-C-G-H-J-Z                

1,10,13,16

2000年2月21日

9

2004

12

31

A-B-C-G-K-L-M-Z            

2,10,14,17,19

2005年1月1日

10

2008

12

5

A-B-C-G-K-L-N-Z            

2,10,14,17,20

2008年12月6日

11

2000

4

30

A-B-C-G-K-O-P-Z             

1,10,14,18,21

2000年5月1日

12

2004

6

7

A-B-C-G-K-O-Q-Z             

2,10,14,18,22

2004年6月8日

13

2001

1

31

A-B-c-d-e-Z

3,23,30

2001年2月1日

14

2002

3

3

A-B-c-d-f-Z         

3,24,31

2002年3月4日

15

2003

5

31

A-B-c-d-e-Z

3,25,30

2003年6月1日

16

2005

7

5

A-B-c-d-f-Z                 

3,26,31

2005年7月6日

17

2006

8

31

A-B-c-d-e-Z

3,27,30

2006年9月1日

18

2007

10

5

A-B-c-d-f-Z

3,28,31

2007年10月6日

19

2009

2

28

A-B-c-g-h-i-Z

3,29,32,34

2009年3月1日

20

2013

2

20

A-B-c-g-h-j-Z

3,29,32,35

2013年2月21日

21

2015

12

31

A-B-c-g-k-l-m-Z

3,29,33,36,38

2016年1月1日

22

2017

12

5

A-B-c-g-k-l-n-Z

3,29,33,36,39

2017年12月6日

23

2014

4

30

A-B-c-g-k-o-p-Z

3,29,33,37,41

2014年5月1日

24

2018

6

7

A-B-c-g-k-o-q-Z

3,29,33,37,41

2018年6月8日

 

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

 1 import static org.junit.Assert.*;
 2 
 3 import org.junit.After;
 4 import org.junit.Before;
 5 import org.junit.Test;
 6 
 7 public class NextDayTest {
 8     @Before
 9     public void setUp() throws Exception {
10 
11     }
12 
13     @Test
14     public void testNextdate1() {
15      assertEquals("2000年2月1日", NextDay.nextdate(2000, 1, 31));
16     }
17     @Test
18     public void testNextdate2() {
19          assertEquals("2000年3月30日", NextDay.nextdate(2000, 3, 29));
20         }
21     @Test
22     public void testNextdate3() {
23          assertEquals("2004年3月1日", NextDay.nextdate(2004, 2, 29));
24         }
25     @Test
26     public void testNextdate4() {
27          assertEquals("2004年2月19日", NextDay.nextdate(2004, 2, 18));
28         }
29     @Test
30     public void testNextdate5() {
31          assertEquals("2009年1月1日", NextDay.nextdate(2008, 12, 31));
32         }
33     @Test
34     public void testNextdate6() {
35          assertEquals("2008年12月20日", NextDay.nextdate(2008, 12, 19));
36         }
37     @Test
38     public void testNextdate7() {
39          assertEquals("2012年5月1日", NextDay.nextdate(2012, 4, 30));
40         }
41     @Test
42     public void testNextdate8() {
43          assertEquals("2012年4月19日", NextDay.nextdate(2012, 4, 18));
44         }
45     @Test
46     public void testNextdate9() {
47          assertEquals("2001年2月1日", NextDay.nextdate(2001, 1, 31));
48         }
49     @Test
50     public void testNextdate10() {
51          assertEquals("2001年3月21日", NextDay.nextdate(2001, 3, 20));
52         }
53     @Test
54     public void testNextdate11() {
55          assertEquals("2002年3月1日", NextDay.nextdate(2002, 2, 28));
56         }
57     @Test
58     public void testNextdate12() {
59          assertEquals("2002年2月19日", NextDay.nextdate(2002, 2, 18));
60         }
61     @Test
62     public void testNextdate13() {
63          assertEquals("2004年1月1日", NextDay.nextdate(2003, 12, 31));
64         }
65     @Test
66     public void testNextdate14() {
67          assertEquals("2003年12月2日", NextDay.nextdate(2003, 12, 1));
68         }
69     @Test
70     public void testNextdate15() {
71          assertEquals("2005年5月1日", NextDay.nextdate(2005, 4, 30));
72         }
73     @Test
74     public void testNextdate16() {
75          assertEquals("2005年4月29日", NextDay.nextdate(2005, 4, 28));
76         }
77 
78     @After 
79     public void testMain() throws Exception{
80         //fail("Not yet implemented");
81     }
82 
83 }
View Code

这里使用了单个执行测试用例,执行的是语句覆盖、判定覆盖与路径覆盖的测试用例,执行结果为全部通过。

 

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

 1 import static org.junit.Assert.*;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Arrays;
 5 import java.util.Collection;
 6 
 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 @RunWith(Parameterized.class)
14 public class NextDay2Test {
15     NextDay nextDay = new NextDay();
16     int param1;
17     int param2;
18     int param3;
19     String result;
20 
21 @Parameters
22 public static Collection data(){
23     return Arrays.asList(new Object[][]{
24         {2000,1,31,"2000年2月1日"},
25         {2004,3,3,"2004年3月4日"},
26         {2008,5,31,"2008年6月1日"},
27         {2000,7,4,"2000年7月5日"},
28         {2004,8,31,"2004年9月1日"},
29         {2008,10,5,"2008年10月6日"},
30         {2000,2,29,"2000年3月1日"},
31         {2000,2,20,"2000年2月21日"},
32         {2004,12,31,"2005年1月1日"},
33         {2008,12,5,"2008年12月6日"},
34         {2000,4,30,"2000年5月1日"},
35         {2004,6,7,"2004年6月8日"},
36         {2001,1,31,"2001年2月1日"},
37         {2002,3,3,"2002年3月4日"},
38         {2003,5,31,"2003年6月1日"},
39         {2005,7,5,"2005年7月6日"},
40         {2006,8,31,"2006年9月1日"},
41         {2007,10,5,"2007年10月6日"},
42         {2009,2,20,"2009年2月21日"},
43         {2013,2,20,"2013年2月21日"},
44         {2015,12,31,"2016年1月1日"},
45         {2017,12,5,"2017年12月6日"},
46         {2014,4,30,"2014年5月1日"},
47         {2018,6,7,"2018年6月8日"},
48     });
49 }
50 
51 public NextDay2Test(int param1,int param2,int param3,String result){
52     this.param1 = param1;
53     this.param2 = param2;
54     this.param3 = param3;
55     this.result = result;
56     
57 }
58 
59 @Test
60 public void  testNextDay(){
61     String rs = NextDay.nextdate(param1, param2, param3);
62     assertEquals(rs,result);
63     
64 }
65 }
View Code

这里使用了测试参数化执行测试用例,测试了条件判定的用例,执行结果为全部通过。

 

 1 import org.junit.runner.RunWith;
 2 import org.junit.runners.Suite;
 3 @RunWith(Suite.class)
 4 @Suite.SuiteClasses(
 5          {
 6              NextDayTest.class,
 7              NextDay2Test.class,
 8          })
 9 
10 
11 public class AllTest {
12 
13 }
View Code

这里使用了打包测试脚本对所有用例进行测试,测试结果为全部通过:

 

四、测试小结:

       在本次测试中,最深刻的体会是代码的规范很重要,在测试的时候遇到了一些问题,源程序中对输入的年、月、日的格式判定在main函数中,但是对日期的输出判断在NextDate方法中,在做NextDate方法的测试时,也就不能对输入日期的格式进行判断,这样会导致设计的测试用例不完整,出现漏测的情况,源程序中,大量的条件判断使得测试的复杂度很高,建议使用java中的函数calndar获取时间的操作,也就能避免大量的判断,这样测试人员在设计测试用例的时候会方便很多,也能降低代码的冗余度。

      本次实验基于上一次Junit单元测试的基础上进行,但对每一条用例使用一种方法进行测试,这样能很快地找出测试用例地错误,以及错在哪里,第二点是对测试参数化和打包测试的脚本,这两种方法能够高效地进行测试,同时对测试参数化也避免了大量地测试代码地冗余,打包测试地脚本能够同时执行多个不同类的测试用例,测试更加高效。

     通过画程序图与其对应的DD路径图,能够很清楚地写出所有覆盖语句,对编写测试用例有一个很清楚的导向作用,比起一开始的盲目,进步了很多。通过本次的实验,对白盒测试的收获很多。

     本次实验中没有发现源程序NextDate方法中的错误,测试用例均能通过。

posted on 2017-04-14 00:44  刘玲志  阅读(236)  评论(0编辑  收藏  举报