实验二+020+梁睿阳
被测代码地址:http://www.cnblogs.com/linpanhuang/p/6611626.html
一、实验目的
掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
二、实验要求
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
三、实验内容
根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本。
所有的覆盖的技术:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,基本路径测试方法。
包括的内容有:
1) 被测原代码
package test01;
import java.util.Scanner;
public class aaa {
static int m[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//静态数组存储月份的天数
public static void main(String[] args) {
// TODO Auto-generated method stub
int y=0 ,m=0,d=0;
System.out.println("请输入年 月 日(用空格隔开),-1退出:");
@SuppressWarnings("resource")
Scanner scan = new Scanner(System.in);
while(true){
y=scan.nextInt();
if(y == -1)System.exit(0);//-1退出程序
m=scan.nextInt();
d=scan.nextInt();
System.out.println(nextDate(y,m,d));
}
}
public static String nextDate(int year,int month,int day)//nextDate方法
{
String newDate = null;//用来接收日期
checkLeapYear(year);//如果是闰年则将m[2]置为29
switch(checkInput(year,month,day))//判断输入的的合法性属于哪种类型,如果输入合法再进行相关操作
{
case 1: return newDate = "月份超出范围";
case 2: return newDate = "日期超出范围";
case 3: return newDate = "年份超出范围";
default:
if(month==12 && day==31)//判断是否为最后一个月的最后一天,如果 是则年份加1,为1月1日
{
year++;
month = 1;
day = 1;
}
else if(day < m[month]) day++;//如果日期的天数小于本月天数执行day++;否则表示为当月的最后一天执行month++,day=1;
else
{
month++;
day =1;
}
newDate=year+"年"+month+"月"+day+"日";
m[2] = 28;//重置二月的天数
return newDate;
}
}
public static void checkLeapYear(int year)//如果是闰年则将m[2]置为29
{
if(year%4 == 0 && year%100 != 0)
m[2] = 29;//闰年2月29天
if(year%400 == 0)
m[2] = 29;
}
public static int checkInput(int year,int month, int day)//判断输入是否合法,并分成不同类别
{
if(month<1 || month>12)
return 1;
if(day<1 || day>m[month])
return 2;
if(year<1992 || year>2050)
return 3;
return 0;
}
}
2)测试用例,图:

B-D,E,F,G扩展并省略G与M中间的部分:

