版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
白盒测试方法1第1页,共99页,2023年,2月20日,星期一第3章白盒测试方法3.1白盒测试分类3.2控制结构测试条件测试数据流测试循环测试3.3逻辑驱动覆盖3.4程序插装3.5基本路径测试3.6数据流测试3.7案例研究2第2页,共99页,2023年,2月20日,星期一良好测试用例的特征可以最大程度地找出软件隐藏的缺陷可以最高效率的找出软件缺陷可以最大程度地满足测试覆盖要求既不过分复杂、也不能过分简单使软件缺陷的表现可以清楚的判定测试用例包含期望的正确的结果待查的输出结果或文件必须尽量简单明了不包含重复的测试用例测试用例内容清晰、格式一致、分类组织3第3页,共99页,2023年,2月20日,星期一3.1白盒测试白盒测试:是一种基于源程序或代码结构的逻辑,生成测试用例以尽可能多地发现并修改源程序中的错误。白盒测试分为静态和动态两种类型:静态分析。静态方法是指按一定步骤直接检查源代码或代码的测试方法,包括:代码审查、桌面检查、代码走查等动态测试。动态测试是指按一定步骤生成测试用例并驱动被测程序运行来发现错误,包括:基本路径测试、边界值测试、逻辑驱动覆盖、循环测试、数据流测试、程序插装等4第4页,共99页,2023年,2月20日,星期一白盒测试白盒测试,有时称为玻璃盒测试,是一种基于源程序或代码的测试方法。白盒测试动态方法是使用程序设计的控制结构导出测试用例。使用这类方法,软件工程师能够产生测试用例:(1)保证一个模块中的所有独立路径至少被使用一次;(2)对所有逻辑值均需测试true和false;(3)在上下边界及可操作范围内运行所有循环;(4)检查内部数据结构以确保其有效性。5第5页,共99页,2023年,2月20日,星期一为什么需要白盒测试“我们应该更关注保证程序需求的实现,为什么要在逻辑细节的测试上花时间和精力呢?”逻辑错误和不正确假设与一条程序路径被执行的可能性成反比。人们往往会忽略非主流的偶然现象!我们经常相信某逻辑路径不可能被执行,而事实上,它可能在正常的情况下被执行。程序的逻辑流有时是违反直觉的!只有路径测试才能发现这些问题!笔误是随机的。当一个程序被翻译为程序设计语言源代码时,有可能产生某些笔误,很多错误将由语法检查机制发现,但是,其他的会在测试开始时才会被发现。“错误潜伏在角落里,聚集在边界上”,而白盒测试更可能发现它!6第6页,共99页,2023年,2月20日,星期一白盒测试用例设计方法白盒测试用例的设计方法逻辑覆盖:以程序的内部逻辑结构为基础,分为语句覆盖、判定覆盖、判定-条件覆盖、条件组合覆盖等基本路径测试:在程序控制流程的基础上,分析控制构造的圈复杂性,导出基本可执行路径集合,从而设计测试用例。白盒测试用例注意事项由于测试路径可能非常多,基于时间和资源问题,宜选出足够多合理的路径测试由于深入到程序编码,通常开发人员协助测试人员书写白盒测试用例7第7页,共99页,2023年,2月20日,星期一3.1白盒测试分类控制结构测试条件测试数据流测试循环测试逻辑驱动覆盖测试语句覆盖判定(分支)覆盖条件覆盖判定-条件覆盖条件组合覆盖基本路径测试程序插装8第8页,共99页,2023年,2月20日,星期一条件测试目标:要遍历部件中每个简单逻辑条件的true
和false
的值。逻辑条件简单条件:(arel-opb)这里rel-op={<,≤,=,≠,≥,>}(可带有NOT的否),例如a≤b;NOT(a≤b);或一个布尔变量复合条件:用AND,OR连接的两个或多个简单条件,例如.,(a>b)AND(c<d)关系表达式:(E1rel-opE2)这里E1
和E2
为算术表达式,例如,((a*b+c)>(a+b+c))可测试的错误有(不正确/遗漏/额外):布尔操作符 布尔变量 布尔括弧关系操作符算术操作符9第9页,共99页,2023年,2月20日,星期一条件测试域测试对于表达式E1
rel-opE2,进行关于E1
≧≦=<>≠E2的测试能发现关系操作符错误,如果E1
和E2
正确为发现E1/
E2中的错误,计算E1
小于或大于
E2
的测试用例应使两个值之间的差别尽可能小对于有n个变量的布尔表达式,需要2n
个可能测试用例(n>0)分支测试(可能是最简单的条件测试策略)对于复合条件C,测试C的true和false分支以及C中每个简单条件例如,对于C=(a>b)AND(c<d)测试: a>bTRUE,FALSEc<dTRUE,FALSEC
TRUE,FALSETrueANDTrueT.AndF.,F.AndT.,
F.AndF.10第10页,共99页,2023年,2月20日,星期一条件测试如果(i=result=0):maxintN
i<N
result<=maxint-11truefalse10falsetrue各种条件都覆盖到了但不能保证判定覆盖
注意:条件覆盖要关注到判定覆盖:判定/条件覆盖i:=i+1;result:=result+i;(i<N)and(result<=maxint)result<=maxintN<0N:=-N;output(result);output(toolarge);exitstartyesnonoyesyesno11第11页,共99页,2023年,2月20日,星期一分支测试分支(判定)覆盖执行足够测试用例,以覆盖软件中所有路径:
-“True”和“False”都要有
-通过每条分支。例如IFbTHENs1ELSEs2CASExOF
1:….
2:….
3:….12第12页,共99页,2023年,2月20日,星期一分支测试-example1 PROGRAMsom(maxint,N:INT)2 INTresult:=0;i:=0;3 IFN<04 THENN:=-N;5 WHILE(i<N)AND(result<=maxint)6 DO i:=i+1;7 result:=result+i;8 OD;9 IFresult<=maxint10 THENOUTPUT(result)11 ELSEOUTPUT(“toolarge”)12 END.
13第13页,共99页,2023年,2月20日,星期一分支测试i:=i+1;result:=result+i;(i<N)and(result<=maxint)result<=maxintN<0N:=-N;output(result);output(toolarge);exitstartyesnonoyesyesnoN<0完整的语句覆盖测试:
maxint N10 -10 -1不足以达到判定覆盖;取:maxint N10 30 -1达到完整判定覆盖(N>=0)result=0i=014第14页,共99页,2023年,2月20日,星期一3.2.2数据流测试数据流分析通过对变量构造定义-使用对来实现。数据流测试的基本思想是:一个变量的定义,通过辗转的使用和定义,可以影响到另一个变量的值,或影响到路径的选择等,因此,可以选择一定的测试数据,使程序按照一定变量的定义-使用路径执行,并检查执行结果是否与预期的相符,从而发现代码的错误。
数据流测试方法按照程序中的变量定义和使用的位置来选择程序的测试路径。15第15页,共99页,2023年,2月20日,星期一数据流测试为了说明数据流测试方法,假设程序的每条语句都赋予了独特的语句号,而且每个函数都不改变其参数和全局变量。对于语句号为S的语句,
Def(S)={X|语句S包含X的定义}
Use(S)={X|语句S包含X的使用}如果存在从S到S′的路径,并且该路径不含X的其他定义,则称变量X在语句S处的定义在语句S′仍有效。变量X的“du-关联”形式如【x,S,S′】
其中S和S′是语句号,x在Def(S)和use(S′)中,而且语句S定义的X在语句S′有效。右图中变量x的du-关联为【x,1,4】,其相应的
du-路径为(1,2,4)和(1,3,4)如果语句S是if或循环语句,它的Def(S)集为空,而Use(S)集取决于S的条件X=y+zW=x1234Def(1)={x}Use(1)={y,z}Def(4)={w}Use(4)={x}16第16页,共99页,2023年,2月20日,星期一数据流测试一种简单的数据流测试策略是要求覆盖每个du链至少一次。我们将这种策略称为du测试策略已经证明du测试并不能保证覆盖程序的所有分支,但是,du测试不覆盖某个分支仅仅在于如下之类的情况:if-then-else中的then没有定义变量,而且不存在else部分。这种情况下,if语句的else分支并不需要由du测试覆盖
17第17页,共99页,2023年,2月20日,星期一数据流测试数据流测试策略可用于为包含嵌套if和循环语句的程序选择测试路径,为此,考虑使用du测试为如下的PDL选择测试路径:procxB1;//在B1末尾处定义XdowhileC1ifC2thenifC4thenB4;//在B4开始处使用X,在B4末尾处定义XelseB5;//在B5开始处使用X,在B5末尾处定义Xendif;
elseifC3thenB2;//在B2开始处使用X,在B2末尾处定义XelseB3;//在B3开始处使用X,在B3末尾处定义Xendif;
endif;
enddo;
B6;endproc;
18第18页,共99页,2023年,2月20日,星期一数据流测试为了用du测试选择控制流图的测试路径,需要知道PDL条件或块中的变量定义和使用。假设变量X定义在块B1,B2,B3,B4和B5的最后一条语句之中,并在块B2,B3,B4,B5和B6的第一条语句中使用。du测试策略要求执行从每个B(1<i≤5)到Bj(1<j≤6)的最短路径(这样的测试也覆盖了条件C1,C2,C3和C4中的变量使用)。尽管有25条X的du链,只需5条路径覆盖这些du链。原因在于可用5条从Bi(1<i≤5)到B6的路径覆盖X的链,而这5条链包含循环的迭代就可以覆盖其他的du链。19第19页,共99页,2023年,2月20日,星期一数据流测试du-路径1:1-2-16(c1不满足)du-路径2:1-2-3-4-5-6-8-14-15-16(c2满足,c4满足)du-路径3:1-2-3-4-5-7-8-14-15-16(c2满足,c4不满足)du-路径4:1-2-3-9-10-11-13-14-15-16(c2不满足,c3满足)du-路径5:1-2-3-9-10-12-13-14-15-16(c2不满足,c3不满足)由于变量的定义和使用,程序中的语句都彼此相关,所以数据流测试方法能够有效地发现错误,但是,数据流测试的覆盖率测度和路径选择比条件测试更为困难20第20页,共99页,2023年,2月20日,星期一3.2.3循环测试循环测试是一种特殊的路径测试,一般可把循环分为以下4种:简单循环嵌套循环串接循环不规则循环21第21页,共99页,2023年,2月20日,星期一简单循环下面的测试集应用于简单循环,其中n是可允许通过循环的最大值:跳过整个循环;只通过循环一次;通过循环两次;通过循环m次,其中m<n;通过循环n-1次,n次,n+1次。22第22页,共99页,2023年,2月20日,星期一简单循环单循环应重点测试以下方面:循环变量的初值是否正确循环变量的最大值是否正确循环变量的增量是否正确何时退出循环23第23页,共99页,2023年,2月20日,星期一例子#include<stdio.h>Voidmain(){inti=0;intsum=0;while(i<=10)(sum=sum+1;i++;)printf(“%d\n”,sum))测试项预期结果循环变量的初值0循环变量的最大值10循环变量的增量i++何时退出循环当循环变量i超过最大值10时退出循环24第24页,共99页,2023年,2月20日,星期一嵌套循环如果我们把单循环的测试方法扩展到嵌套循环,那么可能的测试次数随着嵌套层数的增加而呈几何级数增长。Beizer[BEI90]提出了一种有利于减少测试次数的方法:从最内层的循环开始,将其他循环设为最小值保持外层循环的迭代参数(即循环参数)处于最小值,对最内层进行简单循环测试,并增加其他范围以外或排斥的值进行测试;从里向外,进行下一层的循环测试,但仍要保持所有外层循环的最小值,而其他嵌套循环处于“典型”值。照此进行,直到所有循环测试完毕。25第25页,共99页,2023年,2月20日,星期一嵌套循环嵌套循环应重点测试以下方面:当外循环变量为最小值,内层循环也为最小值时,运算的结果当外循环变量为最小值,内层循环为最大值时,运算的结果当外循环变量为最大值,内层循环为最小值时,运算的结果当外循环变量为最大值,内层循环也为最大值时,运算的结果循环变量的增量是否正确何时退出循环26第26页,共99页,2023年,2月20日,星期一串接循环串接循环:如果串接循环的循环体都彼此独立,可以使用上面简单循环的测试方法如果两个循环串接起来,并且第一个循环的循环计数器是第二个循环的初始值,则可采用嵌套循环的测试方法不规则循环应先将这类循环重新设计为结构化程序结构,然后再测试27第27页,共99页,2023年,2月20日,星期一测试覆盖率什么是测试覆盖率?测试覆盖率是程序被一组测试用例执行到的百分比。覆盖率=(至少被执行一次的被测试项数)/被测试项总数覆盖率是用来度量测试完整性的一种手段。测试覆盖率包括:代码(结构)覆盖率需求(功能)覆盖率28第28页,共99页,2023年,2月20日,星期一3.3逻辑驱动覆盖什么是逻辑驱动覆盖(代码覆盖率)?代码覆盖率是被测试到的代码的比例,包括所有的路径、判定和条件在检查逻辑驱动覆盖率时,主要覆盖标准有:语句覆盖判定覆盖条件覆盖判定-条件覆盖条件组合覆盖路径覆盖数据流覆盖和循环覆盖29第29页,共99页,2023年,2月20日,星期一一个简单子程序测试procedureexample(a,b:real;varx:real),;begins if(a>1)and(b=0)
athenx:=x/a
c; if(a=2)or(x>1)
bthenx:=x+1
e;endd;30第30页,共99页,2023年,2月20日,星期一入口(a>1)and(b=0)(a=2)or(x>1)x=x/ax=x+1返回sab
dce
tftf子程序流程图31第31页,共99页,2023年,2月20日,星期一被测程序段路径If((a>1)and(b==0))-aIf((a==2))or(x>1))-bx=x/a;-cx=x+1;-e返回-d图中存在4条不同路径:L1:sacbed;即条件a为t,且条件b为tL2:sabd;即条件a为f,且条件b为fL3:sabed;即条件a为f,且条件b为tL4:sacbd;即条件a为t,且条件b为f以下讨论该例子的各种覆盖和测试用例设计!32第32页,共99页,2023年,2月20日,星期一语句覆盖语句覆盖报告每个可执行语句是否被执行,即每行源代码是否都被执行了并且被测试了。语句覆盖率也被称为行为覆盖率、段覆盖率或基本块覆盖率。注意:在基本块覆盖率的计算里,被测量的代码单元是不含分支的语句序列。语句覆盖率=(至少被执行一次的语句数量)/(可执行的语句总数)语句覆盖是最弱逻辑覆盖准则,效果有限,必须与其他方法交互使用.其实在C语言里判定语句个数很简单,只需数分号个数就可以了!33第33页,共99页,2023年,2月20日,星期一语句覆盖语句覆盖就是设计若干个测试用例,运行被测程序,使得每一可执行语句至少执行一次。在图例中,正好所有的可执行语句都在路径L1上,所以选择路径L1设计测试用例,就可以覆盖所有的可执行语句。测试用例的设计格式如下:
【输入的(a,b,x),输出的(a,b,x)】为图例设计满足语句覆盖的测试用例是:测试数据预期结果X=4,a=2,b=0X=334第34页,共99页,2023年,2月20日,星期一语句覆盖的缺陷从程序中每个语句都得到执行这一点来看,语句覆盖的方法似乎能够比较全面地检验每一个语句?!假如这一程序段中两个判定的逻辑运算有问题,例如,第一个判定的运算符“AND”错成运算符“OR”,或把第二个判定中的条件X>1误写成X<1,使用上述的测试数据并不能查出这些错误。“语句覆盖”这个覆盖度量的主要缺点是对一些控制结构不敏感。35第35页,共99页,2023年,2月20日,星期一判定覆盖判定覆盖报告在控制结构中是否测试了布尔表达式取值分别为真和假的情况。整个布尔表达式被认为是取值一个true和false,而不考虑内部是否包含了逻辑与(Logical-And)或逻辑或(Logical-Or)操作符。判定覆盖又称为分支覆盖,它的含义是,不仅每个语句至少执行一次,而且每个判定的每个分支至少执行一次。以上面的程序段为例,如果设计两组测试用例,使它们能通过路径sacbd和sabed,或通过路径sacbed及sabd,即可达到“判定覆盖”标准。判定覆盖率=(判定结果被评价的次数)/(判定结果的总数)36第36页,共99页,2023年,2月20日,星期一判定覆盖选择路径L3和L4,可得如下一组可用的测试用例:
如果选择路径L1和L2,还可得另一组可用的测试用例:
测试数据预期结果执行路径判定a判定cX=1,a=2,b=1X=2sabedftX=3,a=3,b=0X=1sacbdtf测试数据预期结果执行路径判定a判定cX=2,a=2,b=0X=2sacbedttX=1,a=1,b=0X=1sabdff37第37页,共99页,2023年,2月20日,星期一问题除了双值的判定语句外,还有多值判定语句,如CASE语句,所以“判定覆盖”更一般的含义是:使得每一个判定获得每一种可能的结果至少一次。“判定覆盖”比“语句覆盖”更强。上述两组测试用例不仅满足了“判定覆盖”,同时还做到了“语句覆盖”。判定覆盖的缺点是忽略了在布尔表达式内的分支,这是由短路操作符引起的。考虑以下代码段:
if(condition1&&(condition2||function1()))
statement1;
elsestatement2;这个度量完全可以不用调用function1.
测试表达是为真时可以取condition1
为true
和condition2
为true,测试表达是为假时可以取condition1
为false。这里,短路操作符||排除了调用
function1的影响!38第38页,共99页,2023年,2月20日,星期一条件覆盖条件覆盖报告每一个布尔型子表达式的结果的true
或false
。子表达式是用logical-and
和logical-or
分离的。条件覆盖独立的度量每一个子表达式.条件覆盖的含义是不仅每个语句至少执行一次,而且是判定语句中的每个子逻辑条件的可能值至少满足一次。条件覆盖率=(条件操作数值至少被求值一次的数量)/(条件操作数值的总数)但是,完全的条件覆盖并不能保证完全的判定覆盖。例如,考虑下列的C++/Java
代码。bool
f(bool
e)
{
return
false;
}
bool
a[2]
=
{
false,
false
};if
(f(a
&&
b))
...if
(a[int(a
&&
b)])
...if
((a
&&
b)
?
false
:
false)
...所有三个IF语句不管a和b取值是什么,判定覆盖率只能达到50%。但是条件覆盖率却能达到100%。39第39页,共99页,2023年,2月20日,星期一条件覆盖:使程序每个判定的每个条件的真假取值至少满足一次对于第一个判定:条件a>1b=0a=2x>1T1T2T3T4取真表为取假表为〒1〒2〒3〒4
对于第二个判定:条件测试数据预期结果执行路径覆盖条件x=4,a=2,b=0X=3sacbeda>1,b=0,a=2,x>1x=1,a=1,b=1X=1sabda<=1,b!=0,a!=2,x<=1由于一个条件至少有“t”和“f”两个结果,所以满足条件覆盖标准的测试用例也至少有两个!40第40页,共99页,2023年,2月20日,星期一条件覆盖问题:有时覆盖了条件的测试用例不一定覆盖分支。事实上,后一组测试用例只覆盖了4个分支中的两个(b和e)。为解决这一矛盾,需要兼顾条件和分支。41第41页,共99页,2023年,2月20日,星期一判定-条件覆盖判定-条件覆盖就是设计足够的测试用例,使得判定中每个布尔型子表达式条件的所有可能取值(真或为假)至少出现一次,同时每个判定本身的判定结果(为真或为假)也至少出现一次。测试数据预期结果执行路径判定a判定b覆盖的条件x=4,a=2,b=0X=3sacbedtta>1,b=0a=2,x>1x=1,a=1,b=1X=1sabdffa<=1,b!=0a!=2,x<=1满足判定-条件覆盖标准的测试用例42第42页,共99页,2023年,2月20日,星期一判定-条件覆盖判定-条件覆盖也有缺陷。往往某些条件掩盖了另一个条件。例如,条件表达式(a>1)and(b=0)中,若(a>1)的测试为真,则还要测试(b=0),才能决定该表达式的值。若(a>1)的测试为假,可不再测试(b=0)的值了。这样,(b=0)就没有测试到!为彻底地检查所有条件的取值,应将上图的多重判定分解为由多个基本判定组成的流程图,这样可有效地检查所有的条件是否正确了43第43页,共99页,2023年,2月20日,星期一判定-条件覆盖44第44页,共99页,2023年,2月20日,星期一条件组合覆盖条件组合覆盖(多条件覆盖)就是设计足够的测试用例,运行被测程序,使得每个判定的所有可能的条件取值组合至少执行一次。对于上面例子,共有八种可能的条件组合,它们是:①a>1,b=0作
②a>1,b≠0作
③a≯1,b=0作④a≯1,b≠0作⑤a=2,x>1作
⑥a=2,x≯1作
⑦a≠2,x>1作
⑧a≠2,x≯1作45第45页,共99页,2023年,2月20日,星期一条件组合覆盖的测试用例测试数据预期结果执行路径判定a判定c覆盖的条件x=4,a=2,b=0X=3sacbedtta>1,b=0,a=2,x>1x=1,a=2,b=1X=2sabedfta>1,b!=0,a=2,x<=1x=2,a=1,b=0X=3sabedftA<=1,b=0,a!=2,x>1x=1,a=1,b=1X=1sabdffA<=1,b!=0,a!=2,x<=146第46页,共99页,2023年,2月20日,星期一条件组合覆盖对于C,
C++和Java等具有短路操作符(short
circuit
operators)的语言,多条件覆盖的益处是它需要一个彻底的测试。对于Visual
Basic
和Pascal等不具有短路操作符的语言,
多条件覆盖实际上是对于逻辑表达式的路径覆盖,和路径覆盖具有相同的优缺点。考虑下列的Visual
Basic
代码:
If
a
And
b
Then
...
多条件覆盖需要四个测试用例,a
和b分别取值true
和false.
和路径覆盖相同,每增加一个逻辑操作符需要加倍测试用例的数量。47第47页,共99页,2023年,2月20日,星期一问题前面讨论的多种覆盖准则,有的虽提到了所走路径问题,但尚未涉及到路径的覆盖,而路径能否全面覆盖在软件测试中是个重要问题,因为程序要取得正确的结果,就必须消除遇到的各种障碍,沿着特定的路径顺利执行。如果程序中的每一条路径都得到考验,才能说程序受到了全面检验。48第48页,共99页,2023年,2月20日,星期一路径覆盖路径覆盖的含义是:选取足够多的测试数据,使程序的每条可能路径都至少执行一次!一条路径是从函数的入口到出口分支的俄一个唯一序列!从示例程序的流程图和流图中都可以看出,本例中有4条可能的路径L1,L2,L3,L4。路径覆盖率=(至少被执行到一次的路径数)/(总的路径数)路径覆盖的一个好处是进行非常彻底的测试。但有两个缺点:一、路径是以分支数增加而指数增加,例如,一个函数包含10个if语句,就有210=1024个路径要测试。如果加入一个IF语句,路径数就达到2048。
49第49页,共99页,2023年,2月20日,星期一路径覆盖二、许多路径不可能与执行的数据无关。例如
if
(success)
statement1;
statement2;
if
(success)
statement3;
路径覆盖认为以上语句包含四个路径,实际上只有两个是可行的:success=false
和
success=true50第50页,共99页,2023年,2月20日,星期一路径覆盖测试用例测试数据预期结果执行路径判定a判定cx=4,a=2,b=0X=3L1:sacbedttx=3,a=3,b=0X=1L4:sacbdtfx=2,a=1,b=0X=3L3:sabedftx=1,a=1,b=1X=1L2:sabdff51第51页,共99页,2023年,2月20日,星期一结构覆盖测试小结上面6种测试方法,每一种方法都有优点和局限性。从实际应用来看,语句覆盖、判定覆盖和路径覆盖应用最多,往往对测试人员设计的测试用例有如下要求:语句覆盖率:100%判定覆盖率:85%以上路径覆盖率:80%以上至于其他覆盖则用得不多,只需了解一下就可!52第52页,共99页,2023年,2月20日,星期一数据流覆盖和循环覆盖数据流覆盖(Data
Flow
Coverage
)这是路径覆盖的一个变异。这种变异仅考虑从变量定义到其后的引用之间的子路径。数据流覆盖中的变量“定义”是指变量赋值而不是类型的定义。循环覆盖(Loop
Coverage
)这个度量报告你是否执行了每个循环体零次、只有一次还是多余一次(连续地)。对于do-while
循环,循环覆盖报告是否执行了每个循环体只有一次还是一次以上(连续地)。
这个度量的有价值的方面是确定是否对于while循环和for循环执行了多于一次,这个信息在其它的覆盖率报告中是没有的。
53第53页,共99页,2023年,2月20日,星期一上机实习1(嵌套循环例子)#include<stdio.h>该程序实现的功能如下:定义一个2维整型数组a[5][5]{5行5列},以及两个循环变量i和j,然后做了一个嵌套循环,对数组总的每个元素赋值(将元素所在的行和列加到一起),并输出。对该嵌套循环进行重点测试,以表格形式给出其测试项和预期结果。voidmain(){ inti=0; intj=0; inta[5][5]; for(i=0;i<5;i++)
for(j=0;j<5;j++) { a[i][j]=i+j; printf(“%d\n”,a[i][j]); }}54第54页,共99页,2023年,2月20日,星期一循环语句的测试测试项预期结果当外循环变量为最小值,内层循环也为最小值时,运算的结果当外循环变量为最小值,内层循环为最大值时,运算的结果当外循环变量为最大值,内层循环为最小值时,运算的结果循环变量的增量是否正确何时退出内循环何时退出外循环55第55页,共99页,2023年,2月20日,星期一上机实习2DonAllen的测试小组正在为一个学生成绩管理系统作测试。用下面的java程序,通过计算学生学年总分来评价学生的表现。下表列出学生的总分与对应的表现评定之间的关系:56第56页,共99页,2023年,2月20日,星期一
条件预期结果1.当总分大于97小于等于100时表现为“优秀”,备注为“通过”
2.当总分大于94小于等于97时表现为“分数很高”,备注为“通过”3.当总分大于92小于等于94时表现为“高分”,备注为“通过”4.当总分大于88小于等于92时表现为“很好”,备注为“通过”5.当总分大于85小于等于88时表现为“好”,备注为“通过”6.当总分大于82小于等于85时表现为“很满意”,备注为“通过”7.当总分大于79小于等于82时表现为“满意”,备注为“通过”8.当总分大于74小于等于79时表现为“一般”,备注为“通过”9.当总分大于等于50小于75时表现为“可提高”,备注为“通过”10.当总分大于等于0小于50时表现为“差”,备注为“通不过”11.当成绩不在此范围时表现为“不明确”,备注为“不明确”57第57页,共99页,2023年,2月20日,星期一给表现(Perf)和备注(Remarks)变量赋值的Java代码if(Total>=98&&Total<=100) { Perf="Excellent"; Remarks="Passed"; }elseif(Total>=95&&Total<=97) { Perf="VeryHighscores"; Remarks="Passed"; }elseif(Total>=93&&Total<=94) { Perf="highscores"; Remarks="Passed"; }elseif(Total>=89&&Total<=92) { Perf="VeryGood"; Remarks="Passed"; }58第58页,共99页,2023年,2月20日,星期一给表现(Perf)和备注(Remarks)变量赋值的Java代码elseif(Total>=86&&Total<=88) { Perf="Good"; Remarks="Passed"; } elseif(Total>=83&&Total<=85) { Perf="Verysatisfactory"; Remarks="Passed"; }elseif(Total>=80&&Total<=82) { Perf="Satisfactory"; Remarks="Passed"; } elseif(Total>=75&&Total<=79) { Perf="Fair"; Remarks="Passed"; }elseif(Total>=50&&Total<75) { Perf="CanImprove"; Remarks="Passed"; } elseif(Total<50&&Total>=0) { Perf="Poor"; Remarks="Failed”; }else { Perf="notdefined"; Remarks="notdefined"; System.out.println("Pleaseenterthescorescorrectly!\nScorescannotbegreaterthan100orlessthan0!\n"); }59第59页,共99页,2023年,2月20日,星期一上机实习2用以下总分对变量Total进行测试:
20,60,53,88,87,92,76按所给的测试条件计算总判定覆盖率。说出计算后的判定覆盖率应记录在哪里?给出相应的测试报告!60第60页,共99页,2023年,2月20日,星期一3.4程序插装程序插装(ProgramInstrumentation)是指在程序中设置断点或打印语句,在执行过程中了解程序的一些动态特性。这就相当于在运行程序以后,一方面检验测试结果,另一方面借助插入语句给出的信息了解程序的动态执行特性。这样,可把程序执行过程中发生的一些重要历史事件记录下来。61第61页,共99页,2023年,2月20日,星期一上机实习3procedureexample(a,b:real;varx:real),;begin if(a>1)and(b=0)thenx:=x/a; if(a=2)or(x>1)thenx:=x+1;end;将上面过程改写为C++的main函数,并通过程序插装在每个关键位置插入打印语句,进行编译和运行!给出覆盖L1,L2,L3,L4四条路径的测试数据,并通过运行显示这些路径,最后写出相应的测试报告!62第62页,共99页,2023年,2月20日,星期一上机实习3#include<iostream.h>供参考的C++程序,在此基础上加入打印语句!voidmain(){floata,b,x;cin>>a;cin>>b;cin>>x;if((a>1)&&(b==0)) x=x/a;if((a==2)||(x>1)) x=x+1;Cout<<x;}63第63页,共99页,2023年,2月20日,星期一测试路径L1的结果例如,输入a=2,b=0,x=4,打印出路径L1(sacbed)64第64页,共99页,2023年,2月20日,星期一上机实习4阅读下面程序,试用语句覆盖、判定覆盖、条件覆盖及路径覆盖分析技术对其进行测试,请列出所用的测试用例,并分析其覆盖率!READX,Y;IFY<0THENPOW:=-Y;ELSEPOW:=Y;Z=1;WHILE(POW!=0){Z:=Z*X;POW:=POW-1;}IFY<0THENZ:=1/Z;ANSWER:=Z+1;PRINTANSWER;65第65页,共99页,2023年,2月20日,星期一3.5基本路径测试在实际问题中,一个不太复杂的程序,特别是包含循环的程序,其路径可能非常大。因此,测试常常难以做到覆盖程序中的所有路径。基本路径(也称独立路径)测试是TomMaCabe首先提出的一种白盒测试技术,希望把测试的程序路径压缩到一定范围。它是在程序控制流图的基础上,分析控制构造的环路复杂性,导出基本可执行路径集合,设计测试用例的方法。设计出的测试用例要保证在测试中,程序的每一个可执行语句至少要执行一次。基本路径测试是它允许测试用例设计者导出一个过程设计的逻辑复杂性测度,并使用该测度作为指南来定义执行路径的基本集。66第66页,共99页,2023年,2月20日,星期一分析程序的控制流图在使用基本路径方法设计时要用到流图或程序图流图由结点和边组成,分别用圆和箭头表示。结点代表一个或多个语句。符号○为控制流图的一个结点,表示一个或多个无分支的PDL语句或源程序语句。箭头为边,表示控制流的方向。设计图中一个连续的处理框序列和一个判定框映射成流图中的一个结点。设计图中的箭头映射成流图中的一条边。注意:设计中判定中不可包含复合条件!67第67页,共99页,2023年,2月20日,星期一5种不同的控制流图68第68页,共99页,2023年,2月20日,星期一程序的控制流图在选择或多分支结构中,分支的汇聚处应有一个汇聚结点(空结点)。边和结点圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为一个区域。如下图所示,左边的结构图可改写为右边的控制流图图中共有4个区域,分别是三个闭合区域(R1,R2,R3)和一个开放区域(R4)69第69页,共99页,2023年,2月20日,星期一程序的控制流图70第70页,共99页,2023年,2月20日,星期一程序的控制流图如果判断中的条件表达式是由一个或多个逻辑运算符(OR,AND,….)连接的复合条件表达式,则需要改为一系列只有单条件的嵌套的判断。例如下图中,左边的程序语句可以改写成右边的控制流图71第71页,共99页,2023年,2月20日,星期一基本路径测试基本路径(独立路径):是指在程序入口与出口之间的任一路径,其间不存在两条长度大于2的相同的子路径。阅读代码,画出相应控制流图计算控制流图的圈复杂度(cyclomaticcomplexity
)确定线性独立路径的基本集。导出执行基本集中每条路径的测试用例。程序圈复杂度又称为McCabe复杂度72第72页,共99页,2023年,2月20日,星期一控制流图圈复杂度确定V(G)=流图中区域个数(由结点和边围起来的区域—图中外部区域也是一个区域)V(G)=边的个数-结点个数+2V(G)=流图中(简单)判定结点个数+1圈复杂度(Cyclomaticcomplexity)(环形复杂性):是一种为程序逻辑复杂性提供定定量测度的软件度量。当该度量用于基本路径测试方法,计算所得的值给出了程序基本集的独立路径数量,这是为确保所有语句至少执行一次而必须进行测试数量的上界。可用以下3种方法之一来计算复杂性:73第73页,共99页,2023年,2月20日,星期一例子Procedure:processrecords1. DoWhilerecordsremain2.
Read
record;3.
If
recordfield1=0Then4. storeinbuffer;5. incrementcounter;6.
ElseIf
recordfield2=0Then7. resetcounter;8.
Elsestoreinfile;9.
EndIf10.
EndIf11.
EndDoEnd191011245783674第74页,共99页,2023年,2月20日,星期一第一步:画出控制流图12,387694,51011注意:1)分支的汇聚处应有一个汇聚结点2)边和结点圈定的区域称为区域,当对区域计数时,图形外的区域应记为一个区域75第75页,共99页,2023年,2月20日,星期一第二步:计算圈复杂度V(G)=412,378694,51011区域1区域2区域3区域476第76页,共99页,2023年,2月20日,星期一
路径1:1-2-3-6-7-9-10-1-11基本路径测试例子路径2:1-2-3-6-8-9-10-1-11
路径3:1-2-3-4-5-10-1-11路径4:1-11191011245873677第77页,共99页,2023年,2月20日,星期一第三步:导出测试用例V(G)=4,有四条独立路径路径1:1-2-3-6-7-9-10-1-11路径2:1-2-3-6-8-9-10-1-11路径3:1-2-3-4-5-10-1-11路径4:1-11但路径1-2-3-4-5-10-1-2-3-6-8-9-10-1-11不是独立路径,因为子序列1-2-3出现两次,不满足独立路径的定义!78第78页,共99页,2023年,2月20日,星期一第四步:准备测试用例路径输入数据预期结果路径1:1-2-3-6-7-9-10-1-11Field1=1,Field2=0Count=0,File为空路径2:1-2-3-6-8-9-10-1-11Field1=1,Field2=1File非空,buffer为空路径3:1-2-3-4-5-10-1-11Field1=0,Count=1,File为空,buffer非空路径4:1-11recods为空Count=0,recods为空79第79页,共99页,2023年,2月20日,星期一案例研究要求:最多输入n个值(以-999为输入结束标志),计算落在给定范围内的那些值(称为有效输入值)的平均值、输入值个数以及有效值的个数。该程序为主程序调用的一个求平均值的函数average(),sum为输入值个数,total为有效值的个数,后二者都为全局变量。以下为参考程序和结点80第80页,共99页,2023年,2月20日,星期一案例研究81第81页,共99页,2023年,2月20日,星期一画出程序流图82第82页,共99页,2023年,2月20日,星期一设计测试用例的步骤②
确定Cyclomatic圈复杂度V(G);
V(G)=6(个区域)
V(G)=17(条边)-13(个节点)+2=6V(G)=5(判定结点)+1=6③确定独立路径集合(6条)路径1:1-2-10-11-13(aloq)路径2:1-2-10-12-13(alnp)路径3:1-2-3-10-11-13(abmoq)路径4:1-2-3-4-5-8-9-2-10-12-13(abcdfjk……)路径5:1-2-3-4-5-6-8-9-2-10-12-13(abcdegjk……)路径6:1-2-3-4-5-6-7-8-9-2-10-11-13(abcdehijk……)83第83页,共99页,2023年,2月20日,星期一设计测试用例的步骤在本例中,判定结点是结点2、3、5、6和结点10。另外要注意路径4、5、6中结点2后面的省略号表示随后的部分已无关紧要。④设计测试用例,强制执行独立路径集中的每一条路径。测试人员可选择数据以在测试每条路径时适当设置判定结点的条件。84第84页,共99页,2023年,2月20日,星期一对应路径的测试用例路径1的测试用例:
Value(k)=有效输入,其中,k<i;Value(i)=-999,其中2≤i≤100
期望结果:基于k的正确平均值的总数注意:路径1必须作为路径4、5、6测试的一部分,它无法独立测试。路径2的测试用例:
Value(1)=-999;期望结果:average=-999,其它保持初值路径3的测试用例:试图处理101个或更多的值,前100个值应该有效。期望结果与测试用例1相同85第85页,共99页,2023年,2月20日,星期一对应路径的测试用例路径4的测试用例:
Value(i)=有效输入,其中,i<100;Value(k)<最小值,其中k<i
期望结果:根据有效输入值的个数和总数正确算出平均值路径5的测试用例:Value(i)=有效输入,其中,i<100;Value(k)>最大值,其中k<i
期望结果:根据有效输入值的个数和总数正确算出平均值路径6的测试用例:Value(i)=有效输入,其中,i<100,
期望结果:根据有效输入值的个数和总数正确算出平均值86第86页,共99页,2023年,2月20日,星期一测试用例数据覆盖路径测试数据预期结果路径1Value=[90,-999,0,0,0]Aver=90,Nputnum=1Total=1路径2Value=[-999,0,0,0,0]Aver=-999,Nputnum=0Total=0路径3Value=[-1,90,70,-1,80]Aver=80,Nputnum=5Total=3路径4Value=[-1,-2,-3,-4,-999]Aver=999,Nputnum=4Total=0路径5Value=[120,110,101,-999,0]Aver=-999,Nputnum=3Total=0路径6Value=[95,90,70,65,-999]Aver=80,Nputnum=4Total=4这里,假定:n=4;minimum=0;maximum=10087第87页,共99页,2023年,2月20日,星期一上机实习5参考上面参考程序和结点,将它改写为相应的C/C++语言的被测程序和主程序,并编译和运行此程序。用覆盖6条路径的测试数据输入(value),观察其输出:平均值、输入值个数以及有效值个数给出相应的测试报告,包括测试输入数据、输出数据和预期结果。测试报告模板参考Excel模板88第88页,共99页,2023年,2月20日,星期一图矩阵法
导出流图和决定基本测试路径的过程均需要机械化,为了开发辅助基本路径测试的软件工具,称为图矩阵(graphmatrix)的数据结构很有用图矩阵是一个正方形矩阵,其大小(即列数和行数)等于流图的节点数。每列和
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年东源县卫生健康局公开招聘高层次和急需紧缺人才备考题库完整答案详解
- 2026年建筑行业社保缴纳合同
- 2025年北京协和医院肿瘤内科合同制科研助理招聘备考题库完整参考答案详解
- 2026年航空自由合同
- 天津2025年民生银行天津分行社会招聘备考题库有答案详解
- 交通运输部路网监测与应急处置中心2026年度公开招聘备考题库及答案详解1套
- 中国信息通信研究院2026届校园招聘80人备考题库有答案详解
- 江西省交通投资集团有限责任公司2025年校园招聘笔试笔试历年参考题库及答案
- 2024年水利部黄河水利委员会事业单位招聘高校毕业生考试真题
- 2025年中国农业银行研发中心社会招聘7人备考题库及答案详解一套
- 2025年中共湛江市委巡察服务保障中心、湛江市清风苑管理中心公开招聘事业编制工作人员8人备考题库完整参考答案详解
- 2025年产业融合发展与区域经济一体化进程研究可行性研究报告
- 医保科工作流程管理标准化方案
- 2025呼伦贝尔莫旗消防救援大队招聘消防文员(公共基础知识)综合能力测试题附答案解析
- 《国家赔偿法》期末终结性考试(占总成绩50%)-国开(ZJ)-参考资料
- 社会能力训练教程
- 广东省广州市番禺区2024-2025学年七年级上学期语文期末考试试卷(含答案)
- 2025年河南高二政治题库及答案
- 创新激励机制
- 产品成熟度评估标准文档
- 2025年浙江衢州龙游经济开发区下属国资公司公开招聘普通岗位合同制员工11人笔试考试参考题库附答案解析
评论
0/150
提交评论