白盒测试的主要方法语句覆盖判定覆盖条件覆盖判定/条件覆盖条件组合覆盖路径覆盖基路径测试循环测试逻辑覆盖路径测试数据流测试其他白盒测试方法一、逻辑覆盖•1、语句覆盖:语句覆盖就是设计若干个测试用例,运行被测试程序,使得每一条可执行语句至少执行一次•2、判定覆盖(也称为分支覆盖):设计若干个测试用例,运行所测程序,使程序中每个判断的取真分支和取假分支至少执行一次;•3、条件覆盖:设计足够多的测试用例,运行所测程序,使程序中每个判断的每个条件的每个可能取值至少执行一次;•4、判定/条件覆盖:设计足够多的测试用例,运行所测程序,使程序中每个判断的每个条件的所有可能取值至少执行一次,并且每个可能的判断结果也至少执行一次,换句话说,即是要求各个判断的所有可能的条件取值组合至少执行一次;•5、条件组合覆盖:设计足够多的测试用例,运行所测程序,使程序中每个判断的所有可能的条件取值组合至少执行一次;一、逻辑覆盖6、路径覆盖•设计足够多的测试用例,运行所测程序,要覆盖程序中所有可能的路径。这是最强的覆盖准则。但在路径数目很大时,真正做到完全覆盖是很困难的,必须把覆盖路径数目压缩到一定限度。•在程序控制流程的基础上,分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例例题1Publicvoidfunction(inta,intb,intc){if((A1)&&(B==0)){c=c/a;}if((a==5)||(c1)){c=c+1;}c=a+b+c;}开始(a1)and(b=0)(a=5)or(c1)c=a+b+cc=c+1c=c/a结束TrueTrueFalseFalseACBED语句覆盖•是一个比较弱的测试标准,它的含义是:测试时设计若干个(越少越好)测试用例,运行被测试程序,使程序中每条可执行语句至少执行一次。开始(a1)and(b=0)(a=5)or(c1)c=a+b+cc=c+1c=c/a结束TrueTrueFalseFalseACBED语句覆盖例题2语句覆盖总结:(1)无法测试隐含的条件(2)不能检查判断逻辑(||、&&)是否有问题;(3)对多分支的逻辑运算无法全面考虑;(4)不能报告循环是否到达终止条件。(5)是最弱的一种覆盖标准。判定覆盖•设计若干个(越少越好)测试用例,运行被测试程序,使得程序中每一个判定的取真分支和取假分支至少经历一次,即判断的真假值均曾被满足。例1:a=5,b=0,c=6case1ACEa=1,b=0,c=1case2ABD或者:a=3,b=0,c=1case1ACDa=5,b=1,c=2case2ABE判定覆盖对例1的程序,如果设计两个例子,使它们能通过路径ace和abd,或者通过路径acd和abe,就可达到“判定覆盖”标准,为此,可以选择输入数据为:①A=3,B=0,X=1(沿路径acd执行);②A=2,B=1,X=3(沿路径abe执行)判定覆盖例题2A=3,B=0,X=1(沿路径acd执行)A=2,B=1,X=3(沿路径abe执行)判定覆盖往往大部分的判定语句是由多个逻辑条件组合而成,若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。判定覆盖以上例题仅考虑了两出口的判断,还应该把判定覆盖准则扩充到多出口判断的情况。应该使得每一个判定获得每一种可能的结果至少一次。15432108768条件覆盖•设计若干个(越少越好)测试用例,运行被测试程序,使每个判断中的每个条件的可能取值至少满足一次,即每个条件至少有一次为真值,有一次为假值。•例题1中,对于第一个判断:条件a1取真值为T1,取假值a=1为F1条件b=0取真值为T2,取假值b0为F2对于第二个判断:条件a=5取真值为T3,取假值a5为F3条件c1取真值为T4,取假值c=1为F4设计测试用例,让其覆盖T1,T2,T3,T4,F1,F2,F3,F4八种情况,如下表:测试用例测试数据覆盖条件执行路径CASE6a=5,b=0,c=6T1,T2,T3,T4ACECASE7a=1,b=0,c=1F1,T2,F3,F4ABDCASE8a=5,b=2,c=1T1,F2,T3,F4ABE条件覆盖例2的程序有四个条件:A>1、B=0、A=2、X>1为了达到“条件覆盖”标准,需要执行足够的测试用例使得在a点有:A>1、A≤1、B=0、B≠0等各种结果出现,以及在b点有:A=2、A≠2、X>1、X≤1等各种结果出现。现在只需设计以下两个测试用例就可满足这一标准:①A=2,B=0,X=4(沿路径ace执行);②A=1,B=1,X=1(沿路径abd执行)。条件覆盖条件覆盖A=2,B=0,X=4(沿路径ace执行)A=1,B=1,X=1(沿路径abd执行)条件覆盖•“条件覆盖”通常比“判定覆盖”强,因为它使一个判定中的每一个条件都取到了两个不同的结果,而判定覆盖则不保证这一点。•“条件覆盖”并不包含“判定覆盖”,如对语句IF(AANDB)THENS设计测试用例使其满足条件覆盖,即使A为真并使B为假,以及使A为假而且B为真,但是它们都未能使语句S得以执行。判定/条件覆盖•将判定覆盖和条件覆盖结合起来,设计足够的测试用例,使得判断条件中的每个条件的所有可能取值至少执行一次,并使每个判断本身的可能判定结果也执行一次。例题1①a=5,b=0,c=6(T1,T2,T3,T4,沿ace路径)②a=1,b=2,c=1(F1,F2,F3,F4沿abd路径)开始(a1)and(b=0)(a=5)or(c1)c=a+b+cc=c+1c=c/a结束TrueTrueFalseFalseACBED例2①A=2,B=0,X=4(沿ace路径)②A=1,B=1,X=1(沿abd路径)判定/条件覆盖•分支/条件覆盖从表面来看,它测试了所有条件的取值,但是实际上某些条件掩盖了另一些条件。•例如对于条件表达式(x3)&&(z10)来说,必须两个条件都满足才能确定表达式为真。如果(x3)为假则一般的编译器不在判断是否z10了。对于第二个表达式(x==4)||(y5)来说,若x==4测试结果为真,就认为表达式的结果为真,这时不再检查(y5)条件了。因此,采用分支/条件覆盖,逻辑表达式中的错误不一定能够查出来了。条件组合覆盖•它的含义是:设计足够的例子,使得每个判定中条件的各种可能组合都至少出现一次。显然,满足“条件组合覆盖”的测试用例是一定满足“判定覆盖”、“条件覆盖”和“判定/条件覆盖”的。例题1编号具体条件取值覆盖条件判定取值1a1,b=0T1,T2第一判定:取真2a1,b0T1,F2第一判定:取假3a=1,b=0F1,T2第一判定:取假4A=1,b0F1,F2第一判定:取假5a=5,c1T3,T4第二判定:取真6a=5,c=1T3,F4第二判定:取真7a5,c1F3,T4第二判定:取真8a5,c=1F3,F4第二判定:取假例题1---测试用例编号测试用例覆盖条件覆盖分支执行路径1a=5,b=0,c=6T1,T2,T3,T4C,EACE2a=5,b=2,c=1T1,F2,T3,F4B,EABE3a=1,b=0,c=3F1,T2,F3,T4B,EABE4a=1,b=3,c=1F1,F2,F3,F4B,DABD条件组合覆盖-----例2需要选择适当的例子,使得下面8种条件组合都能够出现:1)A1,B=02)A1,B≠03)A≤1,B=04)A≤1,B≠05)A=2,X16)A=2,X≤17)A≠2,X18)A≠2,X≤1条件组合覆盖下面设计的四个例子可以使上述8种条件组合至少出现一次:①A=2,B=0,X=4使1)、5)两种情况出现;②A=2,B=1,X=1使2)、6)两种情况出现;③A=1,B=0,X=2使3)、7)两种情况出现;④A=1,B=1,X=1使4)、8)两种情况出现。条件组合覆盖上面四个例子虽然满足条件组合覆盖,但并不能覆盖程序中的每一条路径,例如路径acd就没有执行,因此,条件组合覆盖标准仍然是不彻底。根据定义取4个测试用例,就可以覆盖上面8种条件取值的组合。测试用例如下表:测试用例通过路径条件取值覆盖组合号x=4、y=6、z=5abdT1、T2、T3、T41和5x=4、y=5、z=15acdT1、F2、T3、F42和6x=2、y=6、z=5acdF1、T2、F3、T43和7x=2、y=5、z=15aceF1、F2、F3、F44和8上面的测试用例覆盖了所有条件的可能取值的组合,覆盖了所有判断的可取分支,但是却丢失了一条路径abe。条件组合覆盖路径测试•路径测试就是设计足够多的测试用例,覆盖被测试对象中的所有可能路径。测试用例通过路径a=5、b=0、c=6ACEa=1、b=0、c=1ABDa=5、b=2、c=1ABEa=3、b=0、c=1ACD开始(a1)and(b=0)(a=5)or(c1)c=a+b+cc=c+1c=c/a结束TrueTrueFalseFalseACBED路径测试----例题2测试用例通过路径A=2、B=0、X=3aceA=1、B=0、X=1abdA=2、B=1、X=1abeA=3、B=0、X=1acd综合练习voidDoWork(intx,inty,intz){intk=0,j=0;if((x3)&&(z10)){k=x*y-1;//语句块1j=sqrt(k);}if((x==4)||(y5)){j=x*y+10;//语句块2}j=j%3;//语句块3}二、基本路径测试基本路径测试就是在程序控制图的基础上,通过分析控制构造的环行复杂性,导出基本可执行路径集合,从而设计测试用例的方法。设计出的测试用例要保证在测试中程序的每一个可执行语句至少执行一次。基本路径测试-----步骤1.导出程序的控制流图2.计算程序环路复杂度:确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。3.确定只包含独立路径的基本路径集;4.设计测试用例:确保基本路径集中的每一条路径的执行。独立路径独立路径:包括一组以前没有处理的语句或条件的一条路径。基本路径集:所有独立路径的集合。1762,38910114,5路径1:1-11路径2:1-2-3-4-5-10-1-11路径3:1-2-3-6-8-9-10-1-11路径4:1-2-3-6-7-9-10-1-11对以上路径的遍历,就是至少一次地执行了程序中的所有语句。例题:214375689101112131415独立路径的选择原则1.选择具有功能含义的路径;2.尽量用短路径代替长路径;3.从上一条测试路径到下一条测试路径,应尽量减少变动的部分(包括变动的边和节点)。4.由简入繁,如果可能,应先考虑不含循环的测试路径,然后补充对循环的测试。5.除非不得已(如为了覆盖某条边),不要选取没有明显含义的复杂路径。例1:用基本路径测试法进行测试voidSort(intiRecordNum,intiType){1.intx=0;2.inty=0;3.while(iRecordNum0){4.if(iType==0){5.x=y+2;}else{6.if(iType==1){7.x=y+5;}else{8.x=y+10;}9.}10.iRecordNum--;11.}}画出控制流图如下:5213746891011基本路径测试-计算环路复杂度对应上面图中的环路复杂度,计算如下:流图中有四个区域;V(G)=10条边-8结点+2=4;V(G)=3个判定结点+1=4。基本路径测试-导出测试用例•第三步:导出测试用例根据上面的计算方法,可得出四个独立的路径。(V(G)值正好等于该程序的独立路径的条数。)路径1:3-11路径2:3-4-5-10-3-11路径3:3-4-6-7-9-10-3-11路径4:3-4-6-8-9-10-3-11基本路径测试-准备测试用例•第四步:准备测试用例为了确保基本路径集中的每一条路径的执行,根据判断结点给出的条件,选择适当的数据以保证某一条路径可以被测试到,满足上面例子基本路径集的测试用例