实验二 动态分析测试.docx
《实验二 动态分析测试.docx》由会员分享,可在线阅读,更多相关《实验二 动态分析测试.docx(13页珍藏版)》请在冰豆网上搜索。
实验二动态分析测试
软件学院
上机实验报告
课程名称:
软件测试与评估
实验项目:
实验二基于规格说明的测试技术
实验室:
耘慧416
姓名:
学号:
专业班级:
软件13-7
实验时间:
2016/4/7
实验成绩
评阅教师
一、实验目的及要求
1.掌握基于规格说明的测试技术(即动态测试技术);
2.能够运用其进行测试用例的设计。
二、实验性质
设计性
三、实验学时
2学时
四、实验环境
1.实验环境:
主流PC机一套,要求安装windows操作系统、OFFICE工具
2.知识准备:
(1)软件基于规格说明的测试技术;
(2)划分测试用例的原理和方法的同时,运用其设计测试用例。
5、实验内容及步骤
1.对问题进行分析,选用基于规格说明的测试技术中适合的方法为NextDate函数问题设计测试用例:
NextDate函数
NextDate函数说明另一种复杂的关系,即输入变量之间逻辑关系的复杂性。
NextDate函数包含三个变量month、day和year,函数的输出为输入日期后一天的日期。
要求输入变量month、day和year均为整数值,并且满足下列条件:
条件11≤month≤12
条件21≤day≤31
条件31912≤year≤2050
结论:
在NextDate函数中有两种复杂性的输入来源,一是输入域的复杂性,二是确定闰年的规则并要增加“额外天”。
2.以覆盖测试技术中的判定覆盖为例来进行三角形问题的测试用例的设计:
如果输入值a、b、c不满足条件1、条件2和条件3,程序给出“边的取值超出允许范围”的信息。
如果输入值a、b、c满足条件1、条件2和条件3,则输出下列四种情况之一:
(1)如果不满足条件4、条件5和条件6中的一个,则程序输出为“非三角形”;
(2)如果三条边相等,则程序输出为“等边三角形”;
(3)如果恰好有两条边相等,则程序输出为“等腰三角形”;
(4)如果三条边都不相等,则程序输出为“一般三角形”。
五、实验要求及步骤
1.对于NextDate函数问题进行分析:
(1)选用基于规格说明的测试技术中适合的方法为其设计测试用例;
(2)选定等价类、边界值、等价类边界值结合法、因果图/决策表法其中之一设计具体测试用例,给出预定输入和输出,以及实际输出结果;
可供选择的设计方法包括:
等价类测试
等价类测试方法是把所有可能的输入数据,即程序的输入域划分成若干部分,然后从每一部分中选取少数有代表性的数据作为测试用例。
使用等价类划分方法设计测试用例要经历划分等价类(列出等价类表)和选取测试用例两步。
等价类的划分有两种不同的情况:
①有效等价类:
是指对于程序的规格说明来说,是合理的,有意义的输入数据构成的集合。
②无效等价类:
是指对于程序的规格说明来说,是不合理的,无意义的输入数据构成的集合。
在设计测试用例时,要同时考虑有效等价类和无效等价类的设计。
用等价类划分法设计测试用例步骤:
a形成等价类表,每一等价类规定一个唯一的编号;
b设计一个新的测试用例,使其尽可能多地覆盖尚未覆盖的有效等价类,重复这一步骤,直到所有有效等价类均被测试用例所覆盖;
c设计一个新测试用例,使其只覆盖一个无效等价类,重复这一步骤直到所有无效等价类均被覆盖。
边界值分析
边界值分析是考虑边界条件而选取测试用例的一种功能测试方法。
边界值分析关注输入空间的边界,以标识测试用例,因为错误更可能出现在输入变量的极值附近。
边界值分析的基本思想是:
利用输入变量的最小值(min)、略大于最小值(min+)、正常值(nom)、略小于最大值(max-)和最大值(max)来设计测试用例。
使用在最小值、略高于最小值、正常值、略低于最大值和最大值处取输入变量值。
在边界值分析法中获取测试用例的方法是:
a每次保留程序中一个变量,让其余的变量取正常值,被保留的变量依次取min、min+、nom、max-和max作为有效边界值;依次取min-和max+作为无效边界值。
b对程序中的每个变量重复1)。
决策表的测试
决策表(也称判定表)适合描述分析和表达针对不同逻辑条件的组合取值执行不同操作的情况。
决策表分为4部分,如下图所示:
其中:
a条件桩:
列出问题的所有条件
b条件项:
针对条件桩给出的条件列出所有可能的取值
c动作桩:
列出问题规定的可能采取的操作
d动作项:
指出在条件项的各组取值情况下应采取的动作
使用决策表标识测试用例,则决策表中的条件就是规格说明书中的输入条件,动作就是输出结果,而规则就是贯穿条件项和动作项的一列,一条规则要对应设计一个测试用例。
因果图法
因果图法最终生成的是决策表。
利用因果图生成测试用例的基本步骤如下:
a分析软件规格说明中哪些是原因(即输入条件或输入条件的等价类),哪些是结果(即输出条件),并给每个原因和结果赋予一个标识符。
b分析软件规格说明中的语义,找出原因与结果之间、原因与原因之间对应的关系,根据这些关系画出因果图。
c由于语法或环境的限制,有些原因与原因之间、原因与结果之间的组合情况不可能出现。
为表明这些特殊情况,在因果图上用一些记号表明约束或限制条件。
d把因果图转换为决策表。
e根据决策表中的每一列设计测试用例。
(3)比较这些方法之间的优缺点。
NextDate函数的决策表测试用例设计
1.问题分析:
为了获得下一个日期,NextDate函数执行如下操作:
如果输入日期不是当月最后一天,则把day变量的值加1;
如果输入日期是1~11月份中某月的最后一天,则把day变量的值复位为1,month变量的值加1;
如果输入日期是12月的最后一天,则day变量和month变量的值都复位为1,year变量的值加1。
关于最后一天的判断:
如果是有31天的月份(1,3,5,7,8,10,12),day变量值为31;
如果是有30天的月份(4,6,9,11),day变量值为30;
如果是有29天的月份(闰年的2月),day变量值为29;
如果是有28天的月份(非闰年的2月),day变量值为28。
2.根据所执行的操作,可列出NextDate函数的动作桩:
a1:
不可能;a2:
day加1;a3:
day复位;a4:
month加1;a5:
month复位;a6:
year加1考虑到决策表的规模,条件使用month、day、year变量的等价类,在以下等价类集合上建立决策表:
对于month变量的取值
M1:
{mouth:
mouth有30天};M2:
{mouth:
mouth有31天,12月除外};
M3:
{mouth:
mouth有12月};M4:
{mouth:
mouth是2月};
对于day变量的取值
D1:
{day:
1≤day≤27};D2:
{day:
day=28};
D3:
{day:
day=29};D4:
{day:
day=30};D5:
{day:
day=31};
对于year变量的取值
Y1:
{year:
year是闰年};Y2:
{year:
year不是闰年}
month变量的有效等价类:
M1:
{month=4,6,9,11}M2:
{month=1,3,5,7,8,10}
M3:
{month=12}M4:
{month=2}
day变量的有效等价类:
D1:
{1≤day≤27}D2:
{day=28}
D3:
day=29}D4:
{day=30}D5:
{day=31}
year变量的有效等价类:
Y1:
{year是闰年}Y2:
{year不是闰年}
3.考虑各种有效的输入情况,程序中可能采取的操作有以下六种:
a1:
不可能a2:
日增1a3:
日期复位a4:
月增1a5:
月复位a6:
年增1
4.绘制决策表:
5.设计测试用例:
6、实验总结
通过本次实验,我完成了动态测试技术,并且使用决策表法和覆盖法分别测试了Nextday程序和三角形程序,通过亲自上机测试,解决了程序中存在的一些bug,更加深刻的体会到测试的重要性。
附录源程序清单
1、Nextday
//date11.cpp
#include
usingnamespacestd;
classDate
{intday;
intmonth;
intyear;
public:
intYear();
intMonth();
intDay(intday1,intmonth1,intyear1);
};
intDate:
:
Year()
{
returnyear;
}
intDate:
:
Month()
{
returnmonth;
}
intDate:
:
Day(intday1,intmonth1,intyear1)
{
if(month1==1||month1==3||month1==5||month1==7||month1==8||month1==10||month1==12)
{
if(day1<31)
{
day1++;
day=day1;
month=month1;
}
elseif(day1==31)
{
day1=1;
month1++;
month=month1;
month1--;
}
else
{
cout<<"error1"<return0;
}
}
day=day1;
if(month1==4||month1==6||month1==9||month1==11)
{
if(day1<30)
{
day1++;
//day=day1;
month=month1;
}
elseif(day1==30)
{
day1=1;
month1++;
month=month1;
month1--;
}
else
{
cout<<"error2"<return0;
}
day=day1;
}
//day=day1;
if(month>12)
{
month=1;
//day=1;
year1++;
}
year=year1;
if(year>2050)//1912
{
cout<<"超出范围"<return0;
}
if(month1==2)
{
if(year1%4==0&&year1%100!
=0||year1%400==0)
{
if(day1<29)
{
day1++;
//day=day1;
month=month1;
}
elseif(day1==29)
{
month1++;
day1=1;
month=month1;
}
else
{
cout<<"error3"<return0;
}
day=day1;
}
else
{
if(day1<28)
{
day1++;
//day=day1;
month=month1;
}
elseif(day1==28)
{
month1++;
day1=1;
//day=day1;
month=month1;}
else
{
cout<<"error4"<return0;
}
day=day1;
}}
returnday;
}
intmain()
{
DateDATE;
Date*p=&DATE;
inta=0,b=0,c=0;
while(true)
{
cout<<"请输入日期:
(依次输入年月日)(按0退出)"<cin>>a;
if(a==0)
break;
cout<<"年"<cin>>b;
cout<<"月"<cin>>c;
cout<<"日"<if(a>=1912&&a<=2050&&b>=1&&b<=12&&c>=1&&c<=31)
{
//DATE->Day(a,b,c);
intdd=p->Day(c,b,a);
if(dd)
{
//DATE->Year();cout<year<<"年"<month<<"月"<day<<"日"<cout<Year()<<"年"<Month()<<"月"<}
else
{
continue;
}
}
else
{
cout<<"输入的内容不和题意"<continue;
}
}
return0;
}