软件测试与质量保证课件 第8章 白盒测试方法_第1页
软件测试与质量保证课件 第8章 白盒测试方法_第2页
软件测试与质量保证课件 第8章 白盒测试方法_第3页
软件测试与质量保证课件 第8章 白盒测试方法_第4页
软件测试与质量保证课件 第8章 白盒测试方法_第5页
已阅读5页,还剩137页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章白盒测试技术软件测试方法2软件测试方法白盒测试静态测试其他动态测试按是否运行系统划分按是否查看源代码划分随机测试黑盒测试冒烟测试回归测试等价类划分法错误推测法因果图法边界值分析法组合分析法手工测试自动化测试按是否使用自动化工具划分逻辑覆盖法基本路径测试法白盒测试白盒测试,又称为透明盒测试、结构测试、逻辑驱动测试、基于代码的测试,是为了证明软件内部操作和过程是否符合设计规格和要求。因此,需要详细设计文档作为白盒测试设计的输入。白盒测试用例的设计要求:了解程序的内部逻辑(详细设计),并且,对程序的基本输入输出已经了解。3白盒测试的任务对程序模块的所有独立的执行路径至少要测试一次;对逻辑判定,取真或假的两种情况至少要测试一次;检验内部数据结构的有效性;对程序进行边界检查;检测程序源代码是否存在代码级缺陷4一般采用以下白盒测试方法来满足上述要求:逻辑覆盖法基本路径测试法基于数据流的测试基于缺陷模式的缺陷检测基于变异的测试程序插桩法......5白盒测试用例生成一般处理流程6本章内容逻辑覆盖测试数据流测试变异测试其他白盒测试方法7控制流图Euclid方法计算最大公约数8输入x,yx>0&&y>0?x>y?x=x-yy=y-x输出x+yYYNNvoidmain(){

intx,y;

scanf(“%d%d”,&x,&y);

while(x>0&&y>0){

if(x>y)x=x-y;

else

y=y-x;}printf(%d\n”,x+y);}控制流图控制流图为有向图,由节点和边组成。带箭头的有向边表示控制流。矩形框表示一个计算处理过程。圆角矩形框表示输入或输出菱形框表示一个判定条件9输入x,yx>0&&y>0?x>y?x=x-yy=y-x输出x+yYYNN10输入x,yx>0&&y>0?x>y?x=x-yy=y-x输出x+yYYNN简化的控制流图控制流图节点:表示程序的基本块,对应一条或多条语句;分支节点汇合节点边:带箭头的有向边表示控制流路径完整路径:起点为控制流图起始点,终点为控制流图退出点可行(达)完整路径不可行(达)完整路径11控制流图逻辑覆盖测试逻辑覆盖法,是以程序内部的逻辑结构为基础的测试用例设计方法。逻辑覆盖法又细分为以下方法:语句覆盖分支(判定)覆盖原子谓词覆盖分支-谓词覆盖复合谓词覆盖路径覆盖......12逻辑覆盖测试为统一介绍逻辑覆盖测试的各种覆盖准则,令:T为被测程序P的一个测试数据集GP为P的控制流图LT为与T相对应的GP中的完整路径集合1314voidmain(){floata,b,c,x1,x2,mid;scanf(“%f,%f,%f”,&a,&b,&c);

if(a!=0){mid=b*b-4*a*c;

if(mid>0){x1=(-b+sqrt(mid))/(2*a);x2=(-b-sqrt(mid))/(2*a);printf(“tworealroots\n”);}else{if(mid==0){x1=-b/2*a;printf(“onerealroot\n”);}else{x1=-b/(2*a);x2=sqrt(-mid)/(2*a);

printf(“twocomplexroots\n”);}}printf(“x1=%f,x2=%f\n”,x1,x2);}}一元二次方程求根程序n0n1n3n4n5n6n7e0e1e2e3e4e5e6e7e9e10e11n2e8startend语句覆盖准则语句覆盖:通过测试用例的执行,使被测程序的每个可执行语句至少执行一次。语句覆盖测试覆盖率可定义为:语句覆盖率=(被执行语句数量/所有语句数量)*100%语句测试的充分准则(语句覆盖准则)可以定义为:测试数据集称为语句覆盖充分的,当且仅当LT覆盖了GP中的所有节点。15n0n1n3n4n5n6n7e0e1e2e3e4e5e6e7e9e10e11n2e8startend语句覆盖准则优点:可以很直观地从源代码得到测试用例,无须细分每条判定表达式——测试用例的设计比较简单。可执行语句测试覆盖率较高。缺点:这种方法仅测试能到达可执行语句的条件,不测试其它条件,并且对于隐藏的条件是无法测试的——对条件的测试不全面;该方法不能准确地判断条件中的逻辑关系错误,容易产生漏测的情况;语句覆盖是最弱的逻辑覆盖。16n0n1n3n4n5n6n7e0e1e2e3e4e5e6e7e9e10e11n2e8startend语句覆盖准则对于求解一元二次方程的程序,选择3个测试用例:{2、5、3}{1、2、1}{4、2、1}就能覆盖所有的节点但不能保证a=0这条分支被测试17voidmain(){floata,b,c,x1,x2,mid;scanf(“%f,%f,%f”,&a,&b,&c);

if(a!=0){mid=b*b-4*a*c;

if(mid>0){x1=(-b+sqrt(mid))/(2*a);x2=(-b-sqrt(mid))/(2*a);printf(“tworealroots\n”);}else{if(mid==0){x1=-b/2*a;printf(“onerealroot\n”);}else{x1=-b/(2*a);x2=sqrt(-mid)/(2*a);

printf(“twocomplexroots\n”);}}printf(“x1=%f,x2=%f\n”,x1,x2);}}课堂练习一个函数代码如下,请设计满足语句覆盖的测试用例18课堂练习一个函数代码如下,请设计满足语句覆盖的测试用例19||&&错写成了||,你的测试用例能测出来吗分支覆盖准则分支覆盖:要求在软件测试中,每个分支都至少获得一次“真”值和一次“假”值,也就是使程序中的每个取“真”分支和取“假”分支都至少经历一次。分支覆盖也被称为判定覆盖。分支覆盖测试的充分性准则可以定义为:测试数据集称为语句覆盖充分的,当且仅当LT覆盖了GP中的所有有向边。20n0n1n3n4n5n6n7e0e1e2e3e4e5e6e7e9e10e11n2e8startend分支覆盖准则对于求解一元二次方程的程序,下面4个测试用例对分支覆盖是充分的。21测试用例a,b,ca!=0mid>0mid==0测试用例12,5,3真真假测试用例21,2,1真假真测试用例34,2,1真假假测试用例40,2,1假----n0n1n3n4n5n6n7e0e1e2e3e4e5e6e7e9e10e11n2e8startend课堂练习一个函数代码如下,请设计满足分支覆盖的测试用例22谓词测试一个分支的条件由谓词组成单个谓词称为原子谓词例如a!=0、mid>0等都是原子谓词原子谓词通过逻辑运算符可以构成复合谓词常见的逻辑运算符包括“与”、“或”、“非”等23谓词测试对于复合谓词而言,分支测试不是有效的。例如对于复合谓词构成的条件语句:

