资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,软件测试技术,主讲:王明珠,电话:,13814575352,(,65352,),QQ,:,124357284,复习回顾,什么是白盒测试?为什么要做白盒测试?,什么是覆盖率?,多种覆盖满足什么样的包含关系?,怎样合理选择哪一种覆盖方式设计用例?,白盒测试也称结构测试或逻辑驱动测试,是针对被测单元内部是如何进行工作的测试。,它根据程序的控制结构设计测试用例,主要用于软件或程序验证。,测试覆盖率,:用于确定测试所执行到的覆盖项的百分比。其中的覆盖项是指作为测试基础的一个入口或属性,比如语句、分支、条件等。,测试覆盖率可以表示出测试的充分性,在测试分析报告中可以作为量化指标的依据,测试覆盖率越高效果越好。但覆盖率不是目标,只是一种手段。,测试覆盖率,包括,功能点覆盖率,和,结构覆盖率,:,功能点覆盖率,大致用于表示软件已经实现的功能与软件需要实现的功能之间的比例关系。,结构覆盖率,包括语句覆盖率、分支覆盖率、循环覆盖率、路径覆盖率等等。,条件组合覆盖,判断,/,条件覆盖,判断覆盖,条件覆盖,语句覆盖,2.3.1,白盒测试基本概念,2.3.2,覆盖测试,2.3.2.1,语句覆盖,2.3.2.2,判定覆盖,2.3.2.3,条件覆盖,2.3.2.4,判定,/,条件覆盖,2.3.2.5,组合覆盖,2.3.2.6,路径覆盖,2.3.3,最少测试用例计算,2.3.4,基本路径法,手动测试,白盒测试,3,2.3.2,覆盖法,2.3.2.1,语句覆盖,2.3.2.2,判定覆盖,2.3.2.3,条件覆盖,2.3.2.4,判定,/,条件覆盖,2.3.2.5,条件组合覆盖,2.3.2.6,路径覆盖,4,2.3.2,覆盖测试,void,DoWork,(,int,x,int,y,int,z),int,k=0,j=0;,if(x3)&(z5),j=x*y+10;,/,语句块,2,j=j%3;/,语句块,3,5,2.3.2,覆盖法,逻辑覆盖法,6,X3&z5,执行语句块,3,F,F,T,T,a,b,d,c,e,2.3.2.1,语句覆盖,要实现,DoWork,函数的语句覆盖,只需设计一个测试用例就可以覆盖程序中的所有可执行语句。,测试用例输入为:,x=4,、,y=5,、,z=5,程序执行的路径是:,abd,这样就够了吗,?,7,2.3.2.2,判定覆盖(分支覆盖),要实现,DoWork,函数的判定覆盖,需要设计两个测试用例。,测试用例的输入为:,x=4,、,y=5,、,z=5,;,x=2,、,y=5,、,z=5,程序执行的路径分别是:,abd,;,ace,满足判定覆盖必定满足语句覆盖吗?,8,2.3.2.3,条件覆盖,在实际程序代码中,一个判定中通常都包含若干条件。条件覆盖的目的是设计若干测试用例,在执行被测程序后,要使每个判定中每个条件的可能值至少满足一次。,对,DoWork,函数的各个判定的各种条件取值加以标记。,对于第一个判定,(x3)&(z3,取真值记为,T1,,取假值记为,-T1,条件,z5),:,条件,x=4,取真值记为,T3,,取假值记为,-T3,条件,y5,取真值记为,T4,,取假值记为,-T4,9,根据条件覆盖的基本思想,要使上述,4,个条件可能产生的,8,种情况至少满足一次,设计测试用例如下:,10,测试用例,执行路径,覆盖条件,覆盖分支,x=4,、,y=6,、,z=5,abd,T1,、,T2,、,T3,、,T4,bd,x=2,、,y=5,、,z=15,ace,-T1,、,-T2,、,-T3,、,-T4,ce,分析:上面这组测试用例不但覆盖了,4,个条件的全部,8,种情况,而且将两个判定的,4,个分支,b,、,c,、,d,、,e,也同时覆盖了,即同时达到了条件覆盖和判定覆盖。,2.3.2.3,条件覆盖,2.3.2.3,条件覆盖,说明:虽然前面的一组测试用例同时达到了条件覆盖和判定覆盖,但是,,并不是说满足条件覆盖就一定能满足判定覆盖,。如果设计了下表中的这组测试用例,则虽然满足了条件覆盖,但只是覆盖了程序中第一个判定的取假分支,c,和第二个判定的取真分支,d,,不满足判定覆盖的要求。,11,测试用例,执行路径,覆盖条件,覆盖分支,x=2,、,y=6,、,z=5,acd,-T1,、,T2,、,-T3,、,T4,cd,x=4,、,y=5,、,z=15,acd,T1,、,-T2,、,T3,、,-T4,cd,2.3.2.4,判定,/,条件覆盖,判定,/,条件覆盖实际上是将判定覆盖和条件覆盖结合起来的一种方法,即:设计足够的测试用例,使得判定中每个条件的所有可能取值至少满足一次,同时每个判定的可能结果也至少出现一次。,根据判定,/,条件覆盖的基本思想,只需设计以下两个测试用例便可以覆盖,4,个条件的,8,种取值以及,4,个判定分支。,12,测试用例,执行路径,覆盖条件,覆盖分支,x=4,、,y=6,、,z=5,abd,T1,、,T2,、,T3,、,T4,bd,x=2,、,y=5,、,z=15,ace,-T1,、,-T2,、,-T3,、,-T4,ce,2.3.2.5,条件组合覆盖,组合覆盖的目的是要使设计的测试用例能覆盖每一个判定的所有可能的条件取值组合。,对,DoWork,函数中的各个判定的条件取值组合加以标记:,1,、,x3,z3,z=10,记做,T1-T2,,第一个判定的取假分支,3,、,x=3,z5,记做,T3 T4,,第二个判定的取真分支,6,、,x=4,y5,记做,-T3 T4,,第二个判定的取真分支,8,、,x!=4,y0&y0&y4&z!=6),a=a+1;,else,b=b+1;,c=c+1;,if(x0),c=c+1;,21,a,b,c,d,e,T,F,T,F,2.3.2,测试覆盖,测试覆盖准则,ESTCA,覆盖准则:,在容易发生问题的地方设计测试用例,即重视程序中谓词(条件判断)的取值。,ESTCA,覆盖准则,是一套错误敏感用例分析规则。这一规则虽然并不完备,但在普通程序中却是有效的。原因在于这是一种经验型的覆盖准则,规则本身针对了程序编写人员容易发生的错误,或是围绕着发生错误的频繁区域,从而提高了发现错误的命中率。具体规则如下:,规则,1,对于,A,rel,B,型,(,rel,可以是,),的分支谓词,应适当的选择,A,与,B,的值,使得测试执行到该分支语句时,,AB,的情况分别出现一次。,这是为了检测逻辑符号写错的情况,如将“,AB”,。,22,测试覆盖准则,规则,2,对于,A,rel,C,型,(,rel,可以是,或,A,是变量,,C,是常量,),的分支谓词:当,rel,为,时,应适当的选择,A,的值,使,A=C+M,。,这是为了检测“差,1”,之类的错误,如“,A1”,错写成“,A0”,。,规则,3,对外部输入变量赋值,使其在每一个测试用例中均有不同的值与符号,并与同一组测试用例中其他变量的值与符号不同。,这是为了检测程序语句中的错误,如应该引用某一变量而错成引用另一个常量。,23,2.3.2,测试覆盖,2.3.2,测试覆盖,产生测试用例,在实践中,除了前面给出的各种方法外,通常还可以采用以下三种方法来补充设计测试用例:,(,1,)通过非路径分析得到测试用例,这种方法得到的测试用例是在应用系统本身的实践中提供的,基本上是测试人员凭工作经验的得到,甚至是猜测得到的。,(,2,)寻找尚未测试过的路径并生成相应的测试用例,这种方法需要穷举被测程序的所有路径,并与前面已测试路径进行对比。,(,3,)通过指定特定路径并生成相应的测试用例,24,白盒测试法检查程序内部逻辑结构,对所有逻辑路径进行测试,是一种穷举路径的测试方法。,但,即使每条路径都测试过了,仍然可能存在错误。因为:,穷举路径测试无法检查出程序本身是否违反了设计规范,即程序是否是一个错误的程序。,穷举路径测试不可能查出程序因为遗漏路径而出错。,穷举路径测试发现不了一些与数据相关的错误。,25,2.3,白盒测试局限性,由于测试路径可能非常多,由于时间和资源问题,选出足够多的路径测试,由于深入到程序编码,通常开发人员协助测试人员书写白盒测试用例,在进行白盒测试之前,一定要根据说明书建立黑盒测试用例。用这种方式可以真正测试模块的用意。,如果先从模块的白盒子角度建立测试用例,就会受到代码和注释的影响,而忽略模块的真正意图。,白盒测试的局限,26,2.3.2,白盒测试用例注意事项,为实现测试的逻辑覆盖,必须设计足够多的测试用例,并使用这些测试用例执行被测程序,实施测试。我们关心的是:对于某个具体的程序来说,至少需要设计多少个测试用例。这里提供一种估算最少测试用例数的方法。,我们知道,结构化程序是由,3,种基本控制结构组成:顺序型(构成串行操作)、选择型(构成分支操作)和重复型(构成循环操作)。,为了把问题化简,避免出现测试用例极多的组合爆炸,把构成,循环操作的重复型结构用选择结构代替,。这样,任一循环便改造成进入循环体或不进入循环体的分支操作了。,27,2.3.3,最少测试用例数计算,用,N-S,图表示程序的,3,种基本控制结构:,28,图中,A,、,B,、,C,、,D,、,S,均表示要执行的操作,,P,是可取真假值的谓词,,Y,表真值,,N,表假值。,图中的,(c),和,(d),两种重复型结构代表了两种循环。在做了简化循环的假设以后,对于一般的程序控制流,我们只考虑选择型结构。事实上它已经能体现顺序型和重复型结构了。,2.3.3,最少测试用例数计算,2.3.3,最少测试用例数计算,显然,要测试这个小程序,需要至少提供,4,个测试用例才能作到逻辑覆盖,使得,ac,、,ad,、,bc,及,bd,操作均得到检验。其实,这里的,4,是图中的第,1,个分支谓词引出的两个操作,及第,2,个分支谓词引出的两个操作组合起来而得到的,即,22=4,。并且,这里的,2,是由于两个并列的操作,即,1+1=2,而得到的。,29,例如,下图表达了两个顺序执行的分支结构。当两个分支谓词,P1,和,P2,取不同值时,将分别执行,a,或,b,及,c,或,d,操作。,30,对于一般的、更为复杂的问题,估算最少测试用例个数的原则也是同样的:,如果在,N-S,图中存在有并列的层次,A1,、,A2,,,A1,和,A2,的最少测试用例个数分别为,a1,、,a2,,则由,A1,、,A2,两层所组合的,N-S,图对应的最少测试用例数为,a1a2,。,如果在,N-S,图中不存在有并列的层次,则对应的最少测试用例数由并列的操作数决定,即,N-S,图中除谓词之外的操作框的个数。,2.3.3,最少测试用例数计算,31,例:如下图所示的两个,N-S,图,至少需要多少个测试用例完成逻辑覆盖,?,对于第一个,N-S,图:,由于图中并不存在并列的层次,最少测试用例数由并列的操作数决定,即为,1+1+1=3,。,对于第二个,N-S,图:,由于图中没有包含并列的层次,最少测试用例数仍由并列的操作数决定,即为,1+1+1+1+1=5,。,2.3.3,最少测试用例数计算,32,例:如下图所示的,N-S,图,至少需要多少个测试用例完成逻辑覆盖?,分析该,N-S,图:,图中的,2345,和,67,是并列的两层。其中,,2345,层对应的最少测试用例数为,1+1+1+1+1=5,,,67,层对应的测试用例数为,1+1+1=3,,,2345,和,67,这两层组合后对应的测试用例数为,5,3=15,。最后,由于,两层组合后的部分是不满足谓词,1,时所要做的操作,还要加上满足谓词,1,要做的操作,因此整个程序所需测试用例数为,15+1=16,。,2.3.3,最少测试用例数计算,33,2,、某程序所画出的,N-S,图,如右图所示的,,至少需要,多少个测试用例才能对该,程序实现逻辑覆盖?,实践,34,练 习,1.,逻辑覆盖是对程序内部有,存在的逻辑结构设计测试用例,根据程序内部的逻辑覆盖程度又可分为,、,、,、,和,几种覆盖技术。,2.,覆盖准则最强的是,;发现错误能力最弱的是,。,3.,实际的逻辑覆盖测试中,一般以,为主设计测试用例。,4.,程序的流程图如右图所示,采用路径覆盖法进行测试,则至少需要多少几个测试用例可以覆盖所有可能的路径?,35,练 习,分析:虽然前面一组测试用例满足了路径覆盖,但并没有覆盖程序中所有的条件组合(丢失了组合,3,和,7,),即,满足路径覆盖的测试用例并不一定满足组合覆盖,。,说明:,对于比较简单的小程序,实现路径覆盖是可能做到的。但如果程序中出现较多判断和较多循环,可能的路径数目将会急剧增长,要在测试中覆盖所有的路径是无法实现的。为了解决这个难题,只有把覆盖路径数量压缩到一定的限度内,如程序中的循环体只执行一次。,在实际测试中,即使对于路径数很有限的程序已经做到路径覆盖,仍然不能保证被测试程序的正确性,还需要采用其他测试方法进行补充。,36,2.3.4,基本路径法,2.,流图,流图也称为程序图,它将流程图中的结构化构件改用,一般有向图,的表示形式,如图所示。在图中,每个圆圈代表一个结点,表示源程序或,PDL,中的一个或多个连续的无分支语句。,2.3.4,基本路径测试法,图,(a),所示的流程图(假设每个判断均,不含复合条件,),其对应的流图为图,(b),所示。,2.3.4,基本路径测试法,对于程序(或流程图)中的,复合条件,,应将其转化为,多个简单条件判断,,在流图中用相应的谓词结点加以表示。,2.3.4,基本路径测试法,3.,程序的环路复杂性,程序的,环路复杂性,(,Cyclomatic,Complexity,)又称为圈复杂性,其值等于,流图中的区域个数,。,在进行基本路径测试时,确定了程序的环路复杂性,则可在其基础上确定程序基本路径集合的,独立路径数目,,这个数目是确保程序中每条可执行语句至少执行一次的测试用例数目的最小值。,独立路径是一条含有以前未处理的语句或判断的路径,在流图中,独立路径表现为至少含有一条其他独立路径中均没有的边的路径。,2.3.4,基本路径测试法,图,(b),所示的流图含有,4,个区域,故其对应的程序的环路复杂性度量,V,(,G,)为,4,,程序有以下,4,条独立路径。,路径,1,:,111,路径,2,:,1234510111,路径,3,:,12368910111,路径,4,:,12367910111,2.3.4,基本路径测试法,2.3.4,基本路径测试法,可由此设计测试用例,覆盖以上,4,条独立路径,则可使程序中的所有可执行语句和所有判断的真、假分支至少执行一次。,也可利用以下公式计算程序的环路复杂性度量,V(G),。,V(G)=E-N+2,公式中的,E,代表流图中的边数,,N,代表流图中的结点数。如图,4-3(b),所示的流图中,边数为,11,,结点数为,9,,故,V(G)=11-9+2=4,。,2.3.4,基本路径测试法,此外,还可利用流图中的谓词结点数来计算环路复杂性度量,V(G),。,V(G)=P+1,公式中的,P,为流图中的谓词结点数。如图,4-3(b),所示的流图中,谓词结点数为,3,,故,V(G)=3+1=4,。若能事先确定程序中的简单条件判断的个数(即等于流图中的谓词结点数),则可在不画出流图的情况下确定程序的环路复杂性。,2.3.4,基本路径测试法,4.,基本路径测试举例(见书),45,2.3.4,基本路径测试法,对简单循环的测试,对循环次数不大于,n,的简单循环:,不执行循环,执行一次循环;,执行两次循环;,执行,m,次循环,,m,打开示例工程,选择,Visual C+6.0,。,Visual C+6.0,称为测试,IDE,,即用来编译和编辑测试代码的集成驱动,。,61,函数列表和函数代码,操作视图,模块一:,任务一:熟悉,VUnit2.6,模块一:,任务二:测试,WhiteBox,函数,步骤一,:点击生成输入输出代码 ,打开输入输出代码生成器,输入第一个测试用例数据。,62,模块一:,任务二:测试,WhiteBox,函数,步骤二,:在用例数据中可看到表格中的第一个用例数据,点击 ,可以执行测试用例。,注意在执行测试用例前,需编译下测试,IDE,,进行关联。,63,在用例代码窗口中可以输入输出方式查看用例代码,点击 可切换到完整的用例代码。,思考:仅输入一个测试用例,,VU,是如何测试的呢?,模块一:,任务二:测试,WhiteBox,函数,步骤三,:用例数据中添加测试用例,以达到更好的覆盖。,64,练习:使用,条件组合覆盖法,为下面的函数设计测试用例。,int,WhiteBox(int,A,int,B,int,X),if(A,1&B=0),X=X/A;,if(A,=2|X1),X=X+1;,return X;,复习,详解:,对以上函数使用条件组合覆盖,分别将第一、第二个判定中的条件进行组合,1,、,A1,B=0,记做,T1 T2,,第一个判定的取真分支,2,、,A1,B!=0,记做,T1-T2,,第一个判定的取假分支,3,、,A=1,B=0,记做,-T1 T2,,第一个判定的取假分支,4,、,A1,记做,T3 T4,,第二个判定的取真分支,6,、,A=2,X1,记做,-T3 T4,,第二个判定的取真分支,8,、,A!=2,X=1,记做,-T3-T4,,第二个判定的取假分支,65,复习,详解(续):,根据条件组合覆盖的基本思想,设计测试用例如下:,66,测试用例,执行路径,覆盖条件,覆盖组合号,输入数据,预期结果,A=2,、,B=0,、,X=4,X=3,abd,T1,、,T2,、,T3,、,T4,1,和,5,A=2,、,B=1,、,X=1,X=2,acd,T1,、,-T2,、,T3,、,-T4,2,和,6,A=1,、,B=0,、,X=2,X=3,acd,-T1,、,T2,、,-T3,、,T4,3,和,7,A=1,、,B=1,、,X=1,X=1,ace,-T1,、,-T2,、,-T3,、,-T4,4,和,8,模块一:,任务二:测试,WhiteBox,函数,步骤四,:执行测试,查看测试结果,分析测试报告。,67,思考:如何提高测试的覆盖?,模块一:,任务三:测试“计算两个无符号整数的幂”的函数,函数说明:,功能,:,计算两个无符号整数的幂,参数,:g,底数,e,指数,返回,:g,的,e,次幂,68,模块一:,任务三:测试“计算两个无符号整数的幂”的函数,几个特殊底数与指数:,69,?,模块一:,任务三:测试“计算两个无符号整数的幂”的函数,请同学根据程序,自己设计用例来达到尽可能多的覆盖,并生成与执行用例。,70,模块一:,任务三:测试“计算两个无符号整数的幂”的函数,查看结果,汇报及评价,
展开阅读全文