判定表示例-NextDate计算
- 格式:xls
- 大小:17.50 KB
- 文档页数:2
NextDate函数测试用例1.测试程序源代码#include\#includeuingnamepacetd;voidNe某tDate(intyear,intmonth,intday);voidmain(){intyear=0,month=0,day= 0;Ne某tDate(year,month,day);}voidNe某tDate(intyear,intmonth,intday){cout<>year;while(!(year>=1911&&ye ar<=2022)){cout<>year;}cout<>month;while(month>12||month<1){ }cout<>month;cout<>day;while(day>31||day<1){cout<>day;}inti=0;i=day-29;while(month==2&&i>0){cout<>day;}if(month==2&&day==29){month=3;day=1;}eleday++;} eleday++;//月底计算;witch(month){cae1:cae3:cae5:cae7:cae8:cae10:if(day==32){month++; day=1;cout<if(day==31){month++;day=1;cout<cout<break;cout<白盒测试1开始2输入年、月、日43日期是否合法?无效日期5闰年的2月29日或者非闰年的2月28日6明天为3月1日87大月的31号或者小月的30号下个月是否大于129下个月1号1011日期加11月1号12结束DD-路径情况1.由一个节点组成,内度=0情况2.由一个节点组成,外度=0情况3.由一个节点组成,内度>=2或外度>=2情况4.由一个节点组成,内度=1并且外度=1情况5.长度>=1的最大链情况2:节点6、节点9、节点10情况3:节点2、节点3、节点5、节点7、节点8情况4:节点4、节点11白盒测试对每条DD-路径测试用例用例说明输入正确的年、月、日输入错误的年、月、日输入错误的年、月、日输入错误的年、月、日输入闰年2月29日输入非闰年2月28日输入大月31日输入小月30日输入12月31日输入数据预期结果实际结果2022年6月15日2022年6月16日2022年6月16日2501年6月15日日期输入有误输入有误,重新输入2022年6月33日日期输入有误输入有误,重新输入2022年13月15日日期输入有误输入有误,重新输入2000年2月29日2000年3月1日2000年3月1日2001年2月28日2001年3月1日2001年3月31日2001年4月1日2001年4月30日2001年5月1日2004年12月31日2005年1月1日2001年3月1日2001年4月1日2001年5月1日2005年1月1日。
NextDate函数部分代码public class NextDate {/**年*/private int year;/**月*/private int month;/**日*/private int day;/**构造方法*@param year、month、day:年、月、日;*/public NextDate(int year, int month, int day){ this.year = year;this.month = month;this.day = day;}/**构造方法*/public NextDate(){year = 1;month = 1;day = 1;}/**获得年*@return获得年*/public int getyear(){return this.year;}/**获得月份*@return获得月份*/public int getmonth(){return this.month;}/**获得日期*@return获得日期*/public int getday(){return this.day;}/**判断闰年*@return是否闰年*/public boolean isleap(){if(( this.year%4==0 && this.year%100!=0 )||(this.year%400==0)){ return true;}else {return false;}}/**计算当前日期的下一天*/public void nextday( ){switch(this.month){case 1:case 3:case 5:case 7:case 8:case 10:if(this.day == 31){this.month = this.month + 1;this.day = 1;}else{this.day = this.day + 1;}break;case 4:case 6:case 9:case 11:if(this.day == 30){this.month = this.month + 1;this.day = 1;}else{this.day = this.day + 1;}break;case 12:if(this.day == 31){this.month = 1;this.day = 1;this.year = this.year + 1;}else{this.day = this.day + 1;}break;case 2:if(this.isleap()){if(this.day == 29){this.day = 1;this.month = 3;}else{this.day = this.day + 1;}}else{if(this.day == 28){this.day = 1;this.month = 3;}else{this.day = this.day + 1;}}break;}}/***计算下一天*@param date日期*@return下一天的日期*/public NextDate nextday( NextDate date ){ switch(date.month){case 1:case 3:case 5:case 7:case 8:case 10:if(date.day == 31){date.month = date.month + 1;date.day = 1;}else{date.day = date.day + 1;}break;case 4:case 6:case 9:case 11:if(date.day == 30){date.month = date.month + 1;date.day = 1;}else{date.day = date.day + 1;}break;case 12:if(date.day == 31){date.month = 1;date.day = 1;date.year = date.year + 1;}else{date.day = date.day + 1;}break;case 2:if(date.isleap()){if(date.day == 29){date.day = 1;date.month = 3;}else{date.day = date.day + 1;}}else{if(date.day == 28){date.day = 1;date.month = 3;}else{date.day = date.day + 1;}}break;}return date;}/***判断日期是否有效*@param date日期*@return是否有效*/public boolean isDate(NextDate date){boolean flag = true;if((date.year<0)||(date.year>2050)){flag = false;}if((date.month<1)||(date.month>12)){flag = false;}else{switch(date.month){case 1:case 3:case 5:case 7:case 8:case 10:case 12:if((date.day > 31)||(date.day<1))flag = false;break;case 4:case 6:case 9:case 11:if((date.day > 30)||(date.day<1)){flag = false;}break;case 2:if(date.isleap()){if((date.day > 29)||(date.day < 1))flag = false;}else{if((date.day > 28)||(date.day < 1))flag = false;}break;}}return flag;}}。
软件测试NextDate函数决策表测试法实验报告一、实验目的:掌握黑盒测试中的决策表测试法,并对被测程序设计测试用例。
二、实验环境操作系统:Windows XP + SP2 /win7三、实验内容1、编写一个NextDate函数。
2、掌握黑盒测试中的决策表测试法的基本步骤。
3、使用决策表法设计测试用例,对编写的函数实施测试,总结分析测试结果。
四、实验步骤1、编写一个NextDate函数。
(C语言、C++)2、根据黑盒测试的决策表测试法设计测试用例。
3、根据测试用例实施测试,并记录测试结果。
五、实验代码#include using namespace std; int a,b,c,y,m,d; //判断是否为闰年bool Feb(int y){ if((2060-y)%4==0) return 1; elsereturn 0;} //年份的累加int NextYear(int y){ a=y+1;if(a>2060){cout<return a;} //月份的累加int NextMonth(int m){ b=m+1; if(b==13){ b=1;NextYear(y);} return b;} //天数的累加int NextDay(int d){ c=d+1;//大月满32天月份加1 if(c==32){if(m==1|m==3|m==5|m==7|m==8|m==10|m==12) {c=1;NextMonth(m);}}//小月满31天月份加1 if(c==31){if(m==4|m==6|m==9|m==11) {c=1;NextMonth(m);}}//若为闰年,2月满30天,月份加1 if(c==30){if(Feb(y)&&m==2){ c=1; b=3;}}//若不是闰年,2月满29天,月份加1 if(c==29){if(!Feb(y)&&m==2){ c=1; b=3;}} return c;} //NextDate函数int NextDate ( int y, int m, int d){ if(y<1900|y>2060|m<1|m>12|d<1|d>31){cout<if(m==4|m==6|m==9|m==11&&d==31) {cout<if(Feb(y)&&m==2&&d>29) {cout<if(!Feb(y)&&m==2&&d>28){cout<NextDay(d);cout<//main函数 int main() {while(1){cout << \请输入正确格式的日期.\cout << \年份范围是1960-2060\cout<>y; cout<>m;cout<>d; a=y; b=m; c=d;NextDate ( y, m, d);} return 0;}六、测试用例表NxetDate函数求解给定某个日期的下一个日期的动作桩如下:变量day加1操作;变量day复位操作;变量month加1操作;变量month复位操作;变量year加1操作NxetDate函数的求解关键是日和月的问题,所以可以在下面的条件桩的基础上建立决策表M1={month:month有30天};M2={month:month有31天,12月除外}; M3={month:month是12月};M4={month:month是2月};感谢您的阅读,祝您生活愉快。
NextDate函数测试用例选择NextDate函数,是因为它可以说明输入定义域中的依赖性问题,这使得这个例子成为基于决策表测试的一个完美例子,因为决策表可以突出这种依赖关系。
从前面对等价类测试的分析我们知道,等价类分析假设所有的变量都是独立的。
如果变量确实是独立的,则使用类的笛卡尔积是有意义的。
如果变量之间在输入定义域中存在逻辑依赖关系,则这些依赖关系在笛卡尔积中就会丢失(说抑制可能更确切)。
决策表格式通过使用“不可能动作”概念表示条件的不可能组合,使我们能够强调这种依赖关系。
下面将对NextDate函数的决策表描述做三次尝试。
第一次尝试标识合适的条件和动作,假设首先从分析等价类集合开始。
M1= {月份:每月有30天};M2 = {月份:每月有31天};M3二{月份:此月是2月}D1 = {日期:1<0期W 28}; D2 = {日期:日期=29}; D3 = {日期=30}; D4 = {日期=31}Y1 = {年:年是闰年}; Y2 = {年:年不是闰年}如果我们希望突出不可能的组合,则可以建立具有以下条件和动作的有限项决策表。
(请注意,年变量对应的等价类收缩为下表的一个条件。
)有2处条规则的第一袂尝试这个决策表会有256条规则,其中很多是不可能的。
如果要显示为什么这些规则是不可能的,可将动作修改为:al:月份中的天数太多;a2:不能出现在非闰年中;a3:计算NextDate.第二次尝试如果我们将注意力集中到NextDate函数的闰年问题上,则可以修改已有的等价类集合。
为了说明另一种决策表表示方法,这一次采用扩展项决策表开发,并更仔细地研究动作桩。
在构建扩展项决策表时,必须保证等价类构成输入定义域的真划分。
如果规则项之间存在“重叠”,则会存在冗余情况,使得多个规则都能够满足。
这里,Y2是一组1812〜2012之间的年份,并除以4, 2000除外。
M1= {月份:每月有30天}; M2 = {月份:每月有31天}; M3二{月份:此月是2月}D1 = {日期:1<0期W 28}; D2 = {日期:日期=29}; D3 = {日期=30}; D4 = {日期=31}Y1 = {年:年=2000}; Y2 = {年:年是闰年}; Y3 = {年:年是平年}从某种意义上说,我们采用的是“灰盒”技术,因为更仔细地研究了NextDate 函数。
3.3.1判定表法举例
例1:NextDate问题
试用判定表法设计该程序正确输入条件下的测试用例。
解答:
(2)判定表
例2:问题要求:“……对功率大于50马力的机器、维修记录不全或已运行10年以上的机器,应给予优先的维修处理……” 。
这里假定,“维修记录不全”和“优先维修处理”均已在别处有更严格的定义。
请建立判定表。
解答:
(1)确定规则的个数:这里有3个条件,每个条件有两个取值,故应有2*2*2=8种规则。
列出所有的条件桩和动作桩:
(2)填入条件项。
可从最后1行条件项开始,逐行向上填满。
如第三行是: Y N Y N Y N Y N,第二行是:Y Y N N Y Y N N等等。
(3)填入动作项。
这样便得到形如图的初始判定表。
(4)优化判定表。
简化、合并相似规则后得到下表。
NextData函数
设计测试用例
2. 用基于判定表的方法设计测试用例
(1)分析各种输入情况,列出为输入变量month、day、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≤日期≤27}
D2={日期:日期=28}
D3={日期:日期=29}
D4={日期:日期=30}
D5={日期:日期=31}
year变量的有效等价类:
Y1 = { year是闰年}
Y2 = { year不是闰年}
(2)分析程序规格说明,结合以上等价类划分的情况给出问题规定的可能采取的操作(即列出所有的动作桩)。
考虑各种有效的输入情况,程序中可能采取的操作有以下六种:
a1:不可能
a2:日期增1
a3:日期复位
a4:月份增1
a5:月份复位
a6:年增1
(3)根据步骤(1)和(2),画出判定表。
对判定表进行化简。
简化后的判定表,如表1-2所示。
(4)对判定表进行化简。
简化后的判定表,如表1-3所示。
表1.3(续)
(5)设计测试用例
为判定表中的每一列设计一个测试用例,见表1-4。
表 1.4 NextDate测试用例。
NextData函数一、问题描述程序有三个输入变量month、day、year(month、day和year均为整数值,并且满足:1≤month≤12、1≤day≤31、1900≤year ≤2050。
),分别作为输入日期的月份、日、年份,通过程序可以输出该输入日期在日历上下一天的日期。
例如,输入为2005年11月29日,则该程序的输出为2005年11月30日。
请用黑盒测试方法设计测试用例。
二、程序界面计算下一天的程序代码见附录。
三、设计测试用例1. 用边界值测试方法设计测试用例用健壮性测试法设计测试用例,按照下列步骤进行:(1)分析各变量的取值健壮性测试时,各变量分别取:略小于最小值、最小值、略高于最小值、正常值、略低于最大值、最大值和略大于最大值。
month:-1,1,2,6,11,12,13;day:-1,1,2,15,30,31,32year:1899,1900,1901,1975,2049,2050,2051;(2)测试用例数有n个变量的程序,其边界值分析会产生6n+1个测试用例。
这里有3个变量,因此会产生19个测试用例。
(3)设计测试用例,见表1-1。
NextDate函数的复杂性来源于两个方面:一是输入域的复杂性(即输入变量之间逻辑关系的复杂性),二是确定闰年的规则。
但是在进行健壮性测试时,没有考虑输入变量之间的逻辑关系,也没有考虑和闰年相关的问题,因此在设计测试用例时存在遗漏问题,比如和判断闰年相关的日期:2008.2.29、1999.2.28等。
表1-1NextDate函数测试用例2. 用基于判定表的方法设计测试用例(1)分析各种输入情况,列出为输入变量month、day、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≤日期≤27}D2={日期:日期=28}D3={日期:日期=29}D4={日期:日期=30}D5={日期:日期=31}year变量的有效等价类:Y1 = { year是闰年}Y2 = { year不是闰年}(2)分析程序规格说明,结合以上等价类划分的情况给出问题规定的可能采取的操作(即列出所有的动作桩)。