实验二+061+陈小兰
被测代码地址:http://www.cnblogs.com/chenyp1996/p/6619103.html
一、实验目的
掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
二、实验要求
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
三、实验内容
根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本。
所有的覆盖的技术:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,基本路径测试方法。
包括的内容有:
1) 被测原代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Scanner; /*NextDate函数问题 NextDate函数说明一种复杂的关系,即输入变量之间逻辑关系的复杂性 NextDate函数包含三个变量month、day和year,函数的输出为输入日期后一 天的日期。 要求输入变量month、day和year均为整数值,并且满足下列条件: 条件1 1≤ month ≤12 否则输出,月份超出范围 条件2 1≤ day ≤31 否则输出,日期超出范围 条件3 1912≤ year ≤2050 否则输出:年份超出范围 String nextdate(int m,int d,int y) 注意返回值是字符串。 程序要求: 1)先显示“请输入日期” 2)不满足条件1,返回:“月份超出范围”;不满足条件2,返回:“日期超出范围”; 不满足条件3,返回:“年份超出范围”;如果出现多个不满足,以最先出现不满足的 错误返回信息。3)条件均满足,则输出第二天的日期:格式“****年**月**日”(如果 输入2050年12月31日,则正常显示2051年1月1日*/ public class MyDate { public static String nextdate(int month, int day, int year) { if (month < 1 || month > 12) return "月份超出范围"; if (day < 1 || day > 31) return "日期超出范围"; if (year < 1912 || year > 2050) return "年份超出范围"; SimpleDateFormat sFormat = new SimpleDateFormat("yyyyMMdd"); sFormat.setLenient(false); try { Calendar c = Calendar.getInstance(); c.setTime(sFormat.parse("" + year + String.format("%02d", month) + String.format("%02d", day))); c.add(Calendar.DATE, 1); return c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH) + 1) + "月" + c.get(Calendar.DATE) + "日"; } catch (ParseException e) { return "日期不存在"; } } public static void main(String[] args) { String input = ""; int month, date, year;//优化效率 Scanner scan = new Scanner(System.in); while (true) { System.out.print("请输入日期"); input = scan.nextLine().trim(); String[] buf = input.split("[\\s+::,,/]");// 支持多种分割方式 if (input.equals(""))//无输入 continue; else if (input.equalsIgnoreCase("return"))// 改进退出方式 break; else if (buf.length == 3) { try { month = Integer.valueOf(buf[1]); date = Integer.valueOf(buf[2]); year = Integer.valueOf(buf[0]); System.out.println(nextdate(month, date, year)); } catch (NumberFormatException e) { System.out.println("日期格式错误"); } } else//长度不对 System.out.println("日期格式错误"); } System.out.println("谢谢使用,再见~"); scan.close(); } }
2)依据覆盖技术,测试用例列表:
程序流图 DD路径图
DD-路径(只压缩链路经)
程序图节点 |
DD-路径 |
22 |
A |
23 |
B |
24 |
C |
25 |
D |
26 |
E |
27 |
F |
28 |
G |
31-34 |
H |
35 |
I |
36,37,38 |
J |
39 |
M |
(I)语句覆盖:
A-B-C-K
A-B-D-E-K
A-B-D-F-G-K
A-B-D-F-H-I-K
A-B-D-F-H-J-K
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
1 |
2015 15 14 |
A-B-C-K |
月份超出范围 |
2 |
2015 12 36 |
A-B-D-E-K |
日期超出范围 |
3 |
1111 12 11 |
A-B-D-F-G-K |
年份超出范围 |
4 |
2001 01 01 |
A-B-D-F-H-I-K |
2001年1月2日 |
5 |
2001 02 29 |
A-B-D-F-H-J-K |
日期不存在 |
II)分支覆盖(判断覆盖):
A-B-C-K
A-B-D-E-K
A-B-D-F-G-K
A-B-D-F-H-I-K
A-B-D-F-H-J-K
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
1 |
2013 22 14 |
A-B-C-K |
月份超出范围 |
2 |
2011 11 38 |
A-B-D-E-K |
日期超出范围 |
3 |
2051 11 28 |
A-B-D-F-G-K |
年份超出范围 |
4 |
2003 11 12 |
A-B-D-F-H-I-K |
2003年11月13日 |
5 |
2005 06 31 |
A-B-D-F-H-J-K |
日期不存在 |
(III)路径覆盖:
A-B-C-K
A-B-D-E-K
A-B-D-F-G-K
A-B-D-F-H-I-K
A-B-D-F-H-J-K
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
1 |
1998 87 11 |
A-B-C-K |
月份超出范围 |
2 |
2011 11 56 |
A-B-D-E-K |
日期超出范围 |
3 |
1000 07 25 |
A-B-D-F-G-K |
年份超出范围 |
4 |
2017 04 13 |
A-B-D-F-H-I-K |
2017年04月14日 |
5 |
2000 04 31 |
A-B-D-F-H-J-K |
日期不存在 |
(IV)条件覆盖:各个条件取真或假的可能至少执行一次
编号 |
m<1 ||m>12 |
d<1|| d>31 |
y<1912||y>2051 |
覆盖路径 |
1 |
F |
F |
F |
B-C-K |
2 |
F |
F |
T |
B-C-K |
3 |
F |
T |
T |
B-C-K |
4 |
T |
F |
F |
B-D-E-K |
5 |
T |
T |
F |
B-D-F-G-K |
6 |
T |
T |
T |
B-D-F-H |
编号 |
c.add(Calendar.DATE, 1); |
覆盖路径 |
7 |
T |
H-I-K |
8 |
F |
H-J-K |
测试用例:
用例ID |
输入值 |
执行路径 |
覆盖条件 |
预期输出
|
1 |
2051 14 36 |
A-B-C-K |
1 |
月份超出范围 |
2 |
2055 14 30 |
A-B-C-K |
2 |
月份超出范围 |
3 |
2014 15 22 |
A-B-C-K |
3 |
月份超出范围 |
4 |
1000 11 32 |
A-B-D-E-K |
4 |
日期超出范围 |
5 |
1000 11 22 |
A-B-D-F-G-K |
5 |
年份超出范围 |
6 |
2014 11 25 |
A-B-D-F-H-I-K |
6,7 |
2014年11月26日 |
7 |
2000 02 28 |
A-B-D-F-H-I-K |
6,7 |
2000年02月29日 |
8 |
2014 06 31 |
A-B-D-F-H-J-K |
6,8 |
日期不存在 |
3)相应Junit测试脚本、执行结果
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; public class MyDateText { MyDate date = new MyDate(); @Before public void setUp() throws Exception { } @Test public void Test1() { assertEquals("月份超出范围",date.nextdate(15, 14, 2015)); } @Test public void Test2() { assertEquals("日期超出范围",date.nextdate(12, 36, 2015)); } @Test public void Test3() { assertEquals("年份超出范围",date.nextdate(12, 11,1111 )); } @Test public void Test4() { assertEquals("2001年1月2日",date.nextdate(01, 01,2001 )); } @Test public void Test5() { assertEquals("日期不存在",date.nextdate(2,29, 2001)); }@Test public void Test6() { assertEquals("月份超出范围",date.nextdate(22, 14, 2013)); } @Test public void Test7() { assertEquals("日期超出范围",date.nextdate(11, 38, 2001)); } @Test public void Test8() { assertEquals("年份超出范围",date.nextdate(11, 28, 2051)); } @Test public void Test9() { assertEquals("2003年11月13日",date.nextdate(11, 12, 2003)); } @Test public void Test10() { assertEquals("日期不存在",date.nextdate(06, 31, 2006)); } @Test public void Test11() { assertEquals("月份超出范围",date.nextdate(87, 11, 1998)); } @Test public void Test12() { assertEquals("日期超出范围",date.nextdate(11, 56, 2001)); } @Test public void Test13() { assertEquals("年份超出范围",date.nextdate(07, 25, 1000)); } @Test public void Test14() { assertEquals("2017年4月14日",date.nextdate(04, 13, 2017)); } @Test public void Test15() { assertEquals("日期不存在",date.nextdate(04, 31, 2000)); } @Test public void Test16() { assertEquals("月份超出范围",date.nextdate(14, 36, 2051)); } @Test public void Test17() { assertEquals("月份超出范围",date.nextdate(14, 30, 2055)); } @Test public void Test18() { assertEquals("月份超出范围",date.nextdate(15, 22, 2014)); } @Test public void Test19() { assertEquals("日期超出范围",date.nextdate(11, 32, 1000)); } @Test public void Test20() { assertEquals("年份超出范围",date.nextdate(11, 22, 1000)); } @Test public void Test21(){ assertEquals("2014年11月26日",date.nextdate(11,25,2014)); } @Test public void Test22() { assertEquals("2000年2月29日",date.nextdate(02, 28, 2000)); } @Test public void Test23() { assertEquals("日期不存在",date.nextdate(06, 31, 2014)); } }
4)给出测试参数化和打包测试的脚本,并生成执行结果
1. 参数化测试
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import static org.junit.Assert.*; import java.util.Arrays; import java.util.Collection; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) public class NextDateParamTest { private int param1; private int param2; private int param3; private String result; MyDate date = new MyDate(); @Parameters public static Collection data(){ return Arrays.asList(new Object[][]{ {15,14,2015,"月份超出范围"}, {12,36,2015,"日期超出范围"}, {12,11,1111,"年份超出范围"}, {01,01,2001,"2001年1月2日"}, {02,29,2001,"日期不存在"}, }); } public NextDateParamTest(int param1,int param2,int param3,String result){ this.param1 = param1; this.param2 = param2; this.param3 = param3; this.result = result; } @Test public void testParam(){ String rs = date.nextdate(param1, param2, param3); assertEquals(rs,result); } }
2.打包测试
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import static org.junit.Assert.*; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses( { MyDateTest.class, NextDateParamTest.class, } ) public class AllMydateTest { }
4、测试小结:
- 测试找到的缺陷清单:未发现缺陷
- 对源代码的修改建议:无
- 测试总结与心得体会:通过此次的实验,我对于白盒测试有了进一步的理解,掌握了程序的控制流图及其路径图的画法,并对各种覆盖方法有了更深层次的理解。同时还了解到了Junit测试的好处,能够使测试代码与产品代码分离、针对某一个类的测试代码通过较少的改动便可以应用于另一个类的测试等等,也学到了两种测试参数测试和打包测试,虽然没完全掌握但已经能够使用了。