第四章白盒测试基本概念1逻辑覆盖2基本路径测试3循环测试4面向对象的白盒测试5其他白盒测试方法简介6主要内容第四章白盒测试方法白盒测试的基本概念白盒测试:把程序看成装在一个透明的盒子里,程序的结构和处理过程完全可见,按照程序的内部逻辑测试程序,以检查程序中的每条通路是否都能按照预先要求正确工作。白盒测试针对被测单元的内部进行,它的突出特点是基于被测程序的源代码,而不是基于软件的规格说明书。白盒测试方法的分类静态测试:着重在于纠正软件系统在描述、表示和规格上的错误,是进一步测试的前提,方法包括:桌面检查(Deskchecking)代码评审(Codereading/review)走查(Walkthroughs)动态测试:根据程序的控制结构设计测试用例,要求:保证一个模块中的所有独立路径至少执行一次对所有逻辑值均需测试True和False在上下边界及可操作范围内运行所有循环检查内部数据结构以确保其有效性白盒测试的常用方法逻辑覆盖基本路径测试程序结构分析插桩WHILE循环结构顺序结构UNTIL循环结构IF选择结构CASE多分支结构选择结构控制流图的图形符号R3R2R1区域(a)程序流程图)7123456811(b)控制流图12647891011边结点R4白盒测试基本概念1逻辑覆盖2基本路径测试3循环测试4面向对象的白盒测试5其他白盒测试方法简介6主要内容第四章白盒测试方法逻辑覆盖以程序的内部逻辑结构为基础,主要分以下几种方式:逻辑覆盖语句覆盖判定覆盖条件覆盖判定/条件覆盖条件组合覆盖路径覆盖1语句覆盖StatementCoverage设计足够多的测试用例,使得程序中的每个语句至少执行一次。1语句覆盖入口A1ANDB=0TA=2ORX1TX=X/AX=X+1返回FF用例ABX1204★语句覆盖对程序的逻辑覆盖很少,只能测试部分语句,是很弱的逻辑判断标准。语句覆盖测试用例:a=10,b=5intfoo(inta,intb){returna/b;}★尽管语句覆盖率达到了所谓的100%,但是却没有发现最简单的Bug,如:b=0时会出现一个除零异常。2判定覆盖DicisionCoverage不仅每个语句都必须至少执行一次,而且每个判定表达式的每种可能的结果都应该至少执行一次,即每个判定的“真”分支和“假”分支至少都执行一次。判定覆盖又称分支覆盖。2判定覆盖(分支覆盖)用例ABX12042111★判定覆盖比语句覆盖强,但是对程序逻辑的覆盖程度仍然不高。入口A1ANDB=0TA=2ORX1TX=X/AX=X+1返回FF123条件覆盖ConditionCoverage不仅每个语句都必须至少执行一次,而且每个判定表达式中的每个条件都取到各种可能的结果,即每个条件的“真”条件和“假”条件至少都执行一次。3条件覆盖用例ABX12042111A1,B!=0,A=2,X=1A=1,B=0,A!=2,X1条件覆盖1:用例ABX12112103入口A1ANDB=0TA=2ORX1TX=X/AX=X+1返回FF12程序中共有4个条件8个结果A1,B=0,A=2,X1(全真)A=1,B!=0,A!=2,X=1(全假)条件覆盖2:请思考:这个条件覆盖的测试用例是否完全?真假混搭★条件覆盖通常比判定覆盖强,因为它使判定表达式中每个条件都取到了两个不同的结果,而判定覆盖只关心整个判断表达式的值。在上页的测试用例中,条件覆盖1不但覆盖了所有判定表达式中各条件的所有可能结果,而且覆盖了所有判定的真、假分支,覆盖性很强。但并不是所有满足条件覆盖的要求的测试数据都能满足判定覆盖的要求,如条件覆盖2.条件覆盖特点判定覆盖vs条件覆盖判定覆盖:(1)a=5,b=5覆盖了分支一(2)a=15,b=15覆盖了分支二intfoo(inta,intb){if(a10||b10)//判定{return0;//分支一}else{return1;//分支二}}条件覆盖:(1)a=5,b=5true,true(2)a=15,b=15false,false假如测试用例设计为:(1)a=5,b=15true,false分支一(2)a=15,b=5false,true分支一这时候,虽然做到了条件覆盖,但却没有把两个判定分支都执行到,没有做到判定覆盖。*结论:判定覆盖不一定包含条件覆盖,条件覆盖也不一定包含判定覆盖4判定/条件覆盖Decision/ConditionCoverage设计足够多的测试用例,使得判定中的每个条件都取到各种可能的值,而且每个判定表达式也都取到各种可能的结果。4判定/条件覆盖*表面上看,判定/条件覆盖测试了所有条件的所有可能结果,但事实上有些条件会掩盖另一些条件。例如,在“与”表达式中,如果某一条件为“假”,则整个判定的值为“假”,这个判定中的其他条件就不起作用了。同样地,若在“或”表达式中某一条件为“真”,则整个判定的值为“真”,其它条件也就不起作用了。因此,采用判定/条件覆盖时,判定表达式中的错误不一定能测试出来。用例ABX12042111入口A1ANDB=0TA=2ORX1TX=X/AX=X+1返回FF125条件组合覆盖ConditionCombinationCoverage设计足够多的测试用例,使得每个判定表达式中条件的各种可能组合都至少出现一次。5条件组合覆盖a点的所有条件组合:(1)A>1,B=0;(2)A>1,B≠0(3)A≤1,B=0;(4)A≤1,B≠0b点的所有条件组合:(5)A=2,x>1;(6)A=2,x≤1(7)A≠2,x>1;(8)A≠2,x≤1入口A1ANDB=0TA=2ORX1TX=X/AX=X+1返回FFab一组测试用例:满足(1)和(5):A=2,B=0,x=4满足(2)和(6):A=2,B=1,x=1满足(3)和(7):A=1,B=0,x=2满足(4)和(8):A=1,B=1,x=1第二组测试用例:满足(1)和(8):A=3,B=0,x=1满足(2)和(7):A=3,B=1,x=2满足(3)和(6):A无取值,B=0,x=1满足(4)和(5):A无取值,B=1,x=2★满足条件组合覆盖标准的测试数据,也一定满足判定覆盖、条件覆盖和判定/条件覆盖标准,是这几种覆盖标准中最强的。不过它不一定使程序中每条路径都执行到。条件覆盖vs条件组合覆盖条件覆盖(3个条件6个结果):(1)a=5,b=7,c=6(全真)(2)a=7,b=9,c=4(全假)intfoo(inta,intb){if(a6||b8)//判定k{return0;}if(c5))//判定h{return1;}}条件组合覆盖:k条件h条件:(1)c5;(2)c=5测试用例(1)a6,b8(2)a6,b=8(3)a=6,b8(4)a=6,b=8(1)a=7,b=7,c=6(2)a=5,b=7,c=6(3)a=5,b=7,c=6(4)a=5,b=7,c=61.语句覆盖a=5,b=5,nReturn=11语句覆盖率100%2.判定覆盖a=5,b=5,nReturn=11a=15,b=15nReturn=0判定覆盖率100%3.条件覆盖a=5,b=15nReturn=1a=15,b=5nReturn=10条件覆盖率100%上面三种覆盖率都达到了100%,很好!但是,仔细分析可以看出,nReturn的结果一共有四种可能的返回值:0、1、10、11,而上面每种测试方式只覆盖了部分返回值,可见以上任一覆盖方式虽然覆盖率很高,但是并没有测试完全。intfoo(inta,intb){intnReturn=0;if(a10){nReturn+=1;//分支一}if(b10){nReturn+=10;//分支二}returnnReturn;}6路径覆盖PathCoverage设计足够多的测试用例,使程序的每一条可能路径都至少执行一次。路径覆盖路径覆盖将所有可能的返回值都测试到了,这正是它被很多人认为是“最强的覆盖”的原因。intfoo(inta,intb){intnReturn=0;if(a10){nReturn+=1;//分支一}if(b10){nReturn+=10;//分支二}returnnReturn;}测试用例:a=5,b=5,nReturn=0a=15,b=5,nReturn=1a=5,b=15,nReturn=10a=15,b=15,nReturn=11路径覆盖率100%路径覆盖用例ABX1111211233014204★要在测试中覆盖程序所有的路径有时是不可能实现的,即使做到了路径覆盖也不能保证被测程序的正确性,因为路径覆盖不能保证满足条件组合覆盖。入口A1ANDB=0TA=2ORX1TX=X/AX=X+1返回FF1423六种形式的逻辑覆盖★各种测试方法都不能保证程序的正确性,但测试的目的并不是为了保证其正确,而是为了尽可能找出程序中隐藏的故障。语句覆盖判定覆盖条件覆盖判定/条件覆盖条件组合覆盖路径覆盖(e)两个串行的分支结构的N-S图ABPYNAB当PSS当P(a)顺序型(b)选择型(c)Do-While型(d)Do-Until型P2YNcdP1YNabN-S图表示的基本控制结构★最少测试用例数=(5*3+1)*3=486YN7YN2NY3NNNYYY451NY8YN9YN1NY2NY3NNNYYY456YN7YN8YN9YN533白盒测试基本概念1逻辑覆盖2基本路径测试3循环测试4面向对象的白盒测试5其他白盒测试方法简介6主要内容第四章白盒测试方法基本路径测试又称独立路径测试,是指在程序控制流图的基础上,分析控制构造的环路复杂性,导出独立可执行路径集合,设计测试用例的方法。设计出的测试用例要保证在测试中,程序的每一个独立可执行路径至少要执行一次。循环体最多只执行一次。path1:1–11path2:1-2-3-4-5-10-1–11path3:1-2-3-6-8-9-10-1–11path4:1-2-3-6-7-9-10-1-11基本路径集1.导出程序流程图的拓扑结构—流图(控制流程图)2.计算流图的环路复杂性3.确定只包含独立路径的基本路径集4.设计测试用例基本(独立)路径测试步骤inttest2(intx,inty){intk=0;if(x0){if(y==0)k=x+100;else{if(y==1)k=k+10;elsek=20;}}returnk;}基本路径测试inttest2(intx,inty){①intk=0;②if(x0){③if(y==0)④k=x+100;⑤else{⑥if(y==1)⑦k=k+10;⑧else⑨k=20;}//if(y==0)}//if(x0)⑩returnk;}第一步:给程序语句编号第二步:画出程序流图路径1:1,2,10路径2:1,2,3,4,10路径3:1,2,3,5,6,7,10路径4:1,2,3,5,6,8,9,10第三步:找出基本路径测试用例:x=0,y=任意,k=0测试用例:x0,y=0,k=x+100测试用例:x0,y=1,k=10测试用例:x0,y!=0,y!=1,k=20第四步:设计测试用例环路复杂度为4第三步:计算环路复杂度inttest(intx,inty){①intk=0;②if(x0)③{③if(y==0)④k=x+100;⑤else⑤{⑥if(y==1)⑦k+=10;⑧else⑨k=20;⑩}⑩}⑩returnk;⑩}白盒测试基本概念1逻辑覆盖2基本路径测试3循环测试4面向对象的白盒测试5其他白盒测试方法简介6主要内容第四章白盒测试方法循环测试简单循环串接循环嵌套循环跳过循环只通过循环一次通过循环两次通过循环m次,其中mn-1通过循环n–1,n,n+1次简单循环测试注:n是允许通过循环的最大次数嵌套循环测试对最内层循环做简单循环的全部测试。所有其它层的循环变量置为最小值。逐步外推,对其外面一层循环进行测试。测试时保持所有外层循环的