您好,欢迎访问三七文档
当前位置:首页 > 中学教育 > 初中教育 > 单元测试实践实验报告
BITCOM08036SoftwareTestingTechniquesSpring20131《软件测试技术》单元测试实践实验报告诚信声明本人郑重承诺:本实验报告是本人独立工作所获得的成果。尽我所知,实验报告中除特别标注的地方外,不包含其他人已经发表或撰写过的成果。实验报告中对报告工作的任何帮助者所做的贡献均做了明确的说明并表达了谢意。如有抄袭,本人愿意承担因此而造成的任何后果。特此声明。签名:Eastmount日期:2013-6-9任务:第2题实验内容与完成情况:一.实验思想单元测试实践中我测试题目是第2题“输入年份year和月month,求该月有多少天”的任务。由于它是一个C语言程序,而且没有子函数,能直接计算其结果,所以直接把该程序看做一个测试单元,并采用如下实验步骤进行测试:1.首先对源程序进行不执行的代码走读,静态分析源程序代码(静态白盒测试方法),分析检查源程序的语法、结构、算法等的正确性,并对错误进行修正;2.然后采用动态黑盒测试的等价划分、边界值分析、错误猜解法等方法,并结合动态白盒测试的逻辑覆盖,对每条语句及分支条件都进行覆盖测试,同时测试过程中跟踪执行每一条语句,对程序进行比较完整动态测试;3.分析统计测试的结果,并完成实验报告。二.静态测试我采用的是VS2012进行单元测试,源程序如下所示:#includestdio.hmain(){intyear,month,days;printf(Enteryearandmonth:);scanf(%d%d,&year,&month);switch(month){case1:case3:case5:case7:case8:case10:case12:days=31;break;/*处理“大”月*/case4:case6:case9:case11:days=30;break;/*处理“小”月*/BITCOM08036SoftwareTestingTechniquesSpring20132case2:if(year%4==0&&year%100!=0&&year%400==0)days=29;/*处理闰年平月*/elsedays=28;/*处理不是闰年平月*/break;default:printf(Inputerror!\n);/*月份错误*/days=0;}if(days!=0)printf(%d,%dis%ddays\n,year,month,days);}经过代码走读,静态分析源程序,我发现该程序具有以下错误:1.语法错误(1).主函数mian()缺少类型说明,应该添加int或void类型;(2).程序缺少返回值,如果定义的int型,添加“return0;”返回值,如果是void型,添加“return;”返回空值;(3).注意“;”的使用,它应该是英文的“;”,而代码中都是使用的中文的分号,这是一个编码方式错误的语法错误;2.算法错误判断闰年时的计算公式:“year%4==0&&year%100!=0&&year%400==0”是错误的算法,它应该是该年“(year%4==0&&year%100!=0)||(year%400==0)”时为闰年,2月为29天(下面的测试用例及测试都是修改后的算法进行的);3.代码规范格式优化(1).按照正规的、更有效、美观的编码方式,定义变量时应该每个变量单独定义一行,这样更加方便阅读和使用,如下:intyear;intmonth;intdays;(2).在使用switch语句时,如果分支结果case中有多个语句时,最好使用括号包括相应的语句代码,如下图所示:default:{printf(Inputerror!\n);/*月份错误*/days=0;}(3).在使用if语句时,最好都用括号包含相应语句代码;同时括号要单独占一行,这样更加的方便别人与自己的阅读与使用。BITCOM08036SoftwareTestingTechniquesSpring20133三.动态测试在动态测试过程中,我主要采用黑盒动态测试等价划分、边界值分析、错误猜解法等方法,并结合白盒动态测试,逻辑覆盖所有语句及分支条件并跟踪每行代码进行测试。1.输入数据特点由于该程序要求输入的是year和month两个数据,并且都是int类型,再结合生活实际中年份和月份的知识,我对输入数据的特点进行一下总结:(1).输入的数据类型应该为int型,并且输入的是两个数字;(2).输入的年份范围应该大于0,小于int型的最大可表达范围;(3).输入的月份实际生活中只有12个月,因此应该为1-12间的数字;(4).由于要判断每月多少天,所以月份还要划分为4、6、9、11月30天,1、3、5、7、8、10、12月31天,2月特殊判断;(5).同理,年数year也要划分为闰年和非闰年;(6).同时注意测试月份1、12边界值。2.列出等价类和边界值表输入条件有效等价类无效等价类年、月类型及个数(1).输入2个int型数字(2).输入非数字字符(3).输入少于2个数字(4).输入大于2个数字年份范围(5).在0-int最大值之间闰年被400整除(6).在0-int最大值之间闰年不被100整除且被4整除(7).在0-int最大值之间平年(8).年份小于0(9).年份大于int最大值(2147483647)月份范围(10).月份=4,6,9,11(11).月份=3,5,7,8,10(12).月份=1(13).月份=12(14).月份=2(15).月份12(16).月份13.设计测试用例用例编号输入预期输出覆盖等价类是否通过CS0012002112002,11is30days(1)、(7)、(10)CS002aaabbbInputerror!(2)CS0032002Inputerror!(3)CS00420021110Inputerror!(4)CS0052000102000,10is31days(1)、(5)、(11)CS006199611996,1is31days(1)、(6)、(12)CS0071990121990,12is31days(1)、(7)、(13)BITCOM08036SoftwareTestingTechniquesSpring20134CS008180021800,2is28days(1)、(7)、(14)CS009200822008,2is29days(1)、(6)、(14)CS010200022000,2is29days(1)、(5)、(14)CS011-20007Inputerror!(8)CS012100000000008Inputerror!(9)CS01320130Inputerror!(15)CS014201314Inputerror!(16)三.实验结果按照上面等价划分和边界值设置的测试用例,对源程序进行测试的结果如下图所示:用例编号CS001输入200211预期输出2002,11is30days覆盖等价类(1)、(7)、(10)实际输出是否通过通过用例编号CS002输入aaabbb预期输出Inputerror!覆盖等价类(2)实际输出是否通过通过用例编号CS003输入2002预期输出Inputerror!覆盖等价类(3)实际输出一直等待再输入一个数字是否通过未通过用例编号CS004输入20021110预期输出Inputerror!覆盖等价类(4)实际输出应该只能输入2个数字,输入3个它也按两个数处理,显然不能通过是否通过未通过BITCOM08036SoftwareTestingTechniquesSpring20135用例编号CS005输入200010预期输出2000,10is31days覆盖等价类(1)、(5)、(11)实际输出是否通过通过用例编号CS006输入19961预期输出1996,1is31days覆盖等价类(1)、(6)、(12)实际输出是否通过通过用例编号CS007输入199012预期输出1990,12is31days覆盖等价类(1)、(7)、(13)实际输出是否通过通过用例编号CS008输入18002预期输出1800,2is28days覆盖等价类(1)、(7)、(14)实际输出是否通过通过用例编号CS009输入20082预期输出2008,2is29days覆盖等价类(1)、(6)、(14)实际输出是否通过通过用例编号CS010输入20002预期输出2000,2is29days覆盖等价类(1)、(5)、(14)实际输出是否通过通过BITCOM08036SoftwareTestingTechniquesSpring20136用例编号CS010输入20002预期输出2000,2is29days覆盖等价类(1)、(5)、(14)实际输出是否通过通过用例编号CS011输入-20007预期输出Inputerror!覆盖等价类(8)实际输出当输入年份0时就应该是错误的年份是否通过未通过用例编号CS012输入100000000008预期输出Inputerror!覆盖等价类(9)实际输出从输出结果可以发现int数字已经溢出,但它输出了结果,应该输出错误提示是否通过未通过用例编号CS013输入20130预期输出Inputerror!覆盖等价类(15)实际输出是否通过通过用例编号CS014输入201314预期输出Inputerror!覆盖等价类(16)实际输出是否通过通过四.结果分析与体会经过上面的测试后,该测试用例的语句覆盖率和分支条件覆盖率为100%,基本考虑了所有该题目的输入情况。根据单老师课程所讲述的内容并结合课件,完美对题目2进行了单元测试,更好的掌握了静态测试、动态测试方法,其中包括黑盒测试的等价划分、边界值设定,白盒测试的覆盖所有路径、分支条件,都更深刻的进行了学习与理解。BITCOM08036SoftwareTestingTechniquesSpring20137出现的问题:同时,在实验中也遇到了一些问题,其中主要的问题如下:1.在对年份进行等价划分时,它只要求输入的为int型数字,没有具体的输入年份要求,但根据生活中的经验,是否该把小于0的年份和大于int型最大值的年份划分至无效等价类?这是一个很困扰我的问题。2.它给定的题目是想测试输入year和month判断月份的天数,但是在判断闰年的公式中,它给出的是“year%4==0&&year%100!=0&&year%400==0”,而正确的应该为“(year%4==0&&year%100!=0)||(year%400==0)”,是否应该把它修正在进行测试?因为在判断测试用例是否通过时,依据上面不同的式子,通过的结果是不同的。3.在静态测试代码,代码走读过程中,遇到的格式不是很规范的问题,是否应该把它编码规范化,并修改记录至文档中?4.测试过程中,覆盖等价类会出现重复的现象,这是不是会导致测试的效率降低,而当前测试用例又是必不可少的,是不是应该测试覆盖的都是唯一的用例?解决方案(列出遇到的问题和解决办法,列出没有解决的问题):1.第一个问题,我的解决方法是:答:在测试过程中,应该结合生活中的实际来编写测试用例,如题目中的month就应该设置1-12为有效月份,虽然题目中没有提示,但这显然是生活常识,而且是衡成立的公理,同样设置year时就有小于0或大于int最大值为无效等价类。2.第二个问题,我的解决方法是:答:在静态测试中,通过代码走读,把代码中的错误都修正,同时计算闰年的公式也应该修改过来,再进行测试,因为它题目测试的要求是判断月份,所以它就应该修改成正确的判断闰年公式,在进行测试。3.在静态测试代码,代码走读过程中,遇到的格式不是很规范的问题,是否应该把它编码规范化,并修改记录至文档中?答:没有解决。4.测试过程中,覆盖等价类会出现重复的现象,这是不是会导致测试的效率降低,而当前测试用例又是必不可少的,是不是应该测试覆盖的都是唯一的用例?答:没有解决。参考资料:《软件测试技术》课程PDF课件《软件测试方法和技术》清华大学出版社主编:朱少民唯爱心旅的博客“软件测试-
本文标题:单元测试实践实验报告
链接地址:https://www.777doc.com/doc-4860601 .html