if(math>=9||lang>=80||poli>=75)x=1;采用分支测试技术,只要原子谓词中的任何一个被满足,则该分支即为真,而不管其它的两个是否被满足。谓词测试包括:原子谓词覆盖准则分支-谓词覆盖准则复合谓词覆盖准则24短路判断三角形类型程序25void

main()

{

inti,j,k,match;scanf(“%d%d%d”,&i,&j,&k);

if(i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=i)match=4;//不是三角形

elseif(i==j&&i==k)match=1;//等边三角形

elseif(i==j||i==k||j==k)match=2;//等腰三角形

elsematch=3;//普通三角形printf(“match=%d\n”,match);}e6e0e1e2e3e4e5e7谓词测试--原子谓词覆盖准则原子谓词测试要求在软件测试中,每个复合谓词所包含的每一个原子谓词都至少获得一次“真”值和一次“假”值。原子谓词覆盖也被称为条件覆盖。原子谓词覆盖准则:如果对任意一个分支中的任意一个原子谓词,测试数据集T中存在一个测试数据使其在运行时为真、为假至少各一次。26谓词测试--原子谓词覆盖准则对于判断三角形类型的程序,下面11个测试用例满足原子谓词覆盖准则。27测试用例变量原子谓词i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==ki<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k谓词测试--原子谓词覆盖准则对于判断三角形类型的程序,下面11个测试用例满足原子谓词覆盖准则。28测试用例变量原子谓词i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k谓词测试--原子谓词覆盖准则对于判断三角形类型的程序,下面11个测试用例满足原子谓词覆盖准则。29测试用例变量原子谓词i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k谓词测试--原子谓词覆盖准则对于判断三角形类型的程序,下面11个测试用例满足原子谓词覆盖准则。30测试用例变量原子谓词i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k谓词测试--原子谓词覆盖准则对于判断三角形类型的程序,下面11个测试用例满足原子谓词覆盖准则。31测试用例变量原子谓词i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k谓词测试--原子谓词覆盖准则对于判断三角形类型的程序,下面11个测试用例满足原子谓词覆盖准则。32测试用例变量原子谓词i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k谓词测试--原子谓词覆盖准则对于判断三角形类型的程序,下面11个测试用例满足原子谓词覆盖准则。33测试用例变量原子谓词i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------用例62,1,1假假假假假真------i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k谓词测试--原子谓词覆盖准则对于判断三角形类型的程序,下面11个测试用例满足原子谓词覆盖准则。34测试用例变量原子谓词i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------用例62,1,1假假假假假真------用例72,2,2假假假假假假真真--i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k谓词测试--原子谓词覆盖准则对于判断三角形类型的程序,下面11个测试用例满足原子谓词覆盖准则。35测试用例变量原子谓词i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------用例62,1,1假假假假假真------用例72,2,2假假假假假假真真--用例82,2,3假假假假假假真假--i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k谓词测试--原子谓词覆盖准则对于判断三角形类型的程序,下面11个测试用例满足原子谓词覆盖准则。36测试用例变量原子谓词i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------用例62,1,1假假假假假真------用例72,2,2假假假假假假真真--用例82,2,3假假假假假假真假--用例92,3,2假假假假假假假真--i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k谓词测试--原子谓词覆盖准则对于判断三角形类型的程序,下面11个测试用例满足原子谓词覆盖准则。37测试用例变量原子谓词i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------用例62,1,1假假假假假真------用例72,2,2假假假假假假真真--用例82,2,3假假假假假假真假--用例92,3,2假假假假假假假真--用例103,2,2假假假假假假假假真i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k谓词测试--原子谓词覆盖准则对于判断三角形类型的程序,下面11个测试用例满足原子谓词覆盖准则。38测试用例变量原子谓词i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------用例62,1,1假假假假假真------用例72,2,2假假假假假假真真--用例82,2,3假假假假假假真假--用例92,3,2假假假假假假假真--用例103,2,2假假假假假假假假真用例115,3,4假假假假假假假假假i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k谓词测试--原子谓词覆盖准则对于判断三角形类型的程序,下面11个测试用例满足原子谓词覆盖准则。39测试用例变量原子谓词i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------用例62,1,1假假假假假真------用例72,2,2假假假假假假真真--用例82,2,3假假假假假假真假--用例92,3,2假假假假假假假真--用例103,2,2假假假假假假假假真用例115,3,4假假假假假假假假假i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k冗余谓词测试--原子谓词覆盖准则对于判断三角形类型的程序,精简后的9个测试用例满足原子谓词覆盖准则。40测试用例变量原子谓词i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------用例62,1,1假假假假假真------用例72,2,2假假假假假假真真--用例83,2,2假假假假假假假假真用例95,3,4假假假假假假假假假i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k原子谓词覆盖不一定满足分支覆盖。例如对于判定条件if(A&&B),两个测试用例可满足原子谓词覆盖:A为真,B为假A为假,B为真但是上述两个测试用例不能测试if(A&&B)的真分支41课堂练习一个函数代码如下,请设计满足语原子谓词覆盖的测试用例42谓词测试—分支-谓词覆盖准则分支—谓词测试要求在软件测试中,不仅每个复合谓词所包含的每一个原子谓词都至少获得一次“真”值和一次“假”值;并且每个复合谓词本身也至少获得一次“真”值和一次“假”值。分支-谓词覆盖也称为判定/条件覆盖。分支-谓词覆盖准则:如果对任意一个分支和所包含的任意一个原子谓词,测试数据集T中存在一个测试数据使其在运行时为真、为假至少各一次。43谓词测试—分支-谓词覆盖准则对于判断三角形类型的程序,下面9个测试用例满足分支-谓词覆盖准则。44测试用例变量原子谓词i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,2,2真----------------用例22,-1,2假真--------------用例32,2,-1假假真------------用例41,1,2假假假真----------用例51,2,1假假假假真--------用例62,1,1假假假假假真------用例72,2,2假假假假假假真真--用例83,2,2假假假假假假假假真用例95,3,4假假假假假假假假假(1)i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=i(2)i==j&&i==k(3)i==j||i==k||j==k课堂练习一个函数代码如下,请设计满足分支谓词覆盖的测试用例45谓词测试—复合谓词覆盖准则分支—谓词测试要求在软件测试中,每个谓词中条件的各种可能都至少出现一次。复合谓词覆盖准则:如果对任意一个分支,对该分支所包含的谓词的任意一个可能的真假组合,测试数据集T中存在一个测试数据使该组合谓词运行时,原子谓词的取值恰好为该真假值组合。46谓词测试—复合谓词覆盖准则对于判断三角形类型的程序,下面12个测试用例满足复合谓词覆盖准则。47测试用例变量原子谓词i,j,ki<=0j<=0k<=0i+j<=ki+k<=jj+k<=ii==ji==kj==k用例1-1,-1,-1真真真真真真------用例2-1,-2,2真真假真假假------用例32,-1,-2假真真假假真------用例42,2,-1假假真假真真------用例51,1,2假假假真假假------用例62,1,1假假假假假真------用例71,2,1假假假假真假------用例82,2,2假假假假假假真真真用例92,2,3假假假假假假真假假用例102,3,2假假假假假假假真假用例113,2,2假假假假假假假假真用例125,3,4假假假假假假假假假i<=0||j<=0||k<=0||i+j<=k||i+k<=j||j+k<=ii==j&&i==ki==j||i==k||j==k课堂练习一个函数代码如下,请设计满足复合谓词覆盖的测试用例48更多的逻辑覆盖准则线性代码序列和跳转覆盖改进的条件/判定覆盖...49部分覆盖准则之间的关系50复合谓词覆盖准则分支--谓词覆盖准则分支覆盖准则原子谓词覆盖准则语句覆盖准则路径覆盖准则路径测试要求观察程序运行的整个路径,要求程序的运行覆盖所有的完整路径。路径覆盖准则:测试数据集T称为路径覆盖充分的,当且仅当LT覆盖了GP中的所有完整路径。51n0n1n3n4n5n6n7e0e1e2e3e4e5e6e7e9e10e11n2e8startend路径覆盖准则对于判断三角形类型的程序,下面4个测试用例满足路径覆盖准则。52测试用例i,j,k执行路径用例1-1,2,2e0e6e7用例22,2,2e0e1e5e7用例32,2,3e0e1e2e4e7用例45,3,4e0e1e2e3e7e0e1e2e3e4e5e7路径覆盖准则特点对于大多数真实程序,需要测试的路径数目可能过多,难以达到100%的路径覆盖率。例如对于相互连接的32个双分支的程序,其分支的数目仅为32个,但路径的数目却是232个通常采用路径测试的简化技术简单路径覆盖准则、基本路径覆盖准则等531234基本路径测试基本路径测试根据程序的逻辑结构求出基本路径,从该基本集导出测试用例保证对程序中的每一条语句至少执行一次。基本路径是指所有程序路径作为一个集合,在这些路径中必然存在一个最小路径集合。基本路径集不是唯一的基本路径测试是在程序流程图的基础上,通过分析控制构造环路复杂性,导出基本可执行路径集合,设计测试用例。54基本路径测试基本路径测试法的主要步骤:以详细设计或源代码作为基础,导出程序的控制流图计算控制流图G的圈复杂度V(G)。确立独立路径集合,即确定线性无关的路径的基本集测试用例生成,确保基本路径集中每条路经的执行55基本路径测试令E为控制流图G中边的数量,N为G中节点的数量,P是G中判定节点(分支节点)的数量计算控制流图圈复杂度的方法方法一:V(G)=E–N+2V(G)=10–8+2=4方法二:V(G)为G中的区域数V(G)=4方法三:V(G)=P+1V(G)=3+1=456ACBGFEDHR1R2R3R4voidselectsort(int*a,intn){inti,j,k,t;

for(i=0;i<n-1;i++){temp=a[i];

k=i;

for(j=i+1;j<n;j++){

if(a[j]<a[k]){k=j;

}

}

if(k!=i){t=a[k];a[k]=a[i];a[i]=t;

}}

}选择排序的程序,将数组中的数据按照从小到大的顺序进行排序(1)根据控制流图计算程序的圈复杂度。图中共有四个判定节点,由公式V(G)=P+1,得V(G)=4+1=5。因此程序的圈复杂度为5。(2)寻找独立路径。由程序的圈复杂度可知独立路径有5条。分别是:path1:1—2—11;path2:1—2—3—4—8—10—2—11;path3:1—2—3—4—8—9—10—2—11;path4:1—2—3—4—5—6—7—4—8—9—10—2—11;path5:1—2—3—4—5—7—4—8—10—2—11。测试用例路径输入数据预期输出结果用例1path1:1—2—11n=1;a[0]=5a[0]=5用例2path2:1—2—3—4—8—10—2—11n=2路径不可达用例3path3:1—2—3—4—8—9—10—2—11n=2路径不可达用例4path4:1—2—3—4—5—6—7—4—8—9—10—2—11n=2;a[0]=5;a[1]=3k=1;a[0]=3;a[1]=5用例5path5:1—2—3—4—5—7—4—8—10—2—11n=2;a[0]=3;a[1]=5k=0;a[0]=3;a[1]=5

