软件测试大作业_第1页
软件测试大作业_第2页
软件测试大作业_第3页
软件测试大作业_第4页
软件测试大作业_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上软件质量保证与软件测试大作业基于蔡勒公式星期计算程序测试报告专 业 班 级 姓 名 学 号 2011 年 春季 学期1问题的提出1.1问题的来源这次实验一开始打算测试PreDate或者计算器,老师在课上告诉我们什么是好程序,要编写好程序,要有好的编程习惯。回想一下我以前上机也是直接打#include就盲目地开始了。在电脑上翻开了以前C+课上编的一个根据日期计算星期的作业,编的实在太烂了。程序如下:#include<iostream.h>void main() int y,m,d,x,i,sum=0; int aa13=0,0,31,60,91,121,15

2、2,182,213,244,274,305,335; int bb13=0,0,31,59,90,120,151,181,212,243,273,304,334; cout<<"please input year:" cin>>y; cout<<"please input month:" cin>>m; cout<<"please input day:" cin>>d; if(y<1|m<1|m>12)cout<<"输入了非

3、法的日期;"return; /对非法日期的判断 if(m=1|m=3|m=5|m=7|m=8|m=10|m=12)&&(d<1|d>31)return; if( (m=4|m=6|m=9|m=11)&&(d<1|d>30) )return; if( (y%4=0&&y%100!=0|y%400=0)&&m=2&&(d<1|d>29) )return; if( (m=2)&&!(y%4=0&&y%100!=0|y%400=0)&&a

4、mp;(d<1|d>28) )return; for(i=1;i<y;i+) /计算公元一年到本日的上一年年底的天数 if(i%4=0&&i%100!=0|i%400=0) sum+=366; else sum+=365; if(y%4=0&&y%100!=0|y%400=0) sum+=aam;sum+=d;/计算一年到本日的总天数 else sum+=bbm;sum+=d; x=sum%7; if(x!=0) cout<<"输入的日期是星期:"<<x<<endl; else cout&

5、lt;<"输入的日期是星期日;"<<endl;别的问题先不说,光是那两个数组就很糟糕,如果让别人读根本就不能读明白,自己也是费了较大力气才读懂,运行以后发现了好多Bug,根本就不是一个可使用的程序。于是就决定把这个程序重新尽自己的所学,做一个比较好的版本。就有了这个测试作业的选题。1.2星期计算公式蔡勒公式蔡勒(Zeller)公式,是一个计算星期的公式,给一个日期,就能用这个公式推算出是星期几。但是由于罗马教皇格里高利十三世在1582年组织了一批天文学家,根据哥白尼日心说计算出来的数据,对儒略历作了修改。将1582年10月5日到14日之间的10天宣布撤销,

6、继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月要看作上一年的

7、13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算) d:日 代表取整,即只要整数部分。 后来人们将这一新的历法称为“格里高利历”,简称格里历或公历。1.3软件的功能概述根据日期计算星期就是用户想知道某一个日期所对应的是星期几,比如用户想知道自己的生日那天是星期几,好安排自己的生日Party。该软件可以实现用户的需求。如果用户输入一个日期,把输入的日期所对应的星期快速输出出来。2星期计算程序的细节2.1星期计算程序的整体描述及函数之间的关系软件在一个C+控制台工程文件里面,如图2-1所示。图2-1 Visual studio 2010中SoftWareTest工程星期

8、计算程序的总体结构分析软件是由包含main函数在内的三个函数实现的其中bool checkDay(int year,int month,int day)专门用于检测所输入的数字日期字符是不是符合逻辑;int dayToWeek(int year,int month,int day)专门用于计算所输入日期所对应的星期;int main()函数,是程序的主函数,它用来接收并初步检测用户的输入,然后调用checkDay(int year,int month,int day)函数以确保输入的日期是合法的日期,随后调用int dayToWeek(int year,int month,int day)函数

9、实现计算,同时由于星期日所对应的返回值是0,故要对其进行单独处理。图2-2 程序流程图2.2 星期计算程序的C+实现#include<iostream>using namespace std;bool checkDay(int year,int month,int day) /此函数用于检测所输入的年月日是不 /是一个合乎逻辑的年月日;if(year<=0) return false; if(month<1|month>12)return false; int m= 31,0,31,30,31,30,31,31,30,31,30,31; /定义一个月份所对应的天数

10、的数组,2if(year%4=0&&year%100!=0|year%400=0) /月是变化的所以暂时设为0;m1=29; /是闰年,2月29天;else m1=28; /是平年;return(day>=1)&&(day <=mmonth-1); /根据月份对应天数的数组判断日 /是不是合法;int dayToWeek(int year,int month,int day)/该函数采用蔡勒公式计算日期所对应的 /星期;int y,c,w,m,d,week;int sum=year*10000+month*100+day;/为了分开1584年10月4

11、日之前和之后,if (month<3) /之后的日子sum大于;month+=12; /蔡勒公式对1月2月的处理是月份加12年减一;year-; y=year%100;c=year/100;m=month;d=day;if(sum>)w=y+int(y/4)+int(c/4)-2*c+int(26*(m+1)/10)+d-1;/蔡勒公式1582年10月/4日之后的计算公式;else w=y+int(y/4)+int(c/4)-2*c+int(13*(m+1)/5)+d+3; /蔡勒公式1582年10月/4日之前的计算公式;week=(w%7+7)%7;return week;int

