《软件测试实验六动态测试(共12页).doc》由会员分享,可在线阅读,更多相关《软件测试实验六动态测试(共12页).doc(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上实验六动态测试1 提交期限和方式期限:第16周周三(2015-6-17)23:59 pm方式:由学习委员收集所有学生的实验报告,以电子档的形式提交给任课教师(发邮箱:)。2 实验目的和内容2.1 实验目的结合黑盒与白盒测试技术,编写驱动程序,掌握基本模块的动态测试是如何实现的。2.2 实验内容通过账单优惠计算问题,综合使用黑盒和白盒测试方法来设计测试用例,并编写模块的驱动程序,完成基本模块的动态测试。3 案例实践:账单优惠计算问题的动态测试3.1 问题简述问题描述如下: 账单优惠计算问题主要是根据账单的消费数额大小,给予不同程度的折扣优惠,但当账单上的消费数额无效时,
2、程序应提示消费数额无效。程序代码如下:#include stdio.h #include math.h double FuncRevenueAccount( double amount ) 1 double rate = 1.0; 2 if( amount 800 & amount 1800 & amount 4800 ) 9 rate = 0.7; 10 else if( amount = 0 ) 11 return -1.0;12 13 return amount * rate; /测试驱动程序void DriveroFuncRevenueAccount()printf (这是对FuncR
3、evenueAccount()函数的测试n);char c;int num,count=0,pass=0,fail=0;double tmp,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(测
4、试用例:%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(:Passrn,FpTo);printf(通过n);pass+;elsefputs(:Failrn,FpTo);printf(失败n);fail+; printf(共执行了%d个测试用例
5、,其中%d个通过,%d个失败n,count,pass,fail);fprintf(FpTo,共执行了%d个测试用例,其中%d个通过,%d个失败n,count,pass,fail);fclose(FpFrom);fclose(FpTo);void main() /*1 double amountBefore = 0.0; 2 printf( 请输入账单的消费数额(该数额应大于零):n ); 3 scanf( %lf, &amountBefore ); 4 printf( 输入的账单值为%lf, , amountBefore ); 5 double amountAfter = 0.0; 6 amo
6、untAfter = FuncRevenueAccount( amountBefore ); 7 if( amountAfter = 0 ) 8 printf( n账单消费数额无效n ); 9 else 10 printf( 优惠计算后的账单值为%fn, amountAfter ); */ DriveroFuncRevenueAccount();3.2 编译执行首先对该段程序进行编译,由于没有语法错误,因此编译通过。接着运行程序,输入数值600,按回车。观察程序执行结果,输出为600,符合预期结果。3.3 静态测试单元测试不应仅针对程序来测试,那样只能证明代码是可以运行的。单元测试的首要任务是
7、对照被测对象的详细设计,查看程序是否按照详细设计的功能来实现。通过检查能够发现,账单优惠计算问题缺少详细的折扣优惠政策,也并未明确说明什么条件下消费数额无效。因此,程序代码中所展示的折扣无从考证,不知是否正确。于是,首先应补充账单优惠计算的详细功能说明如下:账单优惠计算的具体折扣优惠规则为: 当账单上的一次性消费数额为负数或零时,返回负数表示消费数额无效; 当账单上的一次性消费数额在800元到1800元之间时(含1800元),为九折; 当账单上的一次性消费数额在1800元到4800元之间时(含1800元),为八折; 当账单上的一次性消费数额在4800元以上时(不含4800元),一律为七折。接着
8、,对照缺陷检查表和编码规范,发现程序中没有任何注释,应补充必要的注释。同时发现一处代码错误,即FuncRevenueAccount()函数中的第2条语句,在该逻辑判断表达式中仅考虑当amount小于800的情况,却为考虑应将amount 0(有效的数据输入)这两种完全不同的情况区分开来。针对无效数据输入,原来的程序是放到第10、11条语句去处理的,根据程序执行的顺序,这两条语句根本执行不到。因此,应将FuncRevenueAccount()函数中的第2条语句改为“if(amount 0 & amount=800)”。3.4 动态测试动态测试包括动态黑盒测试与动态白盒测试。首先进行动态黑盒测试,
9、在此可依次选取等价类测试和边界值测试方法设计测试用例(如表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
10、通过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-0121
11、801.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()的程
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
13、 编写测试驱动程序为了实现测试用例的自动执行和结果检查,测试驱动程序可按以下思路进行设计:(1)设置统计和记录程序执行结果所需的局部变量;(2)打开存储测试用例相关信息的数据文件;(3)读入一批测试用例,对于每个测试用例 读入基本信息并显示出来,包括测试用例的ID、输入数据、预期输出; 利用测试用例来驱动(即调用)被测函数; 显示测试用例的实际输出,经与预期输出比较后,判断该用例是否通过,并显示比较结果,同时将执行结果输出到结果记录的日志文件;(4)统计这批测试用例的执行情况,如执行率,通过率,失败率等。根据以上分析,编写测试驱动程序如下:void DriveroFuncRevenueAcco
14、unt()printf (这是对FuncRevenueAccount()函数的测试n);char c;int num,count=0,pass=0,fail=0;double tmp,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(FpF
15、rom,%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(:Passrn,FpTo);printf(通过n);pass+;elsefputs(:Failrn,FpTo);printf(失败n);fail
16、+; 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”void main() DriveroFuncRevenueAccount(); /调用测试驱动函数为简单起见,采用txt文件来记录测试用例的基本信息,数据文件TCData1.txt中每行数据依次对应:测试用
17、例ID、测试用例的输入值、测试用例的预期输出值,具体内容如下图:3.6 执行测试用例并分析结果测试用例执行之后的结果存储在测试日志文件中,仍用txt文件存储。对于本例,日志文件FuncRevenueAccountTestResult.txt的内容应该生成如下图所示。使用了测试驱动程序后的程序运行结果应如下图所示。通过动态测试方法,请对本次测试结果进行分析,说明测试的输出结果存在那些明显问题。并将3.3 静态测试中提到的三个缺陷进行修改,将修改后的FuncRevenueAccount()函数和主函数写在下方。(1)输出结果存在的问题:测试用例16,对于无效数据的输入,应显示失败(2)修改后的Fu
18、ncRevenueAccount()函数和主函数:double FuncRevenueAccount( double amount ) double rate = 1.0; if(amount 0 & amount 800 & amount 1800 & amount 4800 ) rate = 0.7; return amount * rate; void main() void main() /*1 double amount = 0.0; 2 printf( 请输入账单的消费数额(该数额应大于零):n ); 3 scanf( %lf, &amount ); 4 printf( 输入的账单
19、值为%lf, , amount ); 6 amount= FuncRevenueAccount( amount ); 7 if( amount = 0 ) 8 printf( n账单消费数额无效n ); 9 else 10 printf( 优惠计算后的账单值为%fn, amount ); */#include stdio.h #include math.h double FuncRevenueAccount( double amount ) double rate = 1.0; if(amount 0 & amount 800 & amount 1800 & amount 4800 ) rat
20、e = 0.7; return amount * rate; void DriveroFuncRevenueAccount()printf (这是对FuncRevenueAccount()函数的测试n);char c;int num,count=0,pass=0,fail=0;double tmp,tmp1,temp;FILE* FpFrom = NULL; /数据文件的指针,存储测试用例的基本信息 FILE* FpTo =NULL; /记录测试用例执行结果的文件指针 FpFrom = fopen(J:TCData1.txt,rb);FpTo = fopen(J:result.txt,wb);
21、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(:Passrn,FpTo);printf(通过n);pass+;elsefputs(:Failrn,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);void main() DriveroFuncRevenueAccount();修改之前:修改之后:专心-专注-专业
限制150内