Procedureaverage1:i=1;total.input=total.valid=0;sum=0;2:dowhilevalue[i]<>-9993:andtotal.input<1004:incrementtotal.inputby1;5:ifvalue[i]>=minimum6:andvalue[i]<=maximum7:thenincrementtotal.validby1;sum=sum+value[i];8:endifincrementiby1;9:enddo10:iftotal.valid>011:thenaverage=sum/total.valid;12:elseaverage=-99913:endaverage计算不超过100个在规定值域内的有效数字的平均值。

Procedureaverage1:i=1;total.input=total.valid=0;sum=0;2:dowhilevalue[i]<>-9993:andtotal.input<1004:incrementtotal.inputby1;5:ifvalue[i]>=minimum6:andvalue[i]<=maximum7:thenincrementtotal.validby1;sum=sum+value[i];8:endifincrementiby1;9:enddo10:iftotal.valid>011:thenaverage=sum/total.valid;12:elseaverage=-99913:endaverage1

2412111310538796第一步画流图=-999i=100<=maxsum有效值<=min>0<>-999i<100>=min>max=-99963

圈复杂度V(G)V(G)=E-N+2=17-13+2=6第二步计算圈复杂度1

2412111310538796第二步V(G)=6=-999i=100<=maxsum有效值<=min>0<>-999i<100>=min>max=-99964路径

