软件测试大作业.docx
- 文档编号:14671830
- 上传时间:2023-06-26
- 格式:DOCX
- 页数:27
- 大小:444.10KB
软件测试大作业.docx
《软件测试大作业.docx》由会员分享,可在线阅读,更多相关《软件测试大作业.docx(27页珍藏版)》请在冰点文库上搜索。
软件测试大作业
《软件质量保证与软件测试》大作业
基于蔡勒公式星期计算程序
测试报告
专业
班级
姓名
学号
2011年春季学期
1.问题的提出
问题的来源
这次实验一开始打算测试PreDate或者计算器,老师在课上告诉我们什么是好程序,要编写好程序,要有好的编程习惯。
回想一下我以前上机也是直接打#include就盲目地开始了。
在电脑上翻开了以前C++课上编的一个根据日期计算星期的作业,编的实在太烂了。
程序如下:
#include<>
voidmain()
{
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};
cout<<"pleaseinputyear:
";
cin>>y;
cout<<"pleaseinputmonth:
";
cin>>m;
cout<<"pleaseinputday:
";
cin>>d;
if(y<1||m<1||m>12){cout<<"输入了非法的日期;";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)&&(d<1||d>28))return;
for(i=1;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) cout<<"输入的日期是星期: "< elsecout<<"输入的日期是星期日;"< } 别的问题先不说,光是那两个数组就很糟糕,如果让别人读根本就不能读明白,自己也是费了较大力气才读懂,运行以后发现了好多Bug,根本就不是一个可使用的程序。 于是就决定把这个程序重新尽自己的所学,做一个比较好的版本。 就有了这个测试作业的选题。 星期计算公式——蔡勒公式 蔡勒(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-1 OR: 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: 日 []代表取整,即只要整数部分。 后来人们将这一新的历法称为“格里高利历”,简称格里历或公历。 软件的功能概述 根据日期计算星期就是用户想知道某一个日期所对应的是星期几,比如用户想知道自己的生日那天是星期几,好安排自己的生日Party。 该软件可以实现用户的需求。 如果用户输入一个日期,把输入的日期所对应的星期快速输出出来。 2.星期计算程序的细节 星期计算程序的整体描述及函数之间的关系 软件在一个C++控制台工程文件里面,如图2-1所示。 图2-1Visualstudio2010中SoftWareTest工程 星期计算程序的总体结构分析 软件是由包含main函数在内的三个函数实现的其中boolcheckDay(intyear,intmonth,intday)专门用于检测所输入的数字日期字符是不是符合逻辑; intdayToWeek(intyear,intmonth,intday)专门用于计算所输入日期所对应的星期; intmain()函数,是程序的主函数,它用来接收并初步检测用户的输入,然后调用checkDay(intyear,intmonth,intday)函数以确保输入的日期是合法的日期,随后调用intdayToWeek(intyear,intmonth,intday)函数实现计算,同时由于星期日所对应的返回值是0,故要对其进行单独处理。 图2-2程序流程图 星期计算程序的C++实现 #include usingnamespacestd; boolcheckDay(intyear,intmonth,intday)//此函数用于检测所输入的年月日是不 {//是一个合乎逻辑的年月日; if(year<=0) returnfalse; if(month<1||month>12) returnfalse; intm[]= {31,0,31,30,31,30,31,31,30,31,30,31};//定义一个月份所对应的天数的数组,2 if(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(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日之后的计算公式; 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循环能让代码无条 //件执行一次,以避免不满足初始检测条件 cin>>year; while(! cin||isalpha(getchar()))//循环避免输入的不是数字字符 { (); (1024,'\n'); cout<<"输入非数字年份,重新输入年份! "< cin>>year; } cout<<"请输入月份: "; cin>>month; while(! cin||isalpha(getchar())) { (); (1024,'\n'); cout<<"输入非数字月份,重新输入月份! "< cin>>month; } cout<<"请输入日期: "; cin>>day; while(! cin||isalpha(getchar())) { (); (1024,'\n'); cout<<"输入非数字日期,重新输入日期! "< cin>>day; } }while(! checkDay(year,month,day));//在所输入的都是数字字符之后检测 //日期的逻辑,使得日期是合法的; week=dayToWeek(year,month,day);//利用得到的合法 //日期调用星期计算函数; cout<<"所输入的日期是: "< if(week==0)cout<<"日期所对应的是星期日"< //函数返回值是int,所以星期日在此时才处理; elsecout<<"日期所对应的是星期: "< } 3.星期计算程序的测试思路 功能性测试 程序的规格说明很明确,功能也很单一,对其进行功能性测试,以希望能尽可能对程序的运行结果进行全面合理的判断。 边界值测试 使用边界值测试里的最坏情况测试,由于程序输入变量是三个,所以可使用三重循环解决边界值测试,开发出测试程序。 由于网络上万年历比较权威的产品日期是从1901-2050,所以我进行边界值测试,年的边界的选取就按1901-2050来进行。 虽然程序可以计算任意合法日期的星期,但是为了验证测试结果,所以只能做这样的选择。 图3-1是进行测试结果验证的万年历。 图3-1用于验证测试结果的万年历 弱健壮等价类测试 由于年月日这三个变量之间存在很强的依赖性,使用边界值测试难免会存在冗余和漏洞,所以继续进行等价类测试,希望能尽可能进行完备的测试,同时也能避免冗余。 测试考虑无效等价类得到如下的等价类: M1={月份: 1≤月份≤12} D1={日期: 1≤日期≤31} Y1={年: 0≤年} 基于决策表测试 月日年三者之间存在着很强的逻辑依赖关系,所以可以选取基于决策表的测试避免大量的冗余,同时也能较全面的覆盖 M1={月份: 每月有30天} M2={月份: 每月有31天} M3={月份: 此月是2月} D1={日期: 1≤日期≤28} D2={日期: 日期=29} D3={日期: 日期=30} D4={日期: 日期=31} Y1={年: 年是闰年} Y2={年: 年是平年} 1 2 3 4 5 6 7 8 9 10 C1: 月在 M1 M1 M1 M1 M2 M3 M3 M3 M3 M3 C2: 日在 D1 D2 D3 D4 — D1 D2 D2 D3 D4 C3: 年在 — — — — — — Y1 Y2 — — 行为 输入无效 X X X X 输入有效 X X X X X X 结构性测试 前面分析了系统使用三种功能性测试,由于功能性测试存在潜在的大量的冗余和漏洞,所以在此继续进行结构性测试,以期达到较完备的测试。 #include usingnamespacestd; boolcheckDay(intyear,intmonth,intday)//此函数用于检测所输入的年月日是不 {//是一个合乎逻辑的年月日; if(year<=0) returnfalse; if(month<1||month>12) returnfalse; intm[]= {31,0,31,30,31,30,31,31,30,31,30,31};//定义一个月份所对应的天数的数组,2 if(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(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日之后的计算公式; 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循环能让代码无条 //件执行一次,以避免不满足初始检测条件 cin>>year; while(! cin||isalpha(getchar()))//循环避免输入的不是数字字符 { (); (1024,'\n'); cout<<"输入非数字年份,重新输入年份! "< cin>>year; } cout<<"请输入月份: "; cin>>month; while(! cin||isalpha(getchar())) { (); (1024,'\n'); cout<<"输入非数字月份,重新输入月份! "< cin>>month; } cout<<"请输入日期: "; cin>>day; while(! cin||isalpha(getchar())) { (); (1024,'\n'); cout<<"输入非数字日期,重新输入日期! "< cin>>day; } }while(! checkDay(year,month,day));//在所输入的都是数字字符之后检测 //日期的逻辑,使得日期是合法的; week=dayToWeek(year,month,day);//利用得到的合法 //日期调用星期计算函数; cout<<"所输入的日期是: "< if(week==0)cout<<"日期所对应的是星期日"< //函数返回值是int,所以星期日在此时才处理; elsecout<<"日期所对应的是星期: "< } 根据程序图可以得到DD路径图如下所示: 图3-2DD-路径图 上面所示的DD-路径图包含了太多的循环,找出所有路径来非常困难,前面一些循环主要是为了测试输入的年月日是数字字符,使用的检测方式也是C++标准库函数,所以在这里去掉字符检测,年大于0判断,简化上面的DD-路径,得到的简化模型如下所示: 1 2 3 4 5 6 结束 图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->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->结束 本章小结 本章针对被测程序分析系统要采取边界值测试中的最坏情况测试,弱健壮等价类测试,基于决策表的测试,当然这些都是功能性测试。 同时也根据DD路径图分析了结构性测试用例的开发。 下一章将根据本章的内容生成测试用例。 4.测试用例 (1)根据上一章测试思路里面的分析,我们要采用最坏情况测试,下表就是最坏情况测试的测试用例 测试用例 月份 日期 年份 预期输出 实际输出是否正确 1 1 1 1901 2 Y 2 1 2 1901 3 Y 3 1 15 1901 2 Y 4 1 30 1901 3 Y 5 1 31 1901 4 Y 6 2 1 1901 5 Y 7 2 2 1901 6 Y 8 2 15 1901 5 Y 9 2 30 1901 日期不存在 Y 10 2 31 1901 日期不存在 Y 11 6 1 1901 6 Y 12 6 2 1901 0 Y 13 6 15 1901 6 Y 14 6 30 1901 0 Y 15 6 31 1901 日期不存在 Y 16 11 1 1901 5 Y 17 11 2 1901 6 Y 18 11 15 1901 5 Y 19 11 30 1901 6 Y 20 11 31 1901 日期不存在 Y 21 12 1 1901 0 Y 22 12 2 1901 1 Y 23 12 15 1901 0 Y 24 12 30 1901 1 Y 25 12 31 1901 2 Y 26 1 1 1902 3 Y 27 1 2 1902 4 Y 28 1 15 1902 3 Y 29 1 30 1902 4 Y 30 1 31 1902 5 Y 31 2 1 1902 6 Y 32 2 2 1902 0 Y 33 2 15 1902 6 Y 34 2 30 1902 日期不存在 Y 35 2 31 1902 日期不存在 Y 36 6 1 1902 0 Y 37 6 2 1902 1 Y 38 6 15 1902 0 Y 39 6 30 1902 1 Y 40 6 31 1902 日期不存在 Y 41 11 1 1902 6 Y 42 11 2 1902 0 Y 43 11 15 1902 6 Y 44 11 30 1902 0 Y 45 11 31 1902 日期不存在 Y 46 12 1 1902 1 Y 47 12 2 1902 2 Y 48 12 15 1902 1 Y 49 12 30 1902 2 Y 50 12 31 1902 3 Y 51 1 1 2000 6 Y 52 1 2 2000 0 Y 53 1 15 2000 6 Y 54 1 30 2000 0 Y 55 1 31 2000 1 Y 56 2 1 2000 2 Y 57 2 2 2000 3 Y 58 2 15 2000 2 Y 59 2 30 2000 日期不存在 Y 60 2 31 2000 日期不存在 Y 61 6 1 2000 4 Y 62 6 2 2000 5 Y 63 6 15 2000 4 Y 64 6 30 2000 5 Y 65 6 31 2000 日期不存在 Y 66 11 1 2000 3 Y 67 11 2 2000 4 Y 68 11 15 2000 3 Y 69 11 30 2000 4 Y 70 11 31 2000 日期不存在 Y 71 12 1 2000 5 Y 72 12 2 2000 6 Y 73 12 15 2000 5 Y 74 12 30 2000 6 Y 75 12 31 2000 0 Y 76 1 1 2049 5 Y 77 1 2 2049 6 Y 78 1 15 2049 5 Y 79 1 30 2049 6 Y 80 1 31 2049 0 Y 81 2 1 2049 1 Y 82 2 2 2049 2 Y 83 2 15 2049 1 Y 84 2 30 2049 日期不存在 Y 85 2 31 2049 日期不存在 Y 86 6 1 2049 2 Y 87 6 2 2049 3 Y 88 6 15 2049 2 Y 89 6 30 2049 3 Y 90 6 31 2049 日期不存在 Y 91 11 1 2049 1 Y 92 11 2 2049 2 Y 93 11 15 2049 1 Y 94 11 30 20
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件 测试 作业