您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 软件测试实验六-动态测试6
软件测试第1页共12页实验六动态测试1提交期限和方式期限:第16周周三(2015-6-17)23:59pm方式:由学习委员收集所有学生的实验报告,以电子档的形式提交给任课教师(发邮箱:)。2实验目的和内容2.1实验目的结合黑盒与白盒测试技术,编写驱动程序,掌握基本模块的动态测试是如何实现的。2.2实验内容通过账单优惠计算问题,综合使用黑盒和白盒测试方法来设计测试用例,并编写模块的驱动程序,完成基本模块的动态测试。3案例实践:账单优惠计算问题的动态测试3.1问题简述问题描述如下:账单优惠计算问题主要是根据账单的消费数额大小,给予不同程度的折扣优惠,但当账单上的消费数额无效时,程序应提示消费数额无效。程序代码如下:#includestdio.h#includemath.hdoubleFuncRevenueAccount(doubleamount){1doublerate=1.0;2if(amount=800)3rate=1.0;4elseif(amount800&&amount=1800)5rate=0.9;6elseif(amount1800&&amount=4800)7rate=0.8;8elseif(amount4800)9rate=0.7;10elseif(amount=0){11return-1.0;12}软件测试第2页共12页13returnamount*rate;}//测试驱动程序voidDriveroFuncRevenueAccount(){printf(这是对FuncRevenueAccount()函数的测试\n);charc;intnum,count=0,pass=0,fail=0;doubletmp,tmp1,temp;FILE*FpFrom=NULL;//数据文件的指针,存储测试用例的基本信息FILE*FpTo=NULL;//记录测试用例执行结果的文件指针FpFrom=fopen(J:\\TCData1.txt,rb);FpTo=fopen(J:\\result.txt,wb);while(!feof(FpFrom)){if((c=fgetc(FpFrom))!='\n'){count++;fscanf(FpFrom,%d,&num);printf(测试用例:%d,,num);fscanf(FpFrom,%lf,&tmp);printf(输入:%lf,,tmp);temp=FuncRevenueAccount(tmp);fscanf(FpFrom,%lf,&tmp1);printf(预期输出:%lf,,tmp1);printf(实际输出:%lf,,temp);fprintf(FpTo,测试用例%d,num);if(fabs(temp-tmp1)1e-6){fputs(:Pass\r\n,FpTo);printf(通过\n);pass++;}else{fputs(:Fail\r\n,FpTo);printf(失败\n);fail++;}}}printf(共执行了%d个测试用例,其中%d个通过,%d个失败\n,count,pass,fail);fprintf(FpTo,共执行了%d个测试用例,其中%d个通过,%d个失败\n,count,pass,fail);软件测试第3页共12页fclose(FpFrom);fclose(FpTo);}voidmain(){/*1doubleamountBefore=0.0;2printf(请输入账单的消费数额(该数额应大于零):\n);3scanf(%lf,&amountBefore);4printf(输入的账单值为%lf,,amountBefore);5doubleamountAfter=0.0;6amountAfter=FuncRevenueAccount(amountBefore);7if(amountAfter=0)8printf(\n账单消费数额无效\n);9else10printf(优惠计算后的账单值为%f\n,amountAfter);*/DriveroFuncRevenueAccount();}3.2编译执行首先对该段程序进行编译,由于没有语法错误,因此编译通过。接着运行程序,输入数值600,按回车。观察程序执行结果,输出为600,符合预期结果。3.3静态测试单元测试不应仅针对程序来测试,那样只能证明代码是可以运行的。单元测试的首要任务是对照被测对象的详细设计,查看程序是否按照详细设计的功能来实现。通过检查能够发现,账单优惠计算问题缺少详细的折扣优惠政策,也并未明确说明什么条件下消费数额无效。因此,程序代码中所展示的折扣无从考证,不知是否正确。于是,首先应补充账单优惠计算的详细功能说明如下:账单优惠计算的具体折扣优惠规则为:当账单上的一次性消费数额为负数或零时,返回负数表示消费数额无效;当账单上的一次性消费数额在800元到1800元之间时(含1800元),为九折;当账单上的一次性消费数额在1800元到4800元之间时(含1800元),为八折;当账单上的一次性消费数额在4800元以上时(不含4800元),一律为七折。接着,对照缺陷检查表和编码规范,发现程序中没有任何注释,应补充必要的注释。同时发现一处代码错误,即FuncRevenueAccount()函数中的第2条语句,在该逻辑判断表达式中仅考虑当amount小于800的情况,却为考虑应将amount=0(无效的数据输入)与amount0(有效的数据输入)这两种完全不同的情况区分开来。针对无效数据输入,原来的程序是放到第10、11条语句去处理的,根据程序执行的顺序,这两条语句根本执行不到。因此,应将FuncRevenueAccount()函数中的第2条语句改为“if(amount=0)return-1.0else软件测试第4页共12页if(amount0&&amount=800)”。3.4动态测试动态测试包括动态黑盒测试与动态白盒测试。首先进行动态黑盒测试,在此可依次选取等价类测试和边界值测试方法设计测试用例(如表6-1所示)。其中测试用例RA-UT-005和RA-UT-016的实际输出分别为:0.0和-10.0,这两个测试用例失败。图6.1动态黑盒测试用例ID输入(amount)预期输出(amount)执行结果备注RA-UT-001400.0400.0通过amount在等价类(0,800]中,无折扣RA-UT-0021300.01170.0通过amount在等价类(800,1800]中,折扣0.90RA-UT-0033300.02640.0通过amount在等价类(1800,4800]中,折扣0.80RA-UT-0048000.05600.0通过amount在等价类[4800,+)中,折扣0.70RA-UT-0050.0-1.0失败边界点0附近的测试数据RA-UT-0061.01.0通过边界点0附近的测试数据RA-UT-007799.0799.0通过边界点800附近的测试数据,无折扣RA-UT-008800.0800.0通过边界点800附近的测试数据,无折扣RA-UT-009801.0720.9通过边界点800附近的测试数据,折扣0.90RA-UT-0101799.01619.1通过边界点1800附近的测试数据,折扣0.90RA-UT-0111800.01620.0通过边界点1800附近的测试数据,折扣0.90RA-UT-0121801.01440.8通过边界点1800附近的测试数据,折扣0.80RA-UT-0134799.03839.20通过边界点4800附近的测试数据,折扣0.80RA-UT-0144800.03840.0通过边界点4800附近的测试数据,折扣0.80RA-UT-0154801.03360.7通过边界点4800附近的测试数据,折扣0.70RA-UT-016-1.0-1.0失败无效数据的处理RA-UT-017-10.0-1.0失败无效数据的处理接着选择白盒测试技术来评价黑盒的测试用例集合,因程序代码很短,分支也不复杂,可选择基本路径测试法。图6.1给出了函数FuncRevenueAccount()的程序控制流图。软件测试第5页共12页图6.1函数FuncRevenueAccount()的程序控制流图图中显示,程序环形复杂度为6,对应6条路径,但实际上子路径81012和81011是永远不可能执行到的。实际只有4条可执行路径,测试用例RA-UT-001到RA-UT-004可以实现对这4条路径的覆盖。Path1:1,2,4,5,12,13(对应测试用例RA-UT-001)Path2:1,2,4,6,7,12,13(对应测试用例RA-UT-002)Path3:1,2,4,6,8,9,12,13(对应测试用例RA-UT-003)Path4:1,2,4,6,8,10,11(对应测试用例RA-UT-004)3.5编写测试驱动程序为了实现测试用例的自动执行和结果检查,测试驱动程序可按以下思路进行设计:(1)设置统计和记录程序执行结果所需的局部变量;(2)打开存储测试用例相关信息的数据文件;(3)读入一批测试用例,对于每个测试用例读入基本信息并显示出来,包括测试用例的ID、输入数据、预期输出;利用测试用例来驱动(即调用)被测函数;显示测试用例的实际输出,经与预期输出比较后,判断该用例是否通过,并显示比较结果,同时将执行结果输出到结果记录的日志文件;(4)统计这批测试用例的执行情况,如执行率,通过率,失败率等。根据以上分析,编写测试驱动程序如下:voidDriveroFuncRevenueAccount(){printf(这是对FuncRevenueAccount()函数的测试\n);charc;intnum,count=0,pass=0,fail=0;doubletmp,tmp1,temp;FILE*FpFrom=NULL;//数据文件的指针,存储测试用例的基本信息软件测试第6页共12页FILE*FpTo=NULL;//记录测试用例执行结果的文件指针FpFrom=fopen(J:\\TCData1.txt,rb);FpTo=fopen(J:\\result.txt,wb);while(!feof(FpFrom)){if((c=fgetc(FpFrom))!='\n'){count++;fscanf(FpFrom,%d,&num);printf(测试用例:%d,,num);fscanf(FpFrom,%lf,&tmp);printf(输入:%lf,,tmp);temp=FuncRevenueAccount(tmp);fscanf(FpFrom,%lf,&tmp1);printf(预期输出:%lf,,tmp1);printf(实际输出:%lf,,temp);fprintf(FpTo,测试用例%d,num);if(fabs(temp-tmp1)1e-6){fputs(:Pass\r\n,FpTo);printf(通过\n);pass++;}else{fputs(:Fail\r\n,FpTo);printf(失败\n);fail++;}}}printf(共执行了%d个测试用例,其中%d个通过,%d个失败\n,count,pass,fail);fprintf(FpTo,共执行了%d个测试用例,其中%d个通过,%d个失败\n,count,pass,fail);fclose(FpFrom);fclose(FpTo);}此时的主函数就变得很简单了,修改主函数如下:#include“stdio.h”#include“math.h”voidmain(){DriveroFuncRevenueAccount();//调用测试驱动函数软件测试第7页共12页}为简单起见,采用txt文件来记录测试用例的基本信息,数据文件TCData1.txt中每行数据依次对应:测试用例ID、测试用例的输入值、测试用例的预期输出值,具体内容如下图:3.6执行测试用例并分析结果测试用例执行
本文标题:软件测试实验六-动态测试6
链接地址:https://www.777doc.com/doc-5547456 .html