1:1-2-10-11-13

2:1-2-10-12-133:1-2-3-10-11-13

4:1-2-3-4-5-8-9-2-•••5:1-2-3-4-5-6-8-9-2-•••

6:1-2-3-4-5-6-7-8-9-2-•••第三步确定独立路径1

2412111310538796第二步V(G)=6=-999i=100<=maxsum有效值<=min>0<>-999i<100>=min>max=-999编号测试用例预期结果1k个有效输入k<i第i个=-9992≤i≤100基于k的正确平均值和总数不能独立测试2Value(1)=-999average=-9993100个有效输入i=100前100个数的正确平均值总数为100,不能独立测试4i个<最大值的输入i<100有k个<最小值k<i基于k的正确平均值和总数5i个>最小值输入i<100基于k的正确平均值和总数6i个有效输入i<100正确的平均值和总数第四步:设计测试用例循环测试用于测试循环结构的有效性。在结构化程序中,循环通常有三类:

简单循环嵌套循环串接循环66循环测试简单循环的测试:使用下列测试集,其中n为允许通过循环的最大次数。跳过循环只通过循环一次通过循环两次通过循环m次,其中m<n-1通过循环n-1,n,n+1次67循环测试嵌套循环的测试:从内层循环开始测试,其它循环设为最小值。对内层循环使用简单循环测试方法,使外层循环的迭代参数取最小值,并为越界值或非法值增加一些额外测试。由内向外,对下一个循环进行测试,但保持所有外层循环为最小值,其他嵌套循环为“典型”值。继续进行下去,直到测试完所有循环。68循环测试串接循环的测试:串接循环的各个循环彼此独立,可采用简单循环测试方法。若前一个循环的计数器值是后一个循环的初始值,可采用嵌套循环测试方法。69本章内容逻辑覆盖测试数据流测试变异测试其他白盒测试方法70数据流测试begin

