实验报告课程软件测试实验项目白盒测试用例设计与执行专业年级计科07级姓名李专学号0705010136指导教师实验时间2010-6-4实验成绩一、实验目的1.熟练掌握如何运用基路径测试方法进行测试用例设计。2.初步熟悉如何利用程序插装技术进行逻辑覆盖率分析。二、实验内容1、题目前一日函数PreDate是NextDate的逆函数(代码实现见下),实现功能为:输入1800年到2050年之间的某个日期,函数返回这一天的前一天的日期。(此处不考虑无效输入)请采用基路径方法对前一日函数进行测试用例设计,并利用程序插装技术对测试用例的判定覆盖率进行检查分析。代码:(被测函数为PreDate)#includestdio.htypedefstructMyDate{intmonth;intday;intyear;}MyDate;MyDatePreDate(MyDatedate);intLeapyear(intyear);voidPrint(MyDatedate);MyDatePreDate(MyDatedate)//输入日期有效性检查中其他模块实现,此处假设输入日期都是合法数据{1.MyDateyesterday;2.yesterday.month=date.month;//initialization3.yesterday.day=date.day;4.yesterday.year=date.year;5.intdays_month[13]={0,31,0,31,30,31,30,31,31,30,31,30,31};//初始化每月天数,其中2月不确定,初始化为06.if(date.day1)7.yesterday.day=date.day-1;else{8.if(date.month==1){9.yesterday.year=date.year-1;10.yesterday.month=12;11.yesterday.day=31;}12.elseif(date.month==3){13.if(Leapyear(date.year)){14.yesterday.month=2;15.yesterday.day=29;}else{16.yesterday.month=2;17.yesterday.day=28;}}else{18.yesterday.month=date.month-1;19.yesterday.day=days_month[date.month-1];}}20.returnyesterday;}21.intLeapyear(intyear){22.if((year%4==0&&year%100!=0)||(year%400==0))23.return1;24.elsereturn0;}voidPrint(MyDatedate){25.printf(%d--%d--%d\n,date.year,date.month,date.day);}2、测试用例设计1)控制流图2)环路复杂度计算由图可知,图中的环路有五条,故环路复杂度为五。3)基本路径集设计基本路径集为:A.1、2、3、4、5、6、8、12、13、14、15、20、25B.1、2、3、4、5、6、8、12、16、17、20、25C.1、2、3、4、5、6、8、12、18、19、20、25D.1、2、3、4、5、6、8、9、10、11、20、25E.1、2、3、4、5、6、7、20、254)测试用例集设计测试用例集为:2000-1-22000-1-12000-3-11999-3-11980-5-13、插装后源程序清单与判定覆盖率分析结果(要求截取插装后程序运行界面)#includestdio.htypedefstructMyDate{intmonth;intday;intyear;1234569118101218161913141515557}MyDate;inta[6];MyDatePreDate(MyDatedate);intLeapyear(intyear);voidPrint(MyDatedate);intcount();MyDatePreDate(MyDatedate)//输入日期有效性检查中其他模块实现,此处假设输入日期都是合法数据{MyDateyesterday;yesterday.month=date.month;//initializationyesterday.day=date.day;yesterday.year=date.year;intdays_month[13]={0,31,0,31,30,31,30,31,31,30,31,30,31};//初始化每月天数,其中2月不确定,初始化为0if(date.day1){a[0]=count();yesterday.day=date.day-1;}else{a[1]=count();if(date.month==1){a[2]=count();yesterday.year=date.year-1;yesterday.month=12;yesterday.day=31;}elseif(date.month==3){a[3]=count();if(Leapyear(date.year)){a[4]=count();yesterday.month=2;yesterday.day=29;}else{a[5]=count();yesterday.month=2;yesterday.day=28;}}else{a[6]=count();yesterday.month=date.month-1;yesterday.day=days_month[date.month-1];}}returnyesterday;}intLeapyear(intyear){if((year%4==0&&year%100!=0)||(year%400==0))return1;elsereturn0;}voidPrint(MyDatedate){printf(%d--%d--%d\n,date.year,date.month,date.day);}intcount(){return1;}voidDriverofPreDate(){inttcPassNum=0;inttcFailNum=0;//存储通过和失败的测试用例总数FILE*pFpFrom=NULL;FILE*pFpTo=NULL;//-----------打开数据文件,准备读取测试用例的数据-----------char*DataFileName=test.txt;pFpFrom=fopen(DataFileName,r);if(!pFpFrom){printf(读取数据失败,返回\n);return;}//-----------打开数据文件,准备记录测试用例执行结果-----------char*DataFileTestResultName=DivedeTestResult.txt;pFpTo=fopen(DataFileTestResultName,w);if(!pFpTo){printf(打开文件失败,返回\n);return;}fprintf(pFpTo,----------对函数PreDate的单元测试结果------------\n);//-----------执行测试用例,记录测试结果-----------intTCID=0;intsum=0;MyDatedate;//测试用例的输入MyDateexpectedOut,actualOut;//测试用例的预期、实际输出printf(对函数PreDate展开单元测试\n);while(!feof(pFpFrom)){//不断读取每个测试用例的数据fscanf(pFpFrom,%d,&TCID);//读入测试用例的IDfscanf(pFpFrom,%d%d%d,&date.month,&date.day,&date.year);//读测试用例输入fscanf(pFpFrom,%d%d%d,&expectedOut.year,&expectedOut.month,&expectedOut.day);//读入测试用例的预期输出actualOut=PreDate(date);//执行测试用例printf(测试用例%d:输入%d,%d,%d,预期输出%d,%d,%d,,实际输出%d,%d,%d,,TCID,date.month,date.day,date.year,expectedOut.year,expectedOut.month,expectedOut.day,actualOut.year,actualOut.month,actualOut.day);//输出测试用例的信息if(actualOut.day==expectedOut.day&&actualOut.month==expectedOut.month&&actualOut.year==expectedOut.year){//若测试用例通过,则记录通过用例总数tcPassNum++;printf(通过\n);fprintf(pFpTo,测试用例%d:Pass,TCID);//将测试结果存入结果文件}else{tcFailNum++;printf(失败\n);fprintf(pFpTo,测试用例%d:Fail,TCID);//将测试结果存入结果文件}}//-----------统计测试结果-----------for(inti=0;i=6;i++){sum=sum+a[i];}printf(覆盖率=%d,sum*100/7);printf(%%\n);printf(共执行%d个测试用例,其中%d个通过,%d个失败\n,tcPassNum+tcFailNum,tcPassNum,tcFailNum);fprintf(pFpTo,共执行%d个测试用例,其中%d个通过,%d个失败\n,tcPassNum+tcFailNum,tcPassNum,tcFailNum);fclose(pFpFrom);fclose(pFpTo);}voidmain(){DriverofPreDate();//调用测试驱动程序}……三、总结与体会实验中对于路径测试有了更深的理解,可以更好、更迅速的去划分路径,设计测试用例,只是对插桩技术不太理解,不知道怎样去较好的设计插桩用例,也不知道怎样去计算插桩测试的覆盖率,通过实验过程对其有了进一步的理解,可是感觉还有点模糊,课后好好复习!还有,就是插桩测试的结果和预期的结果有所差异,没找到错误所在,希望老师能指出。