一、实验目的
掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
二、实验要求
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
三、实验内容
根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本。
所有的覆盖的技术:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,基本路径测试方法。
包括的内容有:
1) 被测原代码
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
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测试脚本、执行结果
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
这里使用了单个执行测试用例,执行的是语句覆盖、判定覆盖与路径覆盖的测试用例,执行结果为全部通过。
4)给出测试参数化和打包测试的脚本,并生成执行结果
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
这里使用了测试参数化执行测试用例,测试了条件判定的用例,执行结果为全部通过。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
这里使用了打包测试脚本对所有用例进行测试,测试结果为全部通过:
四、测试小结:
在本次测试中,最深刻的体会是代码的规范很重要,在测试的时候遇到了一些问题,源程序中对输入的年、月、日的格式判定在main函数中,但是对日期的输出判断在NextDate方法中,在做NextDate方法的测试时,也就不能对输入日期的格式进行判断,这样会导致设计的测试用例不完整,出现漏测的情况,源程序中,大量的条件判断使得测试的复杂度很高,建议使用java中的函数calndar获取时间的操作,也就能避免大量的判断,这样测试人员在设计测试用例的时候会方便很多,也能降低代码的冗余度。
本次实验基于上一次Junit单元测试的基础上进行,但对每一条用例使用一种方法进行测试,这样能很快地找出测试用例地错误,以及错在哪里,第二点是对测试参数化和打包测试的脚本,这两种方法能够高效地进行测试,同时对测试参数化也避免了大量地测试代码地冗余,打包测试地脚本能够同时执行多个不同类的测试用例,测试更加高效。
通过画程序图与其对应的DD路径图,能够很清楚地写出所有覆盖语句,对编写测试用例有一个很清楚的导向作用,比起一开始的盲目,进步了很多。通过本次的实验,对白盒测试的收获很多。
本次实验中没有发现源程序NextDate方法中的错误,测试用例均能通过。