实验二+020+梁睿阳
被测代码地址:http://www.cnblogs.com/linpanhuang/p/6611626.html
一、实验目的
掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
二、实验要求
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
三、实验内容
根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本。
所有的覆盖的技术:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,基本路径测试方法。
包括的内容有:
1) 被测原代码
package test01; import java.util.Scanner; public class aaa { static int m[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//静态数组存储月份的天数 public static void main(String[] args) { // TODO Auto-generated method stub int y=0 ,m=0,d=0; System.out.println("请输入年 月 日(用空格隔开),-1退出:"); @SuppressWarnings("resource") Scanner scan = new Scanner(System.in); while(true){ y=scan.nextInt(); if(y == -1)System.exit(0);//-1退出程序 m=scan.nextInt(); d=scan.nextInt(); System.out.println(nextDate(y,m,d)); } } public static String nextDate(int year,int month,int day)//nextDate方法 { String newDate = null;//用来接收日期 checkLeapYear(year);//如果是闰年则将m[2]置为29 switch(checkInput(year,month,day))//判断输入的的合法性属于哪种类型,如果输入合法再进行相关操作 { case 1: return newDate = "月份超出范围"; case 2: return newDate = "日期超出范围"; case 3: return newDate = "年份超出范围"; default: if(month==12 && day==31)//判断是否为最后一个月的最后一天,如果 是则年份加1,为1月1日 { year++; month = 1; day = 1; } else if(day < m[month]) day++;//如果日期的天数小于本月天数执行day++;否则表示为当月的最后一天执行month++,day=1; else { month++; day =1; } newDate=year+"年"+month+"月"+day+"日"; m[2] = 28;//重置二月的天数 return newDate; } } public static void checkLeapYear(int year)//如果是闰年则将m[2]置为29 { if(year%4 == 0 && year%100 != 0) m[2] = 29;//闰年2月29天 if(year%400 == 0) m[2] = 29; } public static int checkInput(int year,int month, int day)//判断输入是否合法,并分成不同类别 { if(month<1 || month>12) return 1; if(day<1 || day>m[month]) return 2; if(year<1992 || year>2050) return 3; return 0; } }
2)测试用例,图:
B-D,E,F,G扩展并省略G与M中间的部分:
(I)语句覆盖:
A-B-D-E-F-H-I 和 A-B-C-D-E-G-H-I
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
||
y |
m |
d |
|||
0 |
-1 |
A-C |
程序退出 |
||
1 |
2016 |
13 |
1 |
A-B-D-M |
月份超出范围 |
2 |
2016 |
2 |
32 |
A-B-E-M |
日期超出范围 |
3 |
1000 |
1 |
1 |
A-B-F-M |
年份超出范围 |
4 |
1912 |
12 |
31 |
A-B-G-H-L-M |
1913年1月1日 |
5 |
2050 |
8 |
2 |
A-B-G-I-J-L-M |
2050年8月3日 |
6 |
2005 |
1 |
31 |
A-B-G-I-K-L-M |
2005年2月1日 |
7 |
2000 |
1 |
31 |
A-B-G-I-K-L-M |
2000年2月1日 |
8 |
2004 |
1 |
31 |
A-B-G-I-K-L-M |
2004年2月1日 |
(II)分支覆盖(判断覆盖):
同语句覆盖
(III)路径覆盖:
同语句覆盖
(IV)条件覆盖:各个条件取真或假的可能至少执行一次
根据节点B处的展开
编号 |
month<1 |
month>12 |
覆盖路径 |
9 |
T |
F |
B-D |
10 |
F |
T |
B-D |
11 |
F |
F |
B-D |
编号 |
day<1 |
day>m[month] |
覆盖路径 |
12 |
T |
F |
B-O-E |
13 |
F |
T |
B-O-E |
14 |
F |
F |
B-O-E |
编号 |
year<1912 |
year>2050 |
覆盖路径 |
15 |
T |
F |
B-O-P-F |
16 |
F |
T |
B-O-P-F |
17 |
F |
F |
B-O-P-F |
测试用例:
用例ID |
输入值 |
执行路径 |
覆盖条件 |
预期输出 |
||
y |
m |
d |
||||
9 |
2005 |
0 |
20 |
A-B-D |
B, D |
月份超出范围 |
10 |
2005 |
13 |
20 |
A-B-D |
B, D |
月份超出范围 |
11 |
2005 |
5 |
1 |
A-B-D |
B, D |
2005年5月2日 |
12 |
2005 |
5 |
0 |
A-B-O-E |
B, O, E |
日期超出范围 |
13 |
2005 |
5 |
32 |
A-B-O-E |
B, O, E |
日期超出范围 |
14 |
2005 |
5 |
5 |
A-B-O-E |
B, O, E |
2005年5月6日 |
15 |
1911 |
5 |
5 |
A-B-O-P-F |
B, O, E, F |
年份超出范围 |
16 |
2051 |
5 |
5 |
A-B-O-P-F |
B, O, E, F |
年份超出范围 |
17 |
2010 |
5 |
5 |
A-B-O-P-F |
B, O, E, F |
2010年5月6日 |
3)相应Junit测试脚本、执行结果
package test01; import static org.junit.Assert.*; import org.junit.Test; public class unit_est { @Test public void test1() { assertEquals("月份超出范围",aaa.nextDate(2016, 13, 1)); } @Test public void test2() { assertEquals("日期超出范围",aaa.nextDate(2016, 2, 32)); } @Test public void test3() { assertEquals("年份超出范围",aaa.nextDate(1000, 1, 1)); } @Test public void test4() { assertEquals("1913年1月1日",aaa.nextDate(1912, 12,31)); } @Test public void test5() { assertEquals("2050年8月3日",aaa.nextDate(2050, 8, 2)); } @Test public void test6() { assertEquals("2005年2月1日",aaa.nextDate(2005, 1, 31)); } @Test public void test7() { assertEquals("2000年2月1日",aaa.nextDate(2000, 1, 31)); } @Test public void test8() { assertEquals("2004年2月1日",aaa.nextDate(2004, 1, 31)); } @Test public void test9() { assertEquals("月份超出范围",aaa.nextDate(2005, 0, 20)); } @Test public void test10() { assertEquals("月份超出范围",aaa.nextDate(2005, 13, 20)); } @Test public void test11() { assertEquals("2005年5月2日",aaa.nextDate(2005, 5, 1)); } @Test public void test12() { assertEquals("日期超出范围",aaa.nextDate(2005, 5, 0)); } @Test public void test13() { assertEquals("日期超出范围",aaa.nextDate(2005, 5, 32)); } @Test public void test14() { assertEquals("2005年5月6日",aaa.nextDate(2005, 5, 5)); } @Test public void test15() { assertEquals("年份超出范围",aaa.nextDate(1911, 5, 5)); } @Test public void test16() { assertEquals("年份超出范围",aaa.nextDate(2051, 5, 5)); } @Test public void test17() { assertEquals("2010年5月6日",aaa.nextDate(2010, 5, 5)); } }
4)给出测试参数化和打包测试的脚本,并生成执行结果
4、测试小结:
- 缺陷清单:样例8未通过
- 对源代码的修改建议:程序结构清晰,可测试性好,可以用少量样例覆盖大量的代码和组合情况,但是有些不应该的笔误应该注意。这次的错误就是因为将来if(year<1912 || year>2050)错写为1992导致的错误。
- 被测程序过于简单,暂时没有办法使用到更进阶一些的测试功能,断言语句就已经可以完全满足需求。通过本次试验已经进一步书系列Junit的基本使用,以及一些需要注意的地方,例如断言语句不要写在一起这样会导致如果出错不知道错在哪句上。
posted on 2017-04-12 00:09 StackOverflow! 阅读(300) 评论(0) 收藏 举报