首页 > 代码库 > 实验二+108+曾宏宇

实验二+108+曾宏宇

一、实验目的

掌握基于覆盖理论与基本路径的基本白盒测试方法和实践

二、实验要求

运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。

三、实验内容

根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的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.经过这几次的实验,感觉到了软件测试工作的不易,开发人员应该经可能写出的代码结构清晰,使用统一的代码风格,使得测试人员能够方便阅读并理解代码,提高测试效率。

实验二+108+曾宏宇