intx,y;floatz;input(x,y)z=0;

if(x!=0)z=z+y;

elsez=z-y;

if(y!=0)z=z/x;

elsez=z*x;output(z);

end71测试用例xyzt1000.0t2111.0分支/谓词覆盖准则x=0,y=1时导致第9行出现除零缺陷测试用例xyz覆盖z的定义使用对t1000.0(l4,l7),(l7,l10)t2111.0(l4,l6),(l6,l9)t3010.0(l4,l7),(l7,l9)t4101.0(l4,l6),(l6,l10)确保z的每一个定义-使用都覆盖变量的定义和使用定义:变量被赋值例如:z=0,z被定义使用:变量的值被引用c-use,计算性引用例如:z=z+y,y被计算性引用P-use,谓词性引用例如:x!=0,x被谓词性引用72变量定义和使用变量定义使某变量存储单元内容改变的语句就是该变量的定义语句;记作DEF(v,n)

v:变量;n:对应的语句节点;或DEF(n)={v1,v2,..,vm}73begin

intx;input(x);y=1;

end输入语句、赋值语句begin

intx,y;for(x=1;x<100;x++)y=f(x);

end循环控制语句、过程调用DEF(x,n3)DEF(y,n4)DEF(x,n3)DEF(y,n4)变量定义和使用变量使用使用某变量存储单元的内容语句就是该变量的使用语句;记作USE(v,n)

v:变量;n:对应的语句节点;或USE(n)={v1,v2,..,vm}74begin

intx=1,y;input(x);if(x>0)y=x+1;print(y);

end输出语句、赋值语句条件语句begin

intx,y;for(x=1;x<100;x++)y=f(x);

end条件语句循环控制语句、过程调用USE(x,n4)USE(x,n3)USE(x,n4)USE(x,n5)USE(y,n6)基于数据流的测试方法数据流测试关注:程序中数据的定义与使用是否正确,即定义/引用错误:变量被定义,但从未被引用过;所使用变量没有被定义变量在使用之前被定义两次begin

intx,y,z;x=1;y=z+2;x=3;z=x+y;

end数据流图76数据流图源代码控制流图构造数据流图根据程序P及其CFG构造数据流图的过程:计算每个基本块i的defi、c-usei、p-usei;将节点集N中的每个节点i与defi、c-usei、p-usei关联起来;针对每个具有非空p-use集并且在条件C处结束的节点i,如果条件C为真时执行的边(i,j),C为假时执行的是边(i,k),分别将边(i,j),(i,k)与C、!C关联起来。77基于数据流的测试方法程序数据流视角:程序是一个程序元素对数据访问的过程;数据流关系:数据“定义——使用”对;使用程序图来描述数据定义-使用对;变量定义-使用路径变量v的定义-使用路径:在程序图中的一条路径,使得对某个v∈V,存在节点DEF(v,m)和USE(v,n),使得m和n是该路径的最初节点和最终节点;记作du-pathn3->n4->n5->n6->n7是一个du-path79begin

