软件测试大作业

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

《软件质量保证与软件测试》大作业基于蔡勒公式星期计算程序测试报告专业班级姓名学号2011年春季学期21.问题的提出1.1问题的来源这次实验一开始打算测试PreDate或者计算器,老师在课上告诉我们什么是好程序,要编写好程序,要有好的编程习惯。回想一下我以前上机也是直接打#include就盲目地开始了。在电脑上翻开了以前C++课上编的一个根据日期计算星期的作业,编的实在太烂了。程序如下:#includeiostream.hvoidmain(){inty,m,d,x,i,sum=0;intaa[13]={0,0,31,60,91,121,152,182,213,244,274,305,335};intbb[13]={0,0,31,59,90,120,151,181,212,243,273,304,334};coutpleaseinputyear:;ciny;coutpleaseinputmonth:;cinm;coutpleaseinputday:;cind;if(y1||m1||m12){cout输入了非法的日期;;return;}//对非法日期的判断if((m==1||m==3||m==5||m==7||m==8||m==10||m==12)&&(d1||d31))return;if((m==4||m==6||m==9||m==11)&&(d1||d30))return;if((y%4==0&&y%100!=0||y%400==0)&&m==2&&(d1||d29))return;if((m==2)&&!(y%4==0&&y%100!=0||y%400==0)&&(d1||d28))return;for(i=1;iy;i++)//计算公元一年到本日的上一年年底的天数{if(i%4==0&&i%100!=0||i%400==0)sum+=366;elsesum+=365;}if(y%4==0&&y%100!=0||y%400==0){sum+=aa[m];sum+=d;}//计算一年到本日的总天数else{sum+=bb[m];sum+=d;}x=sum%7;if(x!=0)3cout输入的日期是星期:xendl;elsecout输入的日期是星期日;endl;}别的问题先不说,光是那两个数组就很糟糕,如果让别人读根本就不能读明白,自己也是费了较大力气才读懂,运行以后发现了好多Bug,根本就不是一个可使用的程序。于是就决定把这个程序重新尽自己的所学,做一个比较好的版本。就有了这个测试作业的选题。1.2星期计算公式——蔡勒公式蔡勒(Zeller)公式,是一个计算星期的公式,给一个日期,就能用这个公式推算出是星期几。但是由于罗马教皇格里高利十三世在1582年组织了一批天文学家,根据哥白尼日心说计算出来的数据,对儒略历作了修改。将1582年10月5日到14日之间的10天宣布撤销,继10月4日之后为10月15日。因此,蔡勒公式只适合于1582年10月15日之后的情形。w=[c/4]–2c+y+[y/4]+[13*(m+1)/5]+d-1OR:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1若要计算的日期是在1582年10月4日或之前,公式则为w=y+[y/4]+[c/4]-2c+[13(m+1)/5]+d+3符号意义w:星期;w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六c:世纪-1(前两位数)y:年(后两位数)m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)d:日[]代表取整,即只要整数部分。后来人们将这一新的历法称为“格里高利历”,简称格里历或公历。41.3软件的功能概述根据日期计算星期就是用户想知道某一个日期所对应的是星期几,比如用户想知道自己的生日那天是星期几,好安排自己的生日Party。该软件可以实现用户的需求。如果用户输入一个日期,把输入的日期所对应的星期快速输出出来。2.星期计算程序的细节2.1星期计算程序的整体描述及函数之间的关系软件在一个C++控制台工程文件里面,如图2-1所示。图2-1Visualstudio2010中SoftWareTest工程星期计算程序的总体结构分析软件是由包含main函数在内的三个函数实现的其中boolcheckDay(intyear,intmonth,intday)专门用于检测所输入的数字日期字符是不是符合逻辑;intdayToWeek(intyear,intmonth,intday)专门用于计算所输入日期所对应的星期;intmain()函数,是程序的主函数,它用来接收并初步检测用户的输入,然后调用checkDay(intyear,intmonth,intday)函数以确保输入的日期是合法的日期,随后调用intdayToWeek(intyear,intmonth,intday)函数实现计算,同时由于星期日所对应5的返回值是0,故要对其进行单独处理。图2-2程序流程图2.2星期计算程序的C++实现#includeiostreamusingnamespacestd;boolcheckDay(intyear,intmonth,intday)//此函数用于检测所输入的年月日是不{//是一个合乎逻辑的年月日;if(year=0)returnfalse;if(month1||month12)returnfalse;6intm[]={31,0,31,30,31,30,31,31,30,31,30,31};//定义一个月份所对应的天数的数组,2if(year%4==0&&year%100!=0||year%400==0)//月是变化的所以暂时设为0;m[1]=29;//是闰年,2月29天;elsem[1]=28;//是平年;return(day=1)&&(day=m[month-1]);//根据月份对应天数的数组判断日}//是不是合法;intdayToWeek(intyear,intmonth,intday)//该函数采用蔡勒公式计算日期所对应的{//星期;inty,c,w,m,d,week;intsum=year*10000+month*100+day;//为了分开1584年10月4日之前和之后,if(month3)//之后的日子sum大于15841004;{month+=12;//蔡勒公式对1月2月的处理是月份加12年减一;year--;}y=year%100;c=year/100;m=month;d=day;if(sum15821004)w=y+int(y/4)+int(c/4)-2*c+int(26*(m+1)/10)+d-1;//蔡勒公式1582年10月//4日之后的计算公式;elsew=y+int(y/4)+int(c/4)-2*c+int(13*(m+1)/5)+d+3;//蔡勒公式1582年10月//4日之前的计算公式;week=(w%7+7)%7;returnweek;}intmain(){intyear,month,day,week;do{cout请输入年份:;//使用dowhile循环能让代码无条//件执行一次,以避免不满足初始检测条件cinyear;while(!cin||isalpha(getchar()))//循环避免输入的不是数字字符{cin.clear();cin.ignore(1024,'\n');cout输入非数字年份,重新输入年份!endl;cinyear;}7cout请输入月份:;cinmonth;while(!cin||isalpha(getchar())){cin.clear();cin.ignore(1024,'\n');cout输入非数字月份,重新输入月份!endl;cinmonth;}cout请输入日期:;cinday;while(!cin||isalpha(getchar())){cin.clear();cin.ignore(1024,'\n');cout输入非数字日期,重新输入日期!endl;cinday;}}while(!checkDay(year,month,day));//在所输入的都是数字字符之后检测//日期的逻辑,使得日期是合法的;week=dayToWeek(year,month,day);//利用得到的合法//日期调用星期计算函数;cout所输入的日期是:year年month月day日endl;if(week==0)cout日期所对应的是星期日endl;//由于dayToWeek()//函数返回值是int,所以星期日在此时才处理;elsecout日期所对应的是星期:weekendl;}3.星期计算程序的测试思路3.1功能性测试程序的规格说明很明确,功能也很单一,对其进行功能性测试,以希望能尽可能对程序的运行结果进行全面合理的判断。3.1.1边界值测试使用边界值测试里的最坏情况测试,由于程序输入变量是三个,所以可使用三重循环解决边界值测试,开发出测试程序。由于网络上万年历比较权威的产品8日期是从1901-2050,所以我进行边界值测试,年的边界的选取就按1901-2050来进行。虽然程序可以计算任意合法日期的星期,但是为了验证测试结果,所以只能做这样的选择。图3-1是进行测试结果验证的万年历。图3-1用于验证测试结果的万年历3.1.2弱健壮等价类测试由于年月日这三个变量之间存在很强的依赖性,使用边界值测试难免会存在冗余和漏洞,所以继续进行等价类测试,希望能尽可能进行完备的测试,同时也能避免冗余。测试考虑无效等价类得到如下的等价类:M1={月份:1≤月份≤12}D1={日期:1≤日期≤31}Y1={年:0≤年}3.1.3基于决策表测试月日年三者之间存在着很强的逻辑依赖关系,所以可以选取基于决策表的测试避免大量的冗余,同时也能较全面的覆盖9M1={月份:每月有30天}M2={月份:每月有31天}M3={月份:此月是2月}D1={日期:1≤日期≤28}D2={日期:日期=29}D3={日期:日期=30}D4={日期:日期=31}Y1={年:年是闰年}Y2={年:年是平年}12345678910C1:月在M1M1M1M1M2M3M3M3M3M3C2:日在D1D2D3D4—D1D2D2D3D4C3:年在——————Y1Y2——行为输入无效XXXX输入有效XXXXXX3.2结构性测试前面分析了系统使用三种功能性测试,由于功能性测试存在潜在的大量的冗余和漏洞,所以在此继续进行结构性测试,以期达到较完备的测试。#includeiostream1usingnamespacestd;2boolcheckDay(intyear,intmonth,intday)//此函数用于检测所输入的年月日是不3{//是一个合乎逻辑的年月日;4if(year=0)5returnfalse;6if(month1||month12)7returnfalse;8intm[]=9{31,0,31,30,31,30,31,31,30,31,30,31};//定义一个月份所对应的天数的数组,210if(year%4==0&&year%100!=0||year%400==0)//月是变化的所以暂时设为0;11m[1]=29;//是闰年,2月29天;12elsem[1]=28;//是平年;13return(day=1)&&(day=m[month-1]);//根据月份对应天数的数组判断日14}//是不是合法;1516intdayToWeek(intyear,intmonth,intday)//该函数采用蔡勒公式计算日期所对应的17{//星期;18inty,c,w,m,d,week;19

1 / 21
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功