一、实验目的
掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
二、实验要求
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
三、实验内容
根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本。
所有的覆盖的技术:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,基本路径测试方法。
包括的内容有:
1) 被测原代码
package com.test; import java.util.Scanner; public class TestPractice { /*闰年判断 * 返回值为true:该年为闰年 * 返回值为false:该年为平年 */ public static boolean isLeapYear(int y) { if((y % 4 == 0 && y % 100 != 0)||y % 400 == 0) return true; else return false; } //下一天判断,返回值为下一天的日期,格式是xxxx年x月x日 public static String NextDate(int y, int m, int d) { //判断年份是否超出范围 if(1912 <= y && y <= 2050) { //判断月份是否超出范围 if(1 <= m && m <= 12) { //大月判断,每个月只有31天 if(m == 1||m == 3||m == 5||m == 7||m == 8||m ==10||m == 12) { if(1 <= d && d < 31) return y+"年"+m+"月"+(d+1)+"日"; else if(d == 31) { if(m == 12) return (y+1)+"年1月1日"; else return y+"年"+(m+1)+"月1日"; } else return "日期超出范围"; } //小月判断,每个月只有30天 else if(m == 4||m == 6||m == 9||m == 11) { if(1 <= d && d < 30) return y+"年"+m+"月"+(d+1)+"日"; if(d == 30) return y+"年"+(m+1)+"月1日"; else return "日期超出范围"; } /*二月份在平年和闰年天数不同 * 所以需要分开统计 * */ else { if(isLeapYear(y)) { if(1 <= d && d < 29) return y+"年"+m+"月"+(d+1)+"日"; if(d == 29) return y+"年"+(m+1)+"月1日"; else return "日期超出范围"; } else { if(1 <= d && d < 28) return y+"年"+m+"月"+(d+1)+"日"; if(d == 28) return y+"年"+(m+1)+"月1日"; else return "日期超出范围"; } } } else return "月份超出范围"; } else { return "年份超出范围"; } } public static void main(String[] args) { Scanner scan = new Scanner(System.in); while(true) { System.out.print("请输入日期:"); int y = scan.nextInt(); if(y == -1) break; int m = scan.nextInt(); int d = scan.nextInt(); System.out.println(NextDate(y,m,d)); } } }
2)依据覆盖技术,测试用例列表:
DD路径图:
①语句覆盖:
用例ID |
输入值 |
执行路径 |
预期输出 |
||
y |
m |
d |
|||
1 |
2017 |
5 |
12 |
A-B-C-D-E-F-+3 |
2017年5月13日 |
2 |
2017 |
12 |
31 |
A-B-C-D-E-G-H-I-+3 |
2018年1月1日 |
3 |
2017 |
5 |
31 |
A-B-C-D-E-G-H-J-+3 |
2017年6月1日 |
4 |
2017 |
5 |
32 |
A-B-C-D-E-G-K-+3 |
日期超出范围 |
5 |
2017 |
4 |
12 |
A-B-C-D-L-M-+3 |
2017年4月13日 |
6 |
2017 |
4 |
30 |
A-B-C-D-L-N-O-+3 |
2017年5月1日 |
7 |
2017 |
4 |
31 |
A-B-C-D-L-N-P-+3 |
日期超出时间 |
8 |
2016 |
2 |
12 |
A-B-C-D-L-Q-R-+3 |
2016年2月13日 |
9 |
2016 |
2 |
29 |
A-B-C-D-L-Q-S-T-+3 |
2016年3月1日 |
10 |
2016 |
2 |
30 |
A-B-C-D-L-Q-S-U-+3 |
日期超出范围 |
11 |
2017 |
2 |
27 |
A-B-C-D-L-Q-V-W-+3 |
2017年2月28日 |
12 |
2017 |
2 |
28 |
A-B-C-D-L-Q-V-X-Y-+3 |
2017年3月1日 |
13 |
2017 |
2 |
29 |
A-B-C-D-L-Q-V-X-Z-+3 |
日期超出范围 |
14 |
2017 |
13 |
12 |
A-B-C-+1-+3 |
月份超出范围 |
15 |
2051 |
4 |
12 |
A-B-+2-+3 |
年份超出范围 |
②分支覆盖(判断覆盖):
用例ID |
输入值 |
执行路径 |
预期输出 |
||
y |
m |
d |
|||
1 |
2017 |
5 |
12 |
A-B-C-D-E-F-+3 |
2017年5月13日 |
2 |
2017 |
12 |
31 |
A-B-C-D-E-G-H-I-+3 |
2018年1月1日 |
3 |
2017 |
5 |
31 |
A-B-C-D-E-G-H-J-+3 |
2017年6月1日 |
4 |
2017 |
5 |
32 |
A-B-C-D-E-G-K-+3 |
日期超出范围 |
5 |
2017 |
4 |
12 |
A-B-C-D-L-M-+3 |
2017年4月13日 |
6 |
2017 |
4 |
30 |
A-B-C-D-L-N-O-+3 |
2017年5月1日 |
7 |
2017 |
4 |
31 |
A-B-C-D-L-N-P-+3 |
日期超出时间 |
8 |
2016 |
2 |
12 |
A-B-C-D-L-Q-R-+3 |
2016年2月13日 |
9 |
2016 |
2 |
29 |
A-B-C-D-L-Q-S-T-+3 |
2016年3月1日 |
10 |
2016 |
2 |
30 |
A-B-C-D-L-Q-S-U-+3 |
日期超出范围 |
11 |
2017 |
2 |
27 |
A-B-C-D-L-Q-V-W-+3 |
2017年2月28日 |
12 |
2017 |
2 |
28 |
A-B-C-D-L-Q-V-X-Y-+3 |
2017年3月1日 |
13 |
2017 |
2 |
29 |
A-B-C-D-L-Q-V-X-Z-+3 |
日期超出范围 |
14 |
2017 |
13 |
12 |
A-B-C-+1-+3 |
月份超出范围 |
15 |
2051 |
4 |
12 |
A-B-+2-+3 |
年份超出范围 |
③路径覆盖:
用例ID |
输入值 |
执行路径 |
预期输出 |
||
y |
m |
d |
|||
1 |
2017 |
5 |
12 |
A-B-C-D-E-F-+3 |
2017年5月13日 |
2 |
2017 |
12 |
31 |
A-B-C-D-E-G-H-I-+3 |
2018年1月1日 |
3 |
2017 |
5 |
31 |
A-B-C-D-E-G-H-J-+3 |
2017年6月1日 |
4 |
2017 |
5 |
32 |
A-B-C-D-E-G-K-+3 |
日期超出范围 |
5 |
2017 |
4 |
12 |
A-B-C-D-L-M-+3 |
2017年4月13日 |
6 |
2017 |
4 |
30 |
A-B-C-D-L-N-O-+3 |
2017年5月1日 |
7 |
2017 |
4 |
31 |
A-B-C-D-L-N-P-+3 |
日期超出时间 |
8 |
2016 |
2 |
12 |
A-B-C-D-L-Q-R-+3 |
2016年2月13日 |
9 |
2016 |
2 |
29 |
A-B-C-D-L-Q-S-T-+3 |
2016年3月1日 |
10 |
2016 |
2 |
30 |
A-B-C-D-L-Q-S-U-+3 |
日期超出范围 |
11 |
2017 |
2 |
27 |
A-B-C-D-L-Q-V-W-+3 |
2017年2月28日 |
12 |
2017 |
2 |
28 |
A-B-C-D-L-Q-V-X-Y-+3 |
2017年3月1日 |
13 |
2017 |
2 |
29 |
A-B-C-D-L-Q-V-X-Z-+3 |
日期超出范围 |
14 |
2017 |
13 |
12 |
A-B-C-+1-+3 |
月份超出范围 |
15 |
2051 |
4 |
12 |
A-B-+2-+3 |
年份超出范围 |
3)相应Junit测试脚本、执行结果
package henkepa;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.Collection;
import junit.framework.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
//为这个类指定一个ParameterizedRunner
@RunWith(Parameterized.class)
public class checkTest {
private int param1;//存放参数
private int param2;
private int param3;
private String dat;//存放日期
//测试数据,一个是参数,一个是期望结果
@Parameters
public static Collection data(){
return Arrays.asList(new Object[][]{
{2017,2,28,"2017年3月1日"},
{2016,2,28,"2016年2月29日"},
{2016,3,31,"2016年4月1日"},
{2016,12,31,"2017年1月1日"},
{2013,4,30,"2013年5月1日"},
});
}
//构造参数,对变量初始化,加入参数获得测试数据
public checkTest(int param,int param02,int param03,String dat){
this.param1=param;
this.param2=param02;
this.param3=param03;
this.dat=dat;
}
@Test
public void NextDate(){
String d=TestPractice.NextDate(param1,param2,param3);
assertEquals(dat, d);
}
}
4)给出测试参数化和打包测试的脚本,并生成执行结果
package henkepa;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({TestPracticeTest.class,})
public class Test {
}
4、测试小结:
测试找到的缺陷清单:未找到缺陷
测试总结与心得体会:通过此次实验对白盒测试有了更深的理解;感觉在做的时候语句覆盖、判定覆盖和路径覆盖做起来都是一样的...