被测代码地址:http://www.cnblogs.com/chenyp1996/p/6619103.html
掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本。
所有的覆盖的技术:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,基本路径测试方法。
包括的内容有:
1) 被测原代码
 
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测试脚本、执行结果
 
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. 参数化测试
 
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.打包测试
 
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 { }

原文:http://www.cnblogs.com/chenxxiaol/p/6704143.html