12、 main() int year,month,day,week;do cout<<"请输入年份: " /使用do while循环能让代码无条/件执行一次,以避免不满足初始检测条件cin>>year;while(!cin | isalpha(getchar() /循环避免输入的不是数字字符 cin.clear(); cin.ignore(1024,'n'); cout<<"输入非数字年份,重新输入年份!"<<endl; cin>>year;cout<<"请输入

13、月份: "cin>>month;while(!cin | isalpha(getchar() cin.clear(); cin.ignore(1024,'n'); cout<<"输入非数字月份,重新输入月份!"<<endl; cin>>month;cout<<"请输入日期: "cin>>day;while(!cin | isalpha(getchar() cin.clear(); cin.ignore(1024,'n'); cout<&

14、lt;"输入非数字日期,重新输入日期!"<<endl; cin>>day;while (!checkDay(year,month,day); /在所输入的都是数字字符之后检测/日期的逻辑,使得日期是合法的;week=dayToWeek(year,month,day); /利用得到的合法/日期调用星期计算函数;cout<<"所输入的日期是:"<<year<<"年"<<month<<"月"<<day<<"

15、;日"<<endl;if(week=0) cout<<"日期所对应的是星期日"<<endl; /由于dayToWeek()/函数返回值是int,所以星期日在此时才处理;else cout<<"日期所对应的是星期:"<<week<<endl;3星期计算程序的测试思路3.1功能性测试程序的规格说明很明确,功能也很单一,对其进行功能性测试,以希望能尽可能对程序的运行结果进行全面合理的判断。3.1.1边界值测试使用边界值测试里的最坏情况测试,由于程序输入变量是三个,所以可使用三重循

16、环解决边界值测试,开发出测试程序。由于网络上万年历比较权威的产品日期是从1901-2050,所以我进行边界值测试,年的边界的选取就按1901-2050来进行。虽然程序可以计算任意合法日期的星期,但是为了验证测试结果,所以只能做这样的选择。图3-1是进行测试结果验证的万年历。图3-1 用于验证测试结果的万年历3.1.2弱健壮等价类测试由于年月日这三个变量之间存在很强的依赖性,使用边界值测试难免会存在冗余和漏洞,所以继续进行等价类测试,希望能尽可能进行完备的测试,同时也能避免冗余。测试考虑无效等价类得到如下的等价类:M1=月份:1月份12D1=日期:1日期31Y1=年:0年 3.1.3基于决策表测

17、试月日年三者之间存在着很强的逻辑依赖关系,所以可以选取基于决策表的测试避免大量的冗余,同时也能较全面的覆盖M1=月份:每月有30天M2=月份:每月有31天M3=月份:此月是2月D1=日期:1日期28D2=日期:日期=29D3=日期:日期=30D4=日期:日期=31Y1=年:年是闰年Y2=年:年是平年12345678910C1:月在M1M1M1M1M2M3M3M3M3M3C2:日在D1D2D3D4D1D2D2D3D4C3:年在Y1Y2行为输入 无效XXXX输入有效XXXXXX3.2结构性测试前面分析了系统使用三种功能性测试,由于功能性测试存在潜在的大量的冗余和漏洞,所以在此继续进行结构性测试,以

18、期达到较完备的测试。专心-专注-专业#include<iostream>using namespace std;bool checkDay(int year,int month,int day) /此函数用于检测所输入的年月日是不 /是一个合乎逻辑的年月日;if(year<=0) return false; if(month<1|month>12)return false; int m= 31,0,31,30,31,30,31,31,30,31,30,31; /定义一个月份所对应的天数的数组,2if(year%4=0&&year%100!=0|ye

19、ar%400=0) /月是变化的所以暂时设为0;m1=29; /是闰年,2月29天;else m1=28; /是平年;return(day>=1)&&(day <=mmonth-1); /根据月份对应天数的数组判断日 /是不是合法;int dayToWeek(int year,int month,int day)/该函数采用蔡勒公式计算日期所对应的 /星期;int y,c,w,m,d,week;int sum=year*10000+month*100+day;/为了分开1584年10月4日之前和之后,if (month<3) /之后的日子sum大于;month

20、+=12; /蔡勒公式对1月2月的处理是月份加12年减一;year-; y=year%100;c=year/100;m=month;d=day;if(sum>)w=y+int(y/4)+int(c/4)-2*c+int(26*(m+1)/10)+d-1;/蔡勒公式1582年10月/4日之后的计算公式;else w=y+int(y/4)+int(c/4)-2*c+int(13*(m+1)/5)+d+3; /蔡勒公式1582年10月/4日之前的计算公式;week=(w%7+7)%7;return week;int main() int year,month,day,week;do cout&

21、lt;<"请输入年份: " /使用do while循环能让代码无条/件执行一次,以避免不满足初始检测条件cin>>year;while(!cin | isalpha(getchar() /循环避免输入的不是数字字符 cin.clear(); cin.ignore(1024,'n'); cout<<"输入非数字年份,重新输入年份!"<<endl; cin>>year;cout<<"请输入月份: "cin>>month;while(!cin |

22、isalpha(getchar() cin.clear(); cin.ignore(1024,'n'); cout<<"输入非数字月份,重新输入月份!"<<endl; cin>>month;cout<<"请输入日期: "cin>>day;while(!cin | isalpha(getchar() cin.clear(); cin.ignore(1024,'n'); cout<<"输入非数字日期,重新输入日期!"<<en

23、dl; cin>>day;while (!checkDay(year,month,day); /在所输入的都是数字字符之后检测/日期的逻辑,使得日期是合法的;week=dayToWeek(year,month,day); /利用得到的合法/日期调用星期计算函数;cout<<"所输入的日期是:"<<year<<"年"<<month<<"月"<<day<<"日"<<endl;if(week=0) cout<

24、<"日期所对应的是星期日"<<endl; /由于dayToWeek()/函数返回值是int,所以星期日在此时才处理;else cout<<"日期所对应的是星期:"<<week<<endl;根据程序图可以得到DD路径图如下所示:第一2345678最后1211913图3-2 DD-路径图 上面所示的DD-路径图包含了太多的循环,找出所有路径来非常困难,前面一些循环主要是为了测试输入的年月日是数字字符,使用的检测方式也是C+标准库函数,所以在这里去掉字符检测,年大于0判断,简化上面的DD-路径,得到的简化模

25、型如下所示:开始62134结束5图3-3 简化后的DD-路径图根据路径覆盖准则可以生成测试用例,同时要避免冗余。结构性测试覆盖指标达到C1,即所有DD路径,根据这个指标可以开发相应的测试用例。DD-路径有:(1)开始->1->2->3->4->5->结束 (2)开始->1->2->3->4->6->结束 (3)开始->1->2->1->3->4->5->结束 (4)开始->1->2->1->3->4->6->结束 (5)开始->1-&

26、gt;2->3->1->2->3->4->5->结束 (6)开始->1->2->3->1->2->3->4->6->结束 (7)开始->1->2->3->1->2->1->2->3->4->5->结束 (8)开始->1->2->3->1->2->1->2->3->4->6->结束3.3本章小结本章针对被测程序分析系统要采取边界值测试中的最坏情况测试,弱健壮等价类测试,基

27、于决策表的测试,当然这些都是功能性测试。同时也根据DD路径图分析了结构性测试用例的开发。下一章将根据本章的内容生成测试用例。4测试用例(1)根据上一章测试思路里面的分析,我们要采用最坏情况测试,下表就是最坏情况测试的测试用例测试用例月份日期年份预期输出实际输出是否正确11119012Y21219013Y311519012Y413019013Y513119014Y62119015Y72219016Y821519015Y92301901日期不存在Y102311901日期不存在Y116119016Y126219010Y1361519016Y1463019010Y156311901日期不存在Y1611

28、119015Y171121901619113019016Y2011311901日期不存在Y2112119010Y2212219011Y23121519010Y24123019011Y25123119012Y261119023Y271219024Y2811519023Y2913019024Y3013119025Y312119026Y322219020Y3321519026Y342301902日期不存在Y352311902日期不存在Y366119020Y376219021Y3861519020Y3963019021Y406311902日期不存在Y4111119026Y42

29、11219020Y43111519026Y44113019020Y4511311902日期不存在Y4612119021Y4712219022Y48121519021Y49123019022Y50123119023Y511120006Y521220000Y5311520006Y5413020000Y5513120001Y562120002Y572220003Y5821520002Y592302000日期不存在Y602312000日期不存在Y616120004Y626220005Y6361520004Y6463020005Y656312000日期不存在Y6611120003Y6711220004Y

30、68111520003Y69113020004Y7011312000日期不存在Y7112120005Y7212220006Y73121520005Y74123020006Y75123120000Y761120495Y771220496Y7811520495Y7913020496Y8013120490Y812120491Y822220492Y8321520491Y842302049日期不存在Y852312049日期不存在Y866120492Y876220493Y8861520492Y8963020493Y906312049日期不存在Y9111120491Y9211220492Y931115204

31、91Y94113020492Y9511312049日期不存在Y9612120493Y9712220494Y98121520493Y99123020494Y100123120495Y1011120506Y1021220500Y10311520506Y10413020500Y10513120501Y1062120502Y1072220503Y10821520502Y1092302050日期不存在Y1102312050日期不存在Y1116120503Y1126220504Y11361520503Y11463020504Y1156312050日期不存在Y11611120502Y11711220503Y118111520502Y119113020503Y12011312050日期不存在Y12112120504Y12212220505Y123121520504Y124123020505Y125123120506Y(2)根据弱健壮等价类的划分,以及弱健壮等价类基本原理,弱健壮等价类测试一共产生6个测试用例,因此所得到的测试用例如下表所示:测试用例月份日期年份预期输出实际输出是否正确WR161520112YWR2-1152011月份无效YWR313152011月份无效YWR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论