掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的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