一、实验目的
掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
二、实验要求
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
三、实验内容
根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本。
所有的覆盖的技术:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,基本路径测试方法。
包括的内容有:
1) 被测原代码
import java.util.Scanner; public class Date { public static void main(String[] args){ System.out.print("请输入日期"); Scanner input = new Scanner(System.in); int year = input.nextInt(); int month = input.nextInt(); int day = input.nextInt(); GetDate(year,month,day); input.close(); } public static void GetDate(int year, int month, int day){ if (!(year >= 1912 && year <= 2050)){ //判断年份 System.out.println("年份超出范围!"); return; } if (month > 12 || month < 1){//判断月份 System.out.println("月份超出范围!"); return; } if (day > 31 || day < 1){//判断日期 System.out.println("日期超出范围!"); return; } if (month == 4 && day == 31 ){ System.out.println("日期超出范围!"); return; } if (month == 6 && day == 31){//判断日期 System.out.println("日期超出范围!"); return; } if (month == 9 && day == 31){//判断日期 System.out.println("日期超出范围!"); return; } if (month == 11 && day == 31){//判断日期 System.out.println("日期超出范围!"); return; } switch (month){//计算第二天日期 case 1: case 3: case 5: case 7: case 8: case 10: if (day == 31){ month++; day = 1; } else day++; break; case 2: if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)){//计算闰年的日期 if (day > 29){ System.out.println("日期超出范围!"); return; } if (day == 29){ month = 3; day = 1; } else day++; } else{ if (day > 28){ System.out.println("日期超出范围!"); return; } if (day == 28){ month = 3; day = 1; } else day++; } break; case 4: case 6: case 9: case 11: if (day == 30){ month++; day = 1; } else day++; break; case 12: if (day == 31){ year++; month = 1; day = 1; } else day++; break; } System.out.println(year+"年"+month+"月"+day+"日"); } }
程序图 DD路径图
2)依据覆盖技术,测试用例列表:
(1)语句覆盖:ABb,ABCc,ABCDd,ABCDEe,ABCDEFf,ABCDEFGg,ABCDEFGHh,ABCDEFGHIJKa,ABCDEFGHIJLa,ABCDEFGHINOo,ABCDEFGHINOPQa,
ABCDEFGHINOPRa,ABCDEFGHIWXa,ABCDEFGHIWYa,ABCDEFGHIZZ1a,ABCDEFGHIZZ2a,ABCDEFGHINSs,ABCDEFGHINSTUa,ABCDEFGHINSTVa
测试用例:
用例ID | 输入 | 执行路径 | 预期输出 | ||
year | month | day | |||
1 | 1890 | 1 | 1 | ABb | 年份超出范围 |
2 | 2001 | 0 | 3 | ABCc | 月份超出范围 |
3 | 1987 | 3 | 0 | ABCDd | 日期超出范围 |
4 | 1988 | 4 | 31 | ABCDEe | 日期超出范围 |
5 | 1998 | 6 | 31 | ABCDEFf | 日期超出范围 |
6 | 1997 | 9 | 31 | ABCDEFGg | 日期超出范围 |
7 | 2014 | 11 | 31 | ABCDEFGHh | 日期超出范围 |
8 | 1967 | 3 | 31 | ABCDEFGHIJKa | 1967年4月1日 |
9 | 1987 | 5 | 2 | ABCDEFGHIJLa | 1987年5月3日 |
10 | 2000 | 2 | 30 | ABCDEFGHINOo | 日期超出范围 |
11 | 1996 | 2 | 29 | ABCDEFGHINOPQa | 1996年3月1日 |
12 | 2004 | 2 | 1 | ABCDEFGHINOPRa | 2004年2 月2日 |
13 | 2005 | 4 | 30 | ABCDEFGHIWXa | 2005年5月1日 |
14 | 2006 | 6 | 3 | ABCDEFGHIWYa | 2006年6月4日 |
15 | 2007 | 12 | 31 | ABCDEFGHIZZ1a | 2008年1月1日 |
16 | 2008 | 12 | 5 | ABCDEFGHIZZ2a | 2008年12月6日 |
17 | 2001 | 2 | 29 | ABCDEFGHINSs | 日期超出范围 |
18 | 2002 | 2 | 28 | ABCDEFGHINSTUa | 2002年3月1日 |
19 | 2003 | 2 | 4 | ABCDEFGHINSTVa | 2003年2月5日 |
(2)分支覆盖:ABb,ABCc,ABCDd,ABCDEe,ABCDEFf,ABCDEFGg,ABCDEFGHh,ABCDEFGHIJKa,ABCDEFGHIJLa,ABCDEFGHINOo,ABCDEFGHINOPQa,
ABCDEFGHINOPRa,ABCDEFGHIWXa,ABCDEFGHIWYa,ABCDEFGHIZZ1a,ABCDEFGHIZZ2a,ABCDEFGHINSs,ABCDEFGHINSTUa,ABCDEFGHINSTVa
测试用例:
用例ID | 输入 | 执行路径 | 预期输出 | ||
year | month | day | |||
1 | 1890 | 1 | 1 | ABb | 年份超出范围 |
2 | 2001 | 0 | 3 | ABCc | 月份超出范围 |
3 | 1987 | 3 | 0 | ABCDd | 日期超出范围 |
4 | 1988 | 4 | 31 | ABCDEe | 日期超出范围 |
5 | 1998 | 6 | 31 | ABCDEFf | 日期超出范围 |
6 | 1997 | 9 | 31 | ABCDEFGg | 日期超出范围 |
7 | 2014 | 11 | 31 | ABCDEFGHh | 日期超出范围 |
8 | 1967 | 3 | 31 | ABCDEFGHIJKa | 1967年4月1日 |
9 | 1987 | 5 | 2 | ABCDEFGHIJLa | 1987年5月3日 |
10 | 2000 | 2 | 30 | ABCDEFGHINOo | 日期超出范围 |
11 | 1996 | 2 | 29 | ABCDEFGHINOPQa | 1996年3月1日 |
12 | 2004 | 2 | 1 | ABCDEFGHINOPRa | 2004年2 月2日 |
13 | 2005 | 4 | 30 | ABCDEFGHIWXa | 2005年5月1日 |
14 | 2006 | 6 | 3 | ABCDEFGHIWYa | 2006年6月4日 |
15 | 2007 | 12 | 31 | ABCDEFGHIZZ1a | 2008年1月1日 |
16 | 2008 | 12 | 5 | ABCDEFGHIZZ2a | 2008年12月6日 |
17 | 2001 | 2 | 29 | ABCDEFGHINSs | 日期超出范围 |
18 | 2002 | 2 | 28 | ABCDEFGHINSTUa | 2002年3月1日 |
19 | 2003 | 2 | 4 | ABCDEFGHINSTVa | 2003年2月5日 |
(3)路径覆盖:ABb,ABCc,ABCDd,ABCDEe,ABCDEFf,ABCDEFGg,ABCDEFGHh,ABCDEFGHIJKa,ABCDEFGHIJLa,ABCDEFGHINOo,ABCDEFGHINOPQa,
ABCDEFGHINOPRa,ABCDEFGHIWXa,ABCDEFGHIWYa,ABCDEFGHIZZ1a,ABCDEFGHIZZ2a,ABCDEFGHINSs,ABCDEFGHINSTUa,ABCDEFGHINSTVa
测试用例:
用例ID | 输入 | 执行路径 | 预期输出 | ||
year | month | day | |||
1 | 1890 | 1 | 1 | ABb | 年份超出范围 |
2 | 2001 | 0 | 3 | ABCc | 月份超出范围 |
3 | 1987 | 3 | 0 | ABCDd | 日期超出范围 |
4 | 1988 | 4 | 31 | ABCDEe | 日期超出范围 |
5 | 1998 | 6 | 31 | ABCDEFf | 日期超出范围 |
6 | 1997 | 9 | 31 | ABCDEFGg | 日期超出范围 |
7 | 2014 | 11 | 31 | ABCDEFGHh | 日期超出范围 |
8 | 1967 | 3 | 31 | ABCDEFGHIJKa | 1967年4月1日 |
9 | 1987 | 5 | 2 | ABCDEFGHIJLa | 1987年5月3日 |
10 | 2000 | 2 | 30 | ABCDEFGHINOo | 日期超出范围 |
11 | 1996 | 2 | 29 | ABCDEFGHINOPQa | 1996年3月1日 |
12 | 2004 | 2 | 1 | ABCDEFGHINOPRa | 2004年2 月2日 |
13 | 2005 | 4 | 30 | ABCDEFGHIWXa | 2005年5月1日 |
14 | 2006 | 6 | 3 | ABCDEFGHIWYa | 2006年6月4日 |
15 | 2007 | 12 | 31 | ABCDEFGHIZZ1a | 2008年1月1日 |
16 | 2008 | 12 | 5 | ABCDEFGHIZZ2a | 2008年12月6日 |
17 | 2001 | 2 | 29 | ABCDEFGHINSs | 日期超出范围 |
18 | 2002 | 2 | 28 | ABCDEFGHINSTUa | 2002年3月1日 |
19 | 2003 | 2 | 4 | ABCDEFGHINSTVa | 2003年2月5日 |
(4)条件覆盖:各个条件取真或假的可能至少执行一次
编号 | year<1912 or year>2050 | 覆盖路径 |
1 | F | B-C |
2 | T | B-b |
编号 | month<1 or month>12 | 覆盖路径 |
3 | F | C-D |
4 | T | C-c |
编号 | day<1 or day>31 | 覆盖路径 |
5 | F | D-E |
6 | T | D-d |
编号 | month==4 | day==31 | month==4 and day==31 | 覆盖路径 |
7 | F | F | F | E-F |
8 | F | T | F | E-F |
9 | T | F | F | E-F |
10 | T | T | T | E-e |
编号 |
month==6 | day==31 | month==6 and day==31 | 覆盖路径 |
11 | F | F | F | F-G |
12 | F | T | F | F-G |
13 | T | F | F | F-G |
14 | T | T | T | F-f |
编号 | month==9 | day==31 | month==9 and day==31 | 覆盖路径 |
15 | F | F | F | G-H |
16 | F | T | F | G-H |
17 | T | F | F | G-H |
18 | T | T | T | G-g |
编号 | month==11 | day==31 | month==11 and day==31 | 覆盖路径 |
19 | F | F | F | H-I |
20 | F | T | F | H-I |
21 | T | F | F | H-I |
22 | T | T | T | H-h |
编号 | day==31 | 覆盖路径 |
23 | F | J-K |
24 | T | J-L |
编号 | (year%4==0 and year%100!=0) or year%400==0 | 覆盖路径 |
25 | F | N-S |
26 | T | N-O |
编号 | day>29 | 覆盖路径 |
27 | F | O-P |
28 | T | O-o |
编号 | day==29 | 覆盖路径 |
29 | F | P-R |
30 | T | P-Q |
编号 | day>28 | 覆盖路径 |
31 | F | S-T |
32 | T | S-s |
编号 | day==28 | 覆盖路径 |
33 | F | T-V |
34 | T | T-U |
编号 | day==30 | 覆盖路径 |
35 | F | W-Y |
36 | T | W-X |
编号 | day==31 | 覆盖路径 |
37 | F | Z-Z2 |
38 | T | Z-Z1 |
测试用例:
用例ID | 输入 | 执行路径 | 覆盖条件 | 预期输出 | ||
year | month | day | ||||
1 | 1890 | 1 | 1 | ABb | 2 | 年份超出范围 |
2 | 2001 | 0 | 3 | ABCc | 1,4 | 月份超出范围 |
3 | 1987 | 3 | 0 | ABCDd | 1,3,6 | 日期超出范围 |
4 | 1988 | 4 | 31 | ABCDEe | 1,3,5,10 | 日期超出范围 |
5 | 1998 | 6 | 31 | ABCDEFf | 1,3,5,8,14 | 日期超出范围 |
6 | 1997 | 9 | 31 | ABCDEFGg | 1,3,5,8,12,18 | 日期超出范围 |
7 | 2014 | 11 | 31 | ABCDEFGHh | 1,3,5,8,12,16,22 | 日期超出范围 |
8 | 1967 | 3 | 31 | ABCDEFGHIJKa | 1,3,5,8,12,16,20,24 | 1967年4月1日 |
9 | 1987 | 5 | 2 | ABCDEFGHIJLa | 1,3,5,7,11,15,19,23 | 1987年5月3日 |
10 | 2000 | 2 | 30 | ABCDEFGHINOo | 1,3,5,7,11,15,19,26,28 | 日期超出范围 |
11 | 1996 | 2 | 29 | ABCDEFGHINOPQa | 1,3,5,7,11,15,19,26,27,30 | 1996年3月1日 |
12 | 2004 | 2 | 1 | ABCDEFGHINOPRa | 1,3,5,7,11,15,19,26,27,29 | 2004年2 月2日 |
13 | 2005 | 4 | 30 | ABCDEFGHIWXa | 1,3,5,9,11,15,19,36 | 2005年5月1日 |
14 | 2006 | 6 | 3 | ABCDEFGHIWYa | 1,3,5,7,13,15,19,35 | 2006年6月4日 |
15 | 2007 | 12 | 31 | ABCDEFGHIZZ1a | 1,3,5,8,12,16,20,38 | 2008年1月1日 |
16 | 2008 | 12 | 5 | ABCDEFGHIZZ2a | 1,3,5,7,11,15,19,37 | 2008年12月6日 |
17 | 2001 | 2 | 29 | ABCDEFGHINSs | 1,3,5,7,11,15,19,25,32 | 日期超出范围 |
18 | 2002 | 2 | 28 | ABCDEFGHINSTUa | 1,3,5,7,11,15,19,25,31,34 | 2002年3月1日 |
19 | 2003 | 2 | 4 | ABCDEFGHINSTVa | 1,3,5,7,11,15,19,25,31,33 | 2003年2月5日 |
3)相应Junit测试脚本、执行结果
import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; public class DateTest { @Before public void setUp() throws Exception { } @Test public void testGetDate1() { assertEquals("年份超出范围",Date.GetDate(1890, 1, 1)); } @Test public void testGetDate2() { assertEquals("月份超出范围",Date.GetDate(2001, 0, 3)); } @Test public void testGetDate3() { assertEquals("日期超出范围",Date.GetDate(1987, 3, 0)); } @Test public void testGetDate4() { assertEquals("日期超出范围",Date.GetDate(1988, 4, 31)); } @Test public void testGetDate5() { assertEquals("日期超出范围",Date.GetDate(1998, 6, 31)); } @Test public void testGetDate6() { assertEquals("日期超出范围",Date.GetDate(1997, 9, 31)); } @Test public void testGetDate7() { assertEquals("日期超出范围",Date.GetDate(2014, 11, 31)); } @Test public void testGetDate8() { assertEquals("1967年4月1日",Date.GetDate(1967, 3, 31)); } @Test public void testGetDate9() { assertEquals("1987年5月3日",Date.GetDate(1987, 5, 2)); } @Test public void testGetDate10() { assertEquals("日期超出范围",Date.GetDate(2000, 2, 30)); } @Test public void testGetDate11() { assertEquals("1996年3月1日",Date.GetDate(1996, 2, 29)); } @Test public void testGetDate12() { assertEquals("2004年2月2日",Date.GetDate(2004, 2, 1)); } @Test public void testGetDate13() { assertEquals("2005年5月1日",Date.GetDate(2005, 4, 30)); } @Test public void testGetDate14() { assertEquals("2006年6月4日",Date.GetDate(2006, 6, 3)); } @Test public void testGetDate15() { assertEquals("2008年1月1日",Date.GetDate(2007, 12, 31)); } @Test public void testGetDate16() { assertEquals("2008年12月6日",Date.GetDate(2008, 12, 5)); } @Test public void testGetDate17() { assertEquals("日期超出范围",Date.GetDate(2001, 2, 29)); } @Test public void testGetDate18() { assertEquals("2002年3月1日",Date.GetDate(2002, 2, 28)); } @Test public void testGetDate19() { assertEquals("2003年2月5日",Date.GetDate(2003, 2, 4)); } }
4、测试小结:
- 测试找到的缺陷清单:老师第一次提的要求没有完成,返回值是String型,该代码返回值为void,导致返回值不对,assertEquals无法经行断言判断。
- 对源代码的修改建议:按要求修改好代码,方法的类型重新定义,方法中判断超出范围太过繁琐,建议定义一个新的方法。
- 测试总结与心得体会:通过本次实验更深一步了解了Junit的使用,虽然被测代码有问题,但是还是按步骤一步步完成了脚本语句。并且在课堂上老师所讲的断言语句不能排列一起使用这个知识点印象深刻。