intx,y;x=1;input(y);if(y>0)x=3;y=x+2;

end变量定义-清除路径变量v的定义-清除路径:在具有最初节点和最终节点DEF(v,m)和USE(v,n)的路径当中,没有其他节点是v的定义节点;记作dc-pathn3->n4->n5->n7是一个dc-path在对于变量v的dc-path(m,n),在语句m,n之间,我们称变量v是活的;不是定义-清除路径的定义-使用路径,是潜在有问题的地方;n3->n4->n5->n6->n7不是一个dc-path80begin

intx,y;x=1;input(y);if(y>0)x=3;y=x+2;

end实例:变量定义-使用811a=5;/*定义a*/2while(C1){3if(C2){4b=a*a;/*使用a*/5a=a-1;/*定义且使用a*/6}7print(a);}/*使用a*/1234567du-pathdc-path1234y12345y1234567n567y定义-使用路径测试覆盖全定义-使用路径指标:针对程序中所有变量的每一定义-使用对,都有测试用例使得程序执行了一条du-path。其他数据流覆盖指标全使用全计算使用/部分谓词使用全谓词使用/部分计算使用全定义使用全谓词使用全边全节点数据流覆盖指标层次结构图83全路径全使用全定义-使用全计算使用/部分谓词使用全定义全谓词使用/部分计算使用全谓词使用全边全节点数据流测试实例具有数据流信息的控制流图84z)定义覆盖准则测试数据集T对测试程序P满足定义覆盖准则:

如果对具有数据流信息的控制流图GP中的每一个变量x的每一个定义性出现,若该定义性出现能够可行的传递到该变量的某一个引用性出现,那么LT中存在一条路径A,它包含一条子路径A′,使得A′将该定义出现传递到某一个引用性出现。85定义覆盖准则:路径:

Al=<a,b,d,e>,A2=<a,c,e>z)引用覆盖准则测试数据集T对测试程序P满足引用覆盖准则:如果对具有数据流信息的控制流图Gp中的每一个变量x的每一个定义n,以及该定义的每一个能够可行地传递到的引用n′,LT中都存在一条路径A,A包含一条子路径A′,使得A′将n传递到n′。86引用覆盖准则:路径集合:{<a,b,b,c,c,b,b,d>,<a,d>,<a,c,c,b,b,c,d>}z)定义-引用覆盖准则测试数据集T对测试程序P满足定义-引用覆盖准则:

如果对具有数据流信息的控制流图Gp中的任意一条从定义传递到其引用的路径A,若A是无回路的或者A只是开始节点和结束节点相同,那么LT中存在一条路径B,使得A是B的子路径。87定义-引用覆盖准则:路径集合:{<a,b,b,c,c,b,b,d>,<a,d>,<a,c,c,b,b,c,d>}z)本章内容逻辑覆盖测试数据流测试变异测试其他白盒测试方法88程序变异经过多年的测试理论与实践研究,人们发现要找出程序中的所有错误是不可能的,现实的解决办法是尽可能缩小错误搜索的范围,这样做的好处是,便于集中目标于对软件危害较大的错误,暂时忽略危害较小的错误,以此取得较高的测试效率,降低测试成本。程序变异是一种错误驱动测试,是针对某种类型的特定程序错误而提出来的。程序变异测试的分类:(1)程序强变异测试(通常称:程序变异)(2)程序弱变异测试89程序变异思想程序变异(ProgramMutation)测试技术的基本思想是:对于给定的程序P,先假定程序中存在一些小错误,每假设一个错误,程序P就变成P′,如果假设了n个错误:e1,e2,…,en,则对应有n个不同的程序:P1,P2,…,Pn,这里Pi称为P的变异因子或变异体。理论上,若P正确,Pi肯定错误,即存在测试数据Ci,使得P和Pi的输出结果是不同的。90程序变异思想因此,根据程序P和每个变异的程序,可以求得P1,P2…,Pn的测试数据集

