掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本。
所有的覆盖的技术:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,基本路径测试方法。
1) 被测原代码 http://www.cnblogs.com/LixiaZhang/
下面仅对被测代码的核心函数经行测试:
 public String NextDay(){
        //判断大月且不是12月31号
        if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 ||( month == 12 && day<31))
        {
            if (day < 31)
                day++;
            else if (day == 31)
            {
                month++;
                day =1;
            }
        }
        //判断12月31号
        else if (month == 12 && day == 31)
        {
            year++;
            month = 1;
            day = 1;
        }
        //判断除了2月的小月
        else if (month == 4 || month == 6 || month == 9 || month == 11)
        {
            if (day < 30)
                day++;
            else if (day == 30)
            {
                month++;
                day = 1;
            }
            else{
                return "日期错误!";
            }
        }
        //2月需判断是否闰年
        else  if (month == 2)
        {
            if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)){
                if (day < 29)
                    day++;
                else if (day == 29)
                {
                    month++;
                    day = 1;
                 }
                else
                {
                    return "日期错误!";
                }
            }
            else{
                 if (day < 28)
                     day++;
                 else if (day == 28)
                 {
                     month++;
                     day = 1;
                 }
                 else{
                     return "日期错误!";
                 }
            }
        }
        return "第二天:"+year+"年"+month+"月"+day+"日";
    }
DD-路径图
 
2)依据覆盖技术,测试用例列表:
语句覆盖
A-B-D-X
A-B-E-X
A-C-F-X
A-C-G-H-J-X
| 用例号 | 输入值 | 执行路径 | 预期结果 | |||
| year | month | day | ||||
| 1 | 2008 | 1 | 25 | A-B-D-X | 第二天:2008年1月26日 | |
| 2 | 2008 | 3 | 31 | A-B-E-X | 第二天:2008年4月1日 | |
| 3 | 2008 | 12 | 31 | A-C-F-X | 第二天:2009年1月1日 | |
| 4 | 2008 | 4 | 28 | A-C-G-H-J-X | 第二天:2008年4月29日 | |
判定覆盖
A-C-G-H-K-N-X
A-C-G-H-K-O
A-C-G-I-L-P-X
A-C-G-I-L-Q-U
A-C-G-I-M-S-W
| 用例号 | 输入值 | 执行路径 | 预期结果 | |||
| year | month | day | ||||
| 1 | 2005 | 6 | 30 | A-C-G-H-K-N-X | 第二天:2005年7月1日 | |
| 2 | 2005 | 11 | 31 | A-C-G-H-K-O | 日期错误! | |
| 3 | 1996 | 2 | 28 | A-C-G-I-L-P-X | 第二天:1996年2月29日 | |
| 4 | 1996 | 2 | 31 | A-C-G-I-L-Q-U | 日期错误! | |
| 5 | 1995 | 2 | 29 | A-C-G-I-M-S-W | 日期错误! | |
组合覆盖和路径覆盖同上
3)相应Junit测试脚本、执行结果
普通测试:
public class ComDateTest {
	
	private Date date=new Date();
	//语义覆盖
	@Test
	public void testNextDay1() {
		date.setDay(25);
		date.setMonth(1);
		date.setYear(2008);
		assertEquals("第二天:2008年1月26日", date.NextDay());
	}
	
	@Test
	public void testNextDay2() {
		date.setDay(31);
		date.setMonth(3);
		date.setYear(2008);
		assertEquals("第二天:2008年4月1日", date.NextDay());
	}
	@Test
	public void testNextDay3() {
		date.setDay(31);
		date.setMonth(12);
		date.setYear(2008);
		assertEquals("第二天:2009年1月1日", date.NextDay());
	}
	@Test
	public void testNextDay4() {
		date.setDay(28);
		date.setMonth(4);
		date.setYear(2008);
		assertEquals("第二天:2008年4月29日", date.NextDay());
	}
	
	//判定覆盖
	@Test
	public void testNextDay5() {
		date.setDay(30);
		date.setMonth(6);
		date.setYear(2005);
		assertEquals("第二天:2005年7月1日", date.NextDay());
	}
	@Test
	public void testNextDay6() {
		date.setDay(31);
		date.setMonth(11);
		date.setYear(2005);
		assertEquals("日期错误!", date.NextDay());
	}
	@Test
	public void testNextDay7() {
		date.setDay(28);
		date.setMonth(2);
		date.setYear(1996);
		assertEquals("第二天:1996年2月29日", date.NextDay());
	}
	@Test
	public void testNextDay8() {
		date.setDay(31);
		date.setMonth(2);
		date.setYear(1996);
		assertEquals("日期错误!", date.NextDay());
	}
	@Test
	public void testNextDay9() {
		date.setDay(29);
		date.setMonth(2);
		date.setYear(1995);
		assertEquals("日期错误!", date.NextDay());
	}
}
参数化测试:
public class PacDateTest {
	private Date date=new Date();
	
	private int day;
	private int month;
	private int year;
	private String result;
	@Parameters
	public static Collection data(){
		return Arrays.asList(new Object[][]{
			{25,1,2008,"第二天:2008年1月26日"},
			{31,3,2008,"第二天:2008年4月1日"},
			{31,12,2008,"第二天:2009年1月1日"},
			{28,4,2008,"第二天:2008年4月29日"},
			{30,6,2005,"第二天:2005年7月1日"},
			{31,11,2005,"日期错误!"},
			{28,2,1996,"第二天:1996年2月29日"},
			{31,2,1996,"日期错误!"},
			{29,2,1995,"日期错误!"},
		});
	}
	
	public PacDateTest(int day,int month ,int year,String result){
		this.day=day;
		this.month=month;
		this.year=year;
		this.result=result;
	}
	
	@Test
	public void testNextDate(){
		date.setDay(day);
		date.setMonth(month);
		date.setYear(year);
		assertEquals(result,date.NextDay());
	}
	
}
打包测试:
@RunWith(Suite.class)
@Suite.SuiteClasses({
	ComDateTest.class,
	PacDateTest.class
})
public class AllDateTest {
	
}
4)给出测试参数化和打包测试的脚本,并生成执行结果
普通测试
  
参数化测试
  
打包测试
  
源代码在输入合法的情况下能够正常运行,并输出正确结果。
1.测试结果显示在输入数据类型符合实际的情况下,未出现任何逻辑性错误,能输出正确结果。
2.源代码中存在多处标点符号,见一下标点符号统一使用英文形式,以便测试。
3.通过本次实验,学会了使用Junit框架对java代码测试,相比人工在控制台输入数据测试,Junit测试更加严格,更加方便。
4.经过这几次的实验,感觉到了软件测试工作的不易,开发人员应该经可能写出的代码结构清晰,使用统一的代码风格,使得测试人员能够方便阅读并理解代码,提高测试效率。
原文:http://www.cnblogs.com/zenghongyu/p/6708355.html