(I)语句覆盖:
A-B-D-E-F-H-I 和 A-B-C-D-E-G-H-I
测试用例:
|
用例ID |
输入值 |
执行路径 |
预期输出 |
||
|
y |
m |
d |
|||
|
0 |
-1 |
A-C |
程序退出 |
||
|
1 |
2016 |
13 |
1 |
A-B-D-M |
月份超出范围 |
|
2 |
2016 |
2 |
32 |
A-B-E-M |
日期超出范围 |
|
3 |
1000 |
1 |
1 |
A-B-F-M |
年份超出范围 |
|
4 |
1912 |
12 |
31 |
A-B-G-H-L-M |
1913年1月1日 |
|
5 |
2050 |
8 |
2 |
A-B-G-I-J-L-M |
2050年8月3日 |
|
6 |
2005 |
1 |
31 |
A-B-G-I-K-L-M |
2005年2月1日 |
|
7 |
2000 |
1 |
31 |
A-B-G-I-K-L-M |
2000年2月1日 |
|
8 |
2004 |
1 |
31 |
A-B-G-I-K-L-M |
2004年2月1日 |
(II)分支覆盖(判断覆盖):
同语句覆盖
(III)路径覆盖:
同语句覆盖
(IV)条件覆盖:各个条件取真或假的可能至少执行一次
根据节点B处的展开
|
编号 |
month<1 |
month>12 |
覆盖路径 |
|
9 |
T |
F |
B-D |
|
10 |
F |
T |
B-D |
|
11 |
F |
F |
B-D |
|
编号 |
day<1 |
day>m[month] |
覆盖路径 |
|
12 |
T |
F |
B-O-E |
|
13 |
F |
T |
B-O-E |
|
14 |
F |
F |
B-O-E |
|
编号 |
year<1912 |
year>2050 |
覆盖路径 |
|
15 |
T |
F |
B-O-P-F |
|
16 |
F |
T |
B-O-P-F |
|
17 |
F |
F |
B-O-P-F |
测试用例:
|
用例ID |
输入值 |
执行路径 |
覆盖条件 |
预期输出 |
||
|
y |
m |
d |
||||
|
9 |
2005 |
0 |
20 |
A-B-D |
B, D |
月份超出范围 |
|
10 |
2005 |
13 |
20 |
A-B-D |
B, D |
月份超出范围 |
|
11 |
2005 |
5 |
1 |
A-B-D |
B, D |
2005年5月2日 |
|
12 |
2005 |
5 |
0 |
A-B-O-E |
B, O, E |
日期超出范围 |
|
13 |
2005 |
5 |
32 |
A-B-O-E |
B, O, E |
日期超出范围 |
|
14 |
2005 |
5 |
5 |
A-B-O-E |
B, O, E |
2005年5月6日 |
|
15 |
1911 |
5 |
5 |
A-B-O-P-F |
B, O, E, F |
年份超出范围 |
|
16 |
2051 |
5 |
5 |
A-B-O-P-F |
B, O, E, F |
年份超出范围 |
|
17 |
2010 |
5 |
5 |
A-B-O-P-F |
B, O, E, F |
2010年5月6日 |
3)相应Junit测试脚本、执行结果
package test01;
import static org.junit.Assert.*;
import org.junit.Test;
public class unit_est {
@Test
public void test1() {
assertEquals("月份超出范围",aaa.nextDate(2016, 13, 1));
}
@Test
public void test2() {
assertEquals("日期超出范围",aaa.nextDate(2016, 2, 32));
}
@Test
public void test3() {
assertEquals("年份超出范围",aaa.nextDate(1000, 1, 1));
}
@Test
public void test4() {
assertEquals("1913年1月1日",aaa.nextDate(1912, 12,31));
}
@Test
public void test5() {
assertEquals("2050年8月3日",aaa.nextDate(2050, 8, 2));
}
@Test
public void test6() {
assertEquals("2005年2月1日",aaa.nextDate(2005, 1, 31));
}
@Test
public void test7() {
assertEquals("2000年2月1日",aaa.nextDate(2000, 1, 31));
}
@Test
public void test8() {
assertEquals("2004年2月1日",aaa.nextDate(2004, 1, 31));
}
@Test
public void test9() {
assertEquals("月份超出范围",aaa.nextDate(2005, 0, 20));
}
@Test
public void test10() {
assertEquals("月份超出范围",aaa.nextDate(2005, 13, 20));
}
@Test
public void test11() {
assertEquals("2005年5月2日",aaa.nextDate(2005, 5, 1));
}
@Test
public void test12() {
assertEquals("日期超出范围",aaa.nextDate(2005, 5, 0));
}
@Test
public void test13() {
assertEquals("日期超出范围",aaa.nextDate(2005, 5, 32));
}
@Test
public void test14() {
assertEquals("2005年5月6日",aaa.nextDate(2005, 5, 5));
}
@Test
public void test15() {
assertEquals("年份超出范围",aaa.nextDate(1911, 5, 5));
}
@Test
public void test16() {
assertEquals("年份超出范围",aaa.nextDate(2051, 5, 5));
}
@Test
public void test17() {
assertEquals("2010年5月6日",aaa.nextDate(2010, 5, 5));
}
}
4)给出测试参数化和打包测试的脚本,并生成执行结果

4、测试小结:
- 缺陷清单:样例8未通过
- 对源代码的修改建议:程序结构清晰,可测试性好,可以用少量样例覆盖大量的代码和组合情况,但是有些不应该的笔误应该注意。这次的错误就是因为将来if(year<1912 || year>2050)错写为1992导致的错误。
- 被测程序过于简单,暂时没有办法使用到更进阶一些的测试功能,断言语句就已经可以完全满足需求。通过本次试验已经进一步书系列Junit的基本使用,以及一些需要注意的地方,例如断言语句不要写在一起这样会导致如果出错不知道错在哪句上。
posted on 2017-04-12 00:09 StackOverflow! 阅读(306) 评论(0) 收藏 举报
浙公网安备 33010602011771号