C={C1,C2,…,Cn}。运行C,如果对每一个Ci,P都是正确的,而Pi都是错误的,这说明P的正确性较高。如果对某个Ci,P是错误的,而Pi是正确的,这说明P存在错误,而错误就是ei。91程序变异思想给定一个程序P和一个测试数据集T,通过变异算子为P产生一组变异体Mi(合乎语法的变更),对P和M都使用T进行测试运行。如果某Mi在某个测试输入t上与P产生不同的结果,则该Mi被杀死;若某Mi在所有的测试数据集上都与P产生相同的结果,则称其为活的变异体接下来对活的变异体进行分析,检查其是否等价于P;对不等价于P的变异体M进行进一步的测试,直到充分性度量达到满意的程度。92真假美猴王93在唐僧那:念紧箍咒,两个都喊疼,自然看不出哪个真假;到天宫:拖塔天王拿照妖镜照,也看不出;又到观音那:观音也看不出。最后到幽冥处阎罗那,经“谛听”听过之后,“谛听”却说:“我看出来了,却不敢说”最后还是如来老佛爷道出六耳真身并用金钵盂罩住。程序变异思想假设程序P已使用测试T中的测试用例测试通过,而且没有错误。变异是一种轻微改变程序的操作。94Example:Program11beginintx,y;input(x,y);if(x<y)output(x+y)elseoutput(x*y);endProgram1的变异体M11beginintx,y;input(x,y);

if(x<=y)output(x+y)elseoutput(x*y);endProgram1的变异体M21beginintx,y;input(x,y);if(x<y)output(x+y)else

output(x/y);endChangedtoPP’程序变异思想P’称为P的变异体如果对于T中的测试t,有P(t)≠P’(t),称作P’与P有区别(distinguishes),或者t杀死(killed)P’.如果T中所有的测试

t使得P(t)=P’(t),称T不能区别P和P’。那么称在测试过程中P’是活的(live).如果在程序P的输入域中不存在任何测试用例t使得P与P’

区别,则称P’等价于P。如果P’不等价于P,而且T中没有测试能够将P’与P区别,则认为T是不充分的。不等价而且是活的变异体为测试人员提供了一个生成新测试用例的机会,进而增强测试T。

95PP’C语言的变异算子Purdue大学的RichardA.Demillo领导的研究小组设计了最大、最全面也是唯一的C语言变异算子集合。巴西SaoCarlos大学JoseMaldonado领导的研究小组在工具Proteum中实现了C语言的全部变异算子。C语言的全部77个变异算子可分为四类:常量变异运算符变异语句变异变量变异96C语言的常量变异C语言中的常量变异算子表97名称定义域说明CGCR常量使用全局变量替换程序中出现的常量CLSR常量使用局部变量替换程序中出现的标量CGSR常量使用全局变量替换程序中出现的标量CRCR常量必需的常量替换CLCR常量使用局部常量替换程序中出现的常量C语言的常量变异实例:CRCR-必需的常量替换考虑语句k=j+*p,其中k,j都是整数,p是一个指向整数的指针,当对该语句进行CRCR变异时,得到下面的变异体:k=0+*pk=1+*pk=-1+*pk=ui+*pk=j+null98C语言的运算符变异运算符(operator)指的是C语言中的运算符,比如算术运算符+和关系运算符<运算符变异分类:二元运算符变异同类运算符替换(Ocor)非同类运算符替换(Oior)一元运算符变异99C语言中运算符变异Ocor中变异算子的定义域和值域100名称定义域值域示例OAAA算术赋值算术赋值a+=b→a-=bOAAN算术算术a+b→a*bOBBA位赋值位赋值a&=b→a|=bOBBN位位a&b→a|bOLLN逻辑逻辑a&&b→a||bORRN关系关系a<b→a<=bOSSA移位赋值移位赋值a<<=b→a>>=bOSSN移位移位a<<b→a>>bOior中变异算子:算术运算符与位运算符101名称定义域值域示例OABA算术赋值位赋值a+=b→a|=bOAEA算术赋值单纯赋值a+=b→a=bOABN算术位a+b→a&bOALN算术逻辑a+b→a&&bOARN算术关系a+b→a<bOASA算术赋值移位赋值a+=b→a<<=bOASN算术移位a+b→a<<bOBAA位赋值算术赋值a&=b→a+=bOBAN位算术a&b→a+bOBEA位赋值单纯赋值a&=b→a=bOBLN位逻辑a&b→a&&bOBRN位关系a&b→a<bOBSA位赋值移位赋值a&=b→a<<=bOBSN位移位a&b→a<<bOior中变异算子:单纯赋值、逻辑和关系102名称定义域值域示例OEAA单纯赋值算术赋值a=b→a+=bOEBA单纯赋值位赋值a=b→a&=bOLAN逻辑算术a&&b→a+bOLRN逻辑关系a&&b→a&bORAN关系算术a<b→a+bORLN关系逻辑a<b→a&&bORSN关系移位a<b→a<<b............C语言的运算符变异一元运算符变异递加/递减x++→++xx++→x--逻辑否定逻辑上下文否定位取反间接运算符优先级变异强制转换运算符替换103C语言的语句变异104算子定义域说明SBRCbreak用continue替换breakSBRnbreakbreak到第n层SCBBcontinue用break替换continueSDWDdo-while使用while替换do-whileSGLRgoto互换goto语句的标签SMVB语句上(下)移动右花括号SRSRreturn互换return语句SSDL语句删除语句SSOM语句顺序运算符变异STRIifIf条件陷阱STRP语句语句执行陷阱SMTC迭代语句多次迭代继续SSWMswitch语句switch语句变异SMTT迭代语句多次迭代陷阱SWDDwhile使用do-while替换while语句变异实例:语句执行陷阱105语句变异实例:语句删除变异106C语言的变量变异107算子定义域说明VASM数组下标数组引用下标变异VDTR标量引用绝对值变异VGAR数组引用使用全局数组引用替换数组引用VGLA数组引用使用全局、局部数组引用来替换数组引用VGPR指针引用使用全局指针引用替换指针引用VGSR标量引用使用全局标量引用替换标量引用VGTR结构引用使用全局结构引用替换结构引用VLAR数组引用使用局部数组引用替换数组引用VLPR指针引用使用局部指针引用替换指针引用VLSR标量引用使用局部标量引用替换标量引用VLTR结构引用使用局部结构引用替换结构引用VSCR结构元素结构元素替换VTWD标量表达式摆动变异变量变异:摆动变异摆动变异:检查标量变量的边界条件实例:考虑p=a+b,假设p,a,b都是整数摆动变异得到的变体:p=a+b+1p=a+b-1108Java语言的变异算子作为类C语言,C的许多变异算子可应用到Java程序的变异中。针对Java语言的特性以及OO特点,有些研究小组提出了一些Java的变异算子Yu-SeungMa,Tong-raeKwon,JeffOffutt提出的算子在muJava系统中实现伦敦GoldsmithsCollegeUniversity的SebastianDanicic在Lava工具内实现了一套变异算子集IvanMoore实现了Jester的Java程序变异工具109Java语言的变异算子Java类变异算子,模拟对象为与继承相关的错误110算子定义域说明IHD变量如果变量x已在parent(C)中声明,那就移除其在子类C中的声明IHI子类如果变量x已在parent(C)中声明,那就在子类C中增加一个x的声明IOD方法如果方法m已在parent(C)中声明,那就移除其在子类C中的声明IOP方法在子类的方法中,把一个形如super.M(...)的调用上移一句;下移一句;移至m方法体开始;移至m方法体结尾IOR方法如果方法f1调用parent(C)中的方法f2,且f2在子类C中有覆写定义,那就把f2重命名为f2’ISK对父类的访问IPCSuper调用删除子类C构造函数中的super关键字Java语言的变异算子实例:模拟对象为与继承相关的错误111

classPlanet{

doubledist;...

}

classFarPlanetextendsPlanet{

doubledist;...

}

classPlanet{

doubledist;...

}

classFarPlanetextendsPlanet{

//删除声明...

}IHDJava语言的变异算子多态与动态绑定112算子定义域说明PMC对象实例化若t1为子类类型而t2为父类类型,当使用new进行对象实例化时,使用t2替换t1PMD对象声明若对象x的类型为t1,则使用其父类t2替换它PPD参数若对象x的类型为t1,其父类类型为t2,则当t1在方法的参数中出现时,用t2对其进行替换PRV对象声明若两个对象o1与o2类型兼容,且在同一上下文中声明,那么当o1在赋值语句右端出现时,使用o2对其进行替换Java语言的变异算子实例:多态与动态绑定假设Planet是FarPlanet的父类113

FarPlanetp;p=new

FarPlanet();PMC

Planetp;p=new

FarPlanet();

Planetp;p=new

Planet();PMD

Planetp;p=new

FarPlanet();Java语言的变异算子方法重载114算子定义域说明OMR重载方法互换重载方法的方法体OMD重载方法删除重载方法OAD方法变更方法参数的次序OAN方法删除重载方法的参数Java语言的变异算子实例:方法重载115voidinit(initi){...}voidinit(inti,Strings){...}OMRvoidinit(initi){...}voidinit(inti,Strings){

this.init(i);}OMRvoidinit(initi){

this.init(i,””);}voidinit(inti,Strings){...}Java语言的变异算子Java特有的变异算子116算子定义域说明JTDthis删除this关键字JSC类变量把变量变为实例变量JID成员变量删除成员变量的初始化语句JDC构造函数删除用户定义的构造函数EOA对象引用通过clone(),使用对象内容替换对象引用EOC比较表达式使用equals替换==EAM访问方法调用替换对相互兼容的访问方法的调用EMM修改方法调用替换对相互兼容的修改方法的调用Java语言的变异算子实例:Java特有的变异算子117Elementhydrogen,hisotope;hydorgen=newElement();hisotope=hydrogen;EOAElementhydrogen,hisotope;hydorgen=newElement();hisotope=hydrogenclone();程序变异步骤118程序变异步骤第1步:程序执行P(t)表示给定测试用例t,程序P的执行结果由P中变量的输出值表示(也可能与

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论