资源描述
第第3 3章章 软件测试基本技术软件测试基本技术3.1 黑盒测试与白盒测试黑盒测试与白盒测试3.2 白白 盒盒 测测 试试技术技术3.3 黑黑 盒盒 测测 试试技术技术13.1黑盒测试与白盒测试黑盒测试与白盒测试任何工程产品都可以使用白盒测试和黑任何工程产品都可以使用白盒测试和黑盒测试两种方法之一进行测试。盒测试两种方法之一进行测试。1黑盒测试黑盒测试黑黑盒盒测测试试:已已知知产产品品的的功功能能设设计计规规格格和和用用户户手手册册,可可以以进进行行测测试试证证明明每每个个功功能能是是否否实实现现、每每个个实实现现了了的的功功能能是是否否符符合合要要求求,以以及产品的及产品的性能性能是否满足用户的要求。是否满足用户的要求。2软软件件的的黑黑盒盒测测试试意意味味着着测测试试要要在在软软件件的的接接口口处处进进行行,测测试试人人员员完完全全不不考考虑虑程程序序内内部部的的逻逻辑辑结结构构和和内内部部特特性性,只只依依据据程程序序的的需需求求规规格格说说明明书书和和用用户户手手册册,检检查查程程序序的的功功能能是是否否符符合合它它的的功功能能说说明明,以以及及性性能能是是否否满满足足用用户户的的要要求求。因因此此黑黑盒盒测测试试又又叫叫功能测试或数据驱动测试。功能测试或数据驱动测试。32白盒测试白盒测试白盒测试:已知产品的内部工作过程,可白盒测试:已知产品的内部工作过程,可以通过测试证明每种以通过测试证明每种内部操作内部操作是否符合设计规是否符合设计规格要求,所有内部成分是否已经过检查。格要求,所有内部成分是否已经过检查。白盒测试是对软件的过程性细节做细致的白盒测试是对软件的过程性细节做细致的检查,利用程序内部的逻辑结构,对程序所有检查,利用程序内部的逻辑结构,对程序所有逻辑路径进行测试逻辑路径进行测试,通过在不同点检查程序状,通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。因态,确定实际状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。此白盒测试又称为结构测试或逻辑驱动测试。4项目项目黑盒测试法黑盒测试法白盒测试法白盒测试法测试依据测试依据规格说明规格说明程序内部结构程序内部结构优点方面优点方面能确保从用户的角度能确保从用户的角度出发进行测试出发进行测试能对程序内部的特定部位进能对程序内部的特定部位进行覆盖测试行覆盖测试缺点方面缺点方面无法测试程序内部特无法测试程序内部特定部位;当规格说明有定部位;当规格说明有误,则不能发现问题误,则不能发现问题无法检查程序的外部特性;无法检查程序的外部特性;无法对未实现规格说明的程无法对未实现规格说明的程序内部欠缺部分进行测试序内部欠缺部分进行测试应用范围应用范围边界分析法边界分析法等价类划分法等价类划分法决策表测试决策表测试场景法场景法语句覆盖,判定覆盖,语句覆盖,判定覆盖,条件覆盖,判定条件覆盖,判定/条件覆盖,条件覆盖,路径覆盖,循环覆盖,路径覆盖,循环覆盖,模块接口测试模块接口测试53.2白白盒盒测测试试技技术术白盒测试的测试对象基本上是白盒测试的测试对象基本上是源程序源程序,是以程序的是以程序的内部逻辑内部逻辑为基础的一种测试方法。为基础的一种测试方法。白盒测试方法又可分为静态测试和动态白盒测试方法又可分为静态测试和动态测试。静态测试主要是检查软件的表示和描测试。静态测试主要是检查软件的表示和描述是否一致,动态测试主要是对软件系统行述是否一致,动态测试主要是对软件系统行为进行分析。为进行分析。63.2.1 白盒测试静态测试白盒测试静态测试最最常常见见的的静静态态测测试试是是找找出出源源代代码码的的语语法法错错误误,这这类类测测试试可可由由编编译译器器来来完完成成,因因为为编编译译器器可可以以逐逐行行分分析析检检验验程程序序的的语语法法,找找出出错错误误并并报报告告。除除此此之之外外,有有些些地地方方存存在在非非语语法法方方面面的的错错误误,只只能能通通过过人人工工检检测测的方法来判断。的方法来判断。人人工工检检测测的的方方法法主主要要有有代代码码检检查查法法、静态结构分析法等。静态结构分析法等。71代码检查法代码检查法8代码检查法主要检查:代码检查法主要检查:(1)检查代码和设计的一致性;检查代码和设计的一致性;(2)代码的可读性及对设计标准的遵循情况;代码的可读性及对设计标准的遵循情况;(3)代码逻辑表达的正确性;代码逻辑表达的正确性;(4)代码结构的合理性;代码结构的合理性;(5)程序中不安全、不明确和模糊的部分;程序中不安全、不明确和模糊的部分;(6)编程风格方面的问题等。编程风格方面的问题等。9main()main()intinta10,i,j,a10,i,j,tmptmp;for(ifor(i=0;i=10;i+)=0;i=10;i+)scanf(%dscanf(%d,&,&aiai););for(ifor(i=0;i=10;i+)=0;i=10;i+)for(jfor(j=i+1;j=10;j+)=i+1;j=10;j+)if(if(aiaiajaj)aiai=ajaj;for(ifor(i=0;i=10;i+)=0;i1&B=0)X=X/A;if(A=2|X1)X=X+1;20图图3-3程程序序1流流程程图图21程序程序2如下:如下:voidDoWork(intx,inty,intz)intk=0,j=0;if(x3)&(z5)j=x*y+10;/语句块语句块2j=j%3;/语句块语句块322图图3-4程程序序2流流程程图图231语句覆盖语句覆盖 语语句句覆覆盖盖使使程程序序中中每每个个语语句句至至少少都都能能被被执执行一次。行一次。例例如如,在在程程序序1中中,为为使使程程序序中中每每个个语语句句至至少少执执行行一一次次,只只需需设设计计一一个个能能通通过过路路径径a-c-e的的数数据据就就可可以以了了,例例如如选选择择输输入入数数据据为为:A=2,B=0,X=3就可达到就可达到“语句覆盖语句覆盖”标准。标准。在在程程序序2中中,如如测测试试用用例例输输入入为为:x=4、y=5、z=5程序执行的路径是:程序执行的路径是:a-b-d。242判定覆盖判定覆盖比比语语句句覆覆盖盖稍稍强强的的覆覆盖盖标标准准是是判判定定覆覆盖盖。按按判判定定覆覆盖盖准准则则进进行行测测试试是是指指,设设计计若若干干测测试试用用例例,运运行行被被测测程程序序,使使得得程程序序中中每每个个判判断断的的取取真真分分支支和和取取假假分分支支至至少少经经历历一一次次,即即判判断断的的真真假假值值均均曾曾被被满满足足。判判定覆盖又称为分支覆盖。定覆盖又称为分支覆盖。25pp要实现程序要实现程序要实现程序要实现程序2 2的判定覆盖,需要设计两个测试用例。的判定覆盖,需要设计两个测试用例。的判定覆盖,需要设计两个测试用例。的判定覆盖,需要设计两个测试用例。输入数据为:输入数据为:输入数据为:输入数据为:x=4x=4、y=5y=5、z=5z=5;x=2x=2、y=5y=5、z=5z=5程序执行的路径分别是:程序执行的路径分别是:程序执行的路径分别是:程序执行的路径分别是:abdabd;aceacepp分析:上述两个测试用例不仅满足了判定覆盖,同分析:上述两个测试用例不仅满足了判定覆盖,同分析:上述两个测试用例不仅满足了判定覆盖,同分析:上述两个测试用例不仅满足了判定覆盖,同时还做到语句覆盖。从这点看似乎判定覆盖比语句覆时还做到语句覆盖。从这点看似乎判定覆盖比语句覆时还做到语句覆盖。从这点看似乎判定覆盖比语句覆时还做到语句覆盖。从这点看似乎判定覆盖比语句覆盖更强一些,但仍然无法确定判定内部条件的错误。盖更强一些,但仍然无法确定判定内部条件的错误。盖更强一些,但仍然无法确定判定内部条件的错误。盖更强一些,但仍然无法确定判定内部条件的错误。例如把第二个判定中的条件例如把第二个判定中的条件例如把第二个判定中的条件例如把第二个判定中的条件y5y5错误写为错误写为错误写为错误写为y5y3)&(z3取真值记为取真值记为T1,取假值记为取假值记为-T1条件条件z5):条件条件x=4取真值记为取真值记为T3,取假值记为取假值记为-T3条件条件y5取真值记为取真值记为T4,取假值记为取假值记为-T428根据条件覆盖的基本思想,要使上述根据条件覆盖的基本思想,要使上述根据条件覆盖的基本思想,要使上述根据条件覆盖的基本思想,要使上述4 4个条件可能产个条件可能产个条件可能产个条件可能产生的生的生的生的8 8种情况至少满足一次,设计测试用例如下:种情况至少满足一次,设计测试用例如下:种情况至少满足一次,设计测试用例如下:种情况至少满足一次,设计测试用例如下:测试用例测试用例测试用例测试用例 执行路径执行路径执行路径执行路径 覆盖条件覆盖条件覆盖条件覆盖条件 覆盖分支覆盖分支覆盖分支覆盖分支x=4x=4、y=6y=6、z=5z=5abdabdT1T1、T2T2、T3T3、T4T4bdbdx=2x=2、y=5y=5、z=15z=15aceace-T1-T1、-T2-T2、-T3-T3、-T4-T4cece分析:上面这组测试用例不但覆盖了分析:上面这组测试用例不但覆盖了分析:上面这组测试用例不但覆盖了分析:上面这组测试用例不但覆盖了4 4 4 4个条件的全个条件的全个条件的全个条件的全部部部部8 8 8 8种情况,而且将两个判定的种情况,而且将两个判定的种情况,而且将两个判定的种情况,而且将两个判定的4 4 4 4个分支个分支个分支个分支b b b b、c c c c、d d d d、e e e e也同时覆盖了,即同时达到条件覆盖和判定覆盖。也同时覆盖了,即同时达到条件覆盖和判定覆盖。也同时覆盖了,即同时达到条件覆盖和判定覆盖。也同时覆盖了,即同时达到条件覆盖和判定覆盖。29说明:虽然前面的一组测试用例同时达到了条件覆说明:虽然前面的一组测试用例同时达到了条件覆说明:虽然前面的一组测试用例同时达到了条件覆说明:虽然前面的一组测试用例同时达到了条件覆盖和判定覆盖,但是,并不是说满足条件覆盖就一盖和判定覆盖,但是,并不是说满足条件覆盖就一盖和判定覆盖,但是,并不是说满足条件覆盖就一盖和判定覆盖,但是,并不是说满足条件覆盖就一定能满足判定覆盖。如果设计了下表中的这组测试定能满足判定覆盖。如果设计了下表中的这组测试定能满足判定覆盖。如果设计了下表中的这组测试定能满足判定覆盖。如果设计了下表中的这组测试用例,则虽然满足了条件覆盖,但只是覆盖了程序用例,则虽然满足了条件覆盖,但只是覆盖了程序用例,则虽然满足了条件覆盖,但只是覆盖了程序用例,则虽然满足了条件覆盖,但只是覆盖了程序中第一个判定的取假分支中第一个判定的取假分支中第一个判定的取假分支中第一个判定的取假分支c c和第二个判定的取真分支和第二个判定的取真分支和第二个判定的取真分支和第二个判定的取真分支d d,不满足判定覆盖的要求。,不满足判定覆盖的要求。,不满足判定覆盖的要求。,不满足判定覆盖的要求。测试用例测试用例测试用例测试用例 执行路径执行路径执行路径执行路径 覆盖条件覆盖条件覆盖条件覆盖条件覆盖分支覆盖分支覆盖分支覆盖分支x=2x=2、y=6y=6、z=5z=5acdacd-T1-T1、T2T2、-T3-T3、T4T4cdcdx=4x=4、y=5y=5、z=15z=15acdacdT1T1、-T2-T2、T3T3、-T4-T4cdcd304条件判定组合覆盖条件判定组合覆盖条条件件判判定定组组合合覆覆盖盖的的含含义义是是:设设计计足足够够的的测测试试用用例例,使使得得判判定定中中每每个个条条件件的的所所有有可可能能(真真/假假)至至少少出出现现一一次次,并并且且每每个个判判定定本本身的判定结果(真身的判定结果(真/假)也至少出现一次。假)也至少出现一次。31根据判定条件覆盖的基本思想,只需设计以下两个根据判定条件覆盖的基本思想,只需设计以下两个根据判定条件覆盖的基本思想,只需设计以下两个根据判定条件覆盖的基本思想,只需设计以下两个测试用例便可以覆盖测试用例便可以覆盖测试用例便可以覆盖测试用例便可以覆盖4 4个条件的个条件的个条件的个条件的8 8种取值以及种取值以及种取值以及种取值以及4 4个判定个判定个判定个判定分支。分支。分支。分支。测试用例测试用例测试用例测试用例 执行路径执行路径执行路径执行路径 覆盖条件覆盖条件覆盖条件覆盖条件覆盖分支覆盖分支覆盖分支覆盖分支x=4x=4、y=6y=6、z=5z=5abdabdT1T1、T2T2、T3T3、T4T4bdbdx=2x=2、y=5y=5、z=15z=15aceace-T1-T1、-T2-T2、-T3-T3、-T4-T4cece32分析:从表面上看,判定条件覆盖测试了各个判定分析:从表面上看,判定条件覆盖测试了各个判定分析:从表面上看,判定条件覆盖测试了各个判定分析:从表面上看,判定条件覆盖测试了各个判定中的所有条件的取值,但实际上,编译器在检查含有中的所有条件的取值,但实际上,编译器在检查含有中的所有条件的取值,但实际上,编译器在检查含有中的所有条件的取值,但实际上,编译器在检查含有多个条件的逻辑表达式时,某些情况下的多个条件的逻辑表达式时,某些情况下的多个条件的逻辑表达式时,某些情况下的多个条件的逻辑表达式时,某些情况下的某些条件某些条件某些条件某些条件将将将将会被其它条件所会被其它条件所会被其它条件所会被其它条件所掩盖掩盖掩盖掩盖。因此,判定。因此,判定。因此,判定。因此,判定/条件覆盖也不一定条件覆盖也不一定条件覆盖也不一定条件覆盖也不一定能够完全检查出逻辑表达式中的错误。能够完全检查出逻辑表达式中的错误。能够完全检查出逻辑表达式中的错误。能够完全检查出逻辑表达式中的错误。例如:对于第一个判定例如:对于第一个判定例如:对于第一个判定例如:对于第一个判定(x3)&(z3)&(z3x3和和和和z10z3x3为假,则编译器将不再检查为假,则编译器将不再检查为假,则编译器将不再检查为假,则编译器将不再检查z10z5)(x=4)|(y5)来说,若条件来说,若条件来说,若条件来说,若条件x=4x=4满足,就认为该判定满足,就认为该判定满足,就认为该判定满足,就认为该判定为真,这时将不会再检查为真,这时将不会再检查为真,这时将不会再检查为真,这时将不会再检查y5y5,那么同样也无法发现这,那么同样也无法发现这,那么同样也无法发现这,那么同样也无法发现这个条件中的错误。个条件中的错误。个条件中的错误。个条件中的错误。335多条件覆盖多条件覆盖多多条条件件覆覆盖盖也也称称为为条条件件组组合合覆覆盖盖,它它的的含含义义是是:设设计计足足够够的的测测试试用用例例,使使得得每每个个判判定定中中条条件件的的各各种种可可能能组组合合都都至至少少出出现现一一次次。显显然然满满足足多多条条件件覆覆盖盖的的测测试试用用例例是是一一定定满满足足判判定定覆覆盖盖、条条件件覆覆盖盖和和条条件件判判定定组组合覆盖的。合覆盖的。34对程序对程序对程序对程序2 2中的各个判定的条件取值组合加以标记:中的各个判定的条件取值组合加以标记:中的各个判定的条件取值组合加以标记:中的各个判定的条件取值组合加以标记:x3,z3,z3,z=10 x3,z=10记做记做记做记做T1-T2T1-T2,第一个判定的取假分支第一个判定的取假分支第一个判定的取假分支第一个判定的取假分支x=3,z10 x=3,z10记做记做记做记做-T1T2-T1T2,第一个判定的取假分支第一个判定的取假分支第一个判定的取假分支第一个判定的取假分支x=10 x=10记做记做记做记做-T1-T2-T1-T2,第一个判定的取假分支第一个判定的取假分支第一个判定的取假分支第一个判定的取假分支x=4,y5x=4,y5记做记做记做记做T3T4T3T4,第二个判定的取真分支第二个判定的取真分支第二个判定的取真分支第二个判定的取真分支x=4,y=5x=4,y5x!=4,y5记做记做记做记做-T3T4-T3T4,第二个判定的取真分支第二个判定的取真分支第二个判定的取真分支第二个判定的取真分支x!=4,y=5x!=4,y8 AND Y5X0 OR Y0引用语句1引用语句2abcdX16 OR Y10引用语句3ef41测试覆盖准则测试覆盖准则(1)Foster的的ESTCA覆盖准则覆盖准则前面所介绍的逻辑覆盖其出发点似乎前面所介绍的逻辑覆盖其出发点似乎是合理的是合理的、完善的。所谓、完善的。所谓“覆盖覆盖”,就是,就是想要做到全面而无遗漏,但逻辑覆盖并不想要做到全面而无遗漏,但逻辑覆盖并不能真正做到无遗漏。能真正做到无遗漏。42例如:我们不小心将前面提到的程序段中的例如:我们不小心将前面提到的程序段中的例如:我们不小心将前面提到的程序段中的例如:我们不小心将前面提到的程序段中的if(x3&Z3&Z=3&Z=3&Z10)按照我们前面设计的测试用例(按照我们前面设计的测试用例(按照我们前面设计的测试用例(按照我们前面设计的测试用例(x x的值取的值取的值取的值取2 2或或或或4 4)来看,逻辑覆盖对这样的小问题都无能为力。分析出来看,逻辑覆盖对这样的小问题都无能为力。分析出来看,逻辑覆盖对这样的小问题都无能为力。分析出来看,逻辑覆盖对这样的小问题都无能为力。分析出现这一情况的原因在于:错误区域仅仅在现这一情况的原因在于:错误区域仅仅在现这一情况的原因在于:错误区域仅仅在现这一情况的原因在于:错误区域仅仅在x=3x=3这个点这个点这个点这个点上,即仅当上,即仅当上,即仅当上,即仅当x x的值取的值取的值取的值取3 3时,测试才能发现错误。面对这时,测试才能发现错误。面对这时,测试才能发现错误。面对这时,测试才能发现错误。面对这类情况,我们应该从中吸取的教训是测试工作要有重类情况,我们应该从中吸取的教训是测试工作要有重类情况,我们应该从中吸取的教训是测试工作要有重类情况,我们应该从中吸取的教训是测试工作要有重点,要多针对容易发生问题的地方设计测试用例。点,要多针对容易发生问题的地方设计测试用例。点,要多针对容易发生问题的地方设计测试用例。点,要多针对容易发生问题的地方设计测试用例。43K.A.FosterK.A.Foster从测试工作实践的教训出发,吸收了从测试工作实践的教训出发,吸收了从测试工作实践的教训出发,吸收了从测试工作实践的教训出发,吸收了计算机硬件的测试原理,提出了一种经验型的测试计算机硬件的测试原理,提出了一种经验型的测试计算机硬件的测试原理,提出了一种经验型的测试计算机硬件的测试原理,提出了一种经验型的测试覆盖准则。覆盖准则。覆盖准则。覆盖准则。ESTCAESTCA覆盖准则:覆盖准则:覆盖准则:覆盖准则:在容易发生问题的地方设计测在容易发生问题的地方设计测在容易发生问题的地方设计测在容易发生问题的地方设计测试用例,即重视程序中谓词(条件判断)的取值。试用例,即重视程序中谓词(条件判断)的取值。试用例,即重视程序中谓词(条件判断)的取值。试用例,即重视程序中谓词(条件判断)的取值。ESTCAESTCA覆盖准则覆盖准则覆盖准则覆盖准则是一套是一套是一套是一套错误敏感用例分析规则错误敏感用例分析规则错误敏感用例分析规则错误敏感用例分析规则。这一规则虽然并这一规则虽然并这一规则虽然并这一规则虽然并不完备不完备不完备不完备,但但但但在普通程序中却是在普通程序中却是在普通程序中却是在普通程序中却是有效有效有效有效的。原因在于这是一种经验型的覆盖准则,规则本的。原因在于这是一种经验型的覆盖准则,规则本的。原因在于这是一种经验型的覆盖准则,规则本的。原因在于这是一种经验型的覆盖准则,规则本身针对了程序编写人员容易发生的错误,或是围绕身针对了程序编写人员容易发生的错误,或是围绕身针对了程序编写人员容易发生的错误,或是围绕身针对了程序编写人员容易发生的错误,或是围绕着发生错误的频繁区域,从而提高了发现错误的命着发生错误的频繁区域,从而提高了发现错误的命着发生错误的频繁区域,从而提高了发现错误的命着发生错误的频繁区域,从而提高了发现错误的命中率。中率。中率。中率。44具体规则如下:具体规则如下:具体规则如下:具体规则如下:规则规则规则规则11对于对于对于对于AArelrelBB型型型型(relrel可以是可以是可以是可以是)的分的分的分的分支谓词,应适当的选择支谓词,应适当的选择支谓词,应适当的选择支谓词,应适当的选择A A与与与与B B的值,使得测试执行的值,使得测试执行的值,使得测试执行的值,使得测试执行到该分支语句时,到该分支语句时,到该分支语句时,到该分支语句时,ABABAB的情况分别出的情况分别出的情况分别出的情况分别出现一次。现一次。现一次。现一次。这是为了检测逻辑符号写错的情况,如将这是为了检测逻辑符号写错的情况,如将这是为了检测逻辑符号写错的情况,如将这是为了检测逻辑符号写错的情况,如将“AB”AB”AB”。45 规则规则规则规则22对于对于对于对于AArelrelCC型型型型(relrel可以是可以是可以是可以是 或或或或,A,A是变量,是变量,是变量,是变量,C C是常量是常量是常量是常量)的分支谓词:当的分支谓词:当的分支谓词:当的分支谓词:当relrel为为为为 时,应时,应时,应时,应适当的选择适当的选择适当的选择适当的选择A A的值,使的值,使的值,使的值,使A=C+MA=C+M。这是为了检测这是为了检测这是为了检测这是为了检测“差差差差1”1”之类的错误,如之类的错误,如之类的错误,如之类的错误,如“A1”A1”错写成错写成错写成错写成“A0”A0”46 规则规则规则规则33对外部输入变量赋值,使其在每一个测试对外部输入变量赋值,使其在每一个测试对外部输入变量赋值,使其在每一个测试对外部输入变量赋值,使其在每一个测试用例中均有不同的值与符号,并与同一组测试用用例中均有不同的值与符号,并与同一组测试用用例中均有不同的值与符号,并与同一组测试用用例中均有不同的值与符号,并与同一组测试用例中其他变量的值与符号不同。例中其他变量的值与符号不同。例中其他变量的值与符号不同。例中其他变量的值与符号不同。这是为了检测程序语句中的错误,如应该引这是为了检测程序语句中的错误,如应该引这是为了检测程序语句中的错误,如应该引这是为了检测程序语句中的错误,如应该引用某一变量而错成引用另一个常量。用某一变量而错成引用另一个常量。用某一变量而错成引用另一个常量。用某一变量而错成引用另一个常量。47(2 2)WoodwardWoodward等人的层次等人的层次等人的层次等人的层次LCSAJLCSAJ覆盖准则覆盖准则覆盖准则覆盖准则Woodward等人曾经指出结构覆盖的等人曾经指出结构覆盖的一些准则,如分支覆盖或路径覆盖,都不一些准则,如分支覆盖或路径覆盖,都不足以保证测试数据的有效性。为此,他们足以保证测试数据的有效性。为此,他们提出了一种层次提出了一种层次LCSAJ覆盖准则。覆盖准则。48LCSAJ(LCSAJ(LinearCodeSequenceandJumpLinearCodeSequenceandJump)的字面的字面的字面的字面含义是线性代码含义是线性代码含义是线性代码含义是线性代码序列与跳转序列与跳转序列与跳转序列与跳转。在程序中,一个。在程序中,一个。在程序中,一个。在程序中,一个LCSAJLCSAJ是一组顺序执行的代码,以控制跳转为其是一组顺序执行的代码,以控制跳转为其是一组顺序执行的代码,以控制跳转为其是一组顺序执行的代码,以控制跳转为其结束点结束点结束点结束点。LCSAJLCSAJ的起点是根据程序本身决定的。它的的起点是根据程序本身决定的。它的的起点是根据程序本身决定的。它的的起点是根据程序本身决定的。它的起点起点起点起点可可可可以是程序第一行或转移语句的入口点,或是控制流可以是程序第一行或转移语句的入口点,或是控制流可以是程序第一行或转移语句的入口点,或是控制流可以是程序第一行或转移语句的入口点,或是控制流可跳达的点。跳达的点。跳达的点。跳达的点。如果有几个如果有几个如果有几个如果有几个LCSAJLCSAJ首尾相接,且第一个首尾相接,且第一个首尾相接,且第一个首尾相接,且第一个LCSAJLCSAJ起点起点起点起点为程序起点,最后一个为程序起点,最后一个为程序起点,最后一个为程序起点,最后一个LCSAJLCSAJ终点为程序终点,这样终点为程序终点,这样终点为程序终点,这样终点为程序终点,这样的的的的LCSAJLCSAJ串就组成了程序的一条路径(串就组成了程序的一条路径(串就组成了程序的一条路径(串就组成了程序的一条路径(LCSAJLCSAJ路径路径路径路径)。一条。一条。一条。一条LCSAJLCSAJ程序路径可能是由程序路径可能是由程序路径可能是由程序路径可能是由2 2个、个、个、个、3 3个或多个个或多个个或多个个或多个LCSAJLCSAJ组成的。组成的。组成的。组成的。49n n基于基于基于基于LCSAJLCSAJ与路径的关系,提出了层次与路径的关系,提出了层次与路径的关系,提出了层次与路径的关系,提出了层次LCSAJLCSAJ覆盖准覆盖准覆盖准覆盖准则。它是一个分层的覆盖准则,可以概括的描述为:则。它是一个分层的覆盖准则,可以概括的描述为:则。它是一个分层的覆盖准则,可以概括的描述为:则。它是一个分层的覆盖准则,可以概括的描述为:第一层第一层第一层第一层 语句覆盖。语句覆盖。语句覆盖。语句覆盖。第二层第二层第二层第二层 分支覆盖。分支覆盖。分支覆盖。分支覆盖。第三层第三层第三层第三层 LCSAJLCSAJ覆盖,即程序中的每一个覆盖,即程序中的每一个覆盖,即程序中的每一个覆盖,即程序中的每一个LCSAJLCSAJ都至都至都至都至少在测试中经历过一次。少在测试中经历过一次。少在测试中经历过一次。少在测试中经历过一次。第四层第四层第四层第四层 两两两两两两两两LCSAJLCSAJ覆盖,即程序中的每两个相连的覆盖,即程序中的每两个相连的覆盖,即程序中的每两个相连的覆盖,即程序中的每两个相连的LCSAJLCSAJ组合起来在测试中都要经历一次。组合起来在测试中都要经历一次。组合起来在测试中都要经历一次。组合起来在测试中都要经历一次。第第第第n+2n+2层层层层 每每每每n n个首尾相连的个首尾相连的个首尾相连的个首尾相连的LCSAJLCSAJ组合在测试中都要组合在测试中都要组合在测试中都要组合在测试中都要经历一次。经历一次。经历一次。经历一次。n n在实施测试时,若要实现上述的层次在实施测试时,若要实现上述的层次在实施测试时,若要实现上述的层次在实施测试时,若要实现上述的层次LCSAJLCSAJ覆盖,需覆盖,需覆盖,需覆盖,需要产生被测程序的所有要产生被测程序的所有要产生被测程序的所有要产生被测程序的所有LCSAJLCSAJ。50例:找出前面程序例:找出前面程序例:找出前面程序例:找出前面程序2 2的所有的所有的所有的所有LCSAJLCSAJ和和和和LCSAJLCSAJ路径。路径。路径。路径。LCSAJLCSAJ(5 5个):个):个):个):(1 1)intintk=0,j=0;if(x3)&(z3)&(z5);if(x=4)|(y5)(3 3)if(x=4)|(y5)if(x=4)|(y5)(4 4)j=x*y+10;j=j%3j=x*y+10;j=j%3(5 5)j=j%3j=j%3LCSAJLCSAJ路径(路径(路径(路径(4 4条):条):条):条):(1 1)-(2 2)-(4 4)(1 1)-(2 2)-(5 5)(1 1)-(3 3)-(4 4)(1 1)-(3 3)-(5 5)513.2.4 基本路径测试法基本路径测试法基基本本路路径径测测试试法法是是在在程程序序控控制制流流图图的的基基础础上上,通通过过分分析析控控制制构构造造的的环环路路复复杂杂性性,导导出出基基本本可可执执行行路路径径集集合合,从从而而设设计计测测试试用用例例的的方方法法。设设计计出出的的测测试试用用例例要要保保证证在在测测试试中中程程序序的的每每一一条条可可执执行行语语句句至至少少执执行行一次。一次。521程序的控制流图程序的控制流图控制流图是程序流程图简化后得到的,它控制流图是程序流程图简化后得到的,它可以更加突出的表示程序控制流的结构。可以更加突出的表示程序控制流的结构。控制流图中包括两种图形符号:节点和控控制流图中包括两种图形符号:节点和控制流线。制流线。节点由带标号的圆圈表示,可代表一个或节点由带标号的圆圈表示,可代表一个或多个语句、一个处理框序列和一个条件判多个语句、一个处理框序列和一个条件判定框(假设不包含复合条件)。定框(假设不包含复合条件)。控制流线由带箭头的弧或线表示,可称为控制流线由带箭头的弧或线表示,可称为边。它代表程序中的控制流。边。它代表程序中的控制流。53图3-5 基本的控制流图的图形符号 其其其其中中中中,包包包包含含含含条条条条件件件件的的的的节节节节点点点点被被被被称称称称为为为为判判判判定定定定节节节节点点点点(也也也也叫叫叫叫谓谓谓谓词词词词节节节节点),由边和节点所限定的范围被称为点),由边和节点所限定的范围被称为点),由边和节点所限定的范围被称为点),由边和节点所限定的范围被称为区域区域区域区域。注意注意注意注意:由判定节点发出的边必须终止于某一个节点。由判定节点发出的边必须终止于某一个节点。由判定节点发出的边必须终止于某一个节点。由判定节点发出的边必须终止于某一个节点。54图图图图3-63-6(a a)所所所所示示示示的的的的是是是是一一一一个个个个程程程程序序序序的的的的流流流流程程程程图图图图,它它它它可可可可以以以以映射成图(映射成图(映射成图(映射成图(b b)所示的控制流图。)所示的控制流图。)所示的控制流图。)所示的控制流图。图3-6 程序流程图和对应的控制流图 55对于复合条件,则可将其分解为多个单个条件,并对于复合条件,则可将其分解为多个单个条件,并对于复合条件,则可将其分解为多个单个条件,并对于复合条件,则可将其分解为多个单个条件,并映射成控制流图。映射成控制流图。映射成控制流图。映射成控制流图。562环形复杂度环形复杂度环形复杂度也称为圈复杂度,它是一种为程序逻环形复杂度也称为圈复杂度,它是一种为程序逻环形复杂度也称为圈复杂度,它是一种为程序逻环形复杂度也称为圈复杂度,它是一种为程序逻辑复杂度提供定量尺度的软件度量。辑复杂度提供定量尺度的软件度量。辑复杂度提供定量尺度的软件度量。辑复杂度提供定量尺度的软件度量。环形复杂度可用于基本路径方法,它可以提供:环形复杂度可用于基本路径方法,它可以提供:环形复杂度可用于基本路径方法,它可以提供:环形复杂度可用于基本路径方法,它可以提供:程序基本路径集合中的独立路径数量;确保所有程序基本路径集合中的独立路径数量;确保所有程序基本路径集合中的独立路径数量;确保所有程序基本路径集合中的独立路径数量;确保所有语句至少执行一次的测试数量的上界。语句至少执行一次的测试数量的上界。语句至少执行一次的测试数量的上界。语句至少执行一次的测试数量的上界。独立路径独立路径独立路径独立路径指程序中至少引入一个指程序中至少引入一个指程序中至少引入一个指程序中至少引入一个新新新新的处理语句集的处理语句集的处理语句集的处理语句集合或一个新条件的程序通路,即独立路径必须至合或一个新条件的程序通路,即独立路径必须至合或一个新条件的程序通路,即独立路径必须至合或一个新条件的程序通路,即独立路径必须至少包含一条在本次定义路径之前不曾用过的边。少包含一条在本次定义路径之前不曾用过的边。少包含一条在本次定义路径之前不曾用过的边。少包含一条在本次定义路径之前不曾用过的边。测试可以被设计为基本路径集的执行过程,但基测试可以被设计为基本路径集的执行过程,但基测试可以被设计为基本路径集的执行过程,但基测试可以被设计为基本路径集的执行过程,但基本路径集通常并不唯一。本路径集通常并不唯一。本路径集通常并不唯一。本路径集通常并不唯一。57环形复杂度以图论为基础,为我们提供了非常有用环形复杂度以图论为基础,为我们提供了非常有用环形复杂度以图论为基础,为我们提供了非常有用环形复杂度以图论为基础,为我们提供了非常有用的软件度量,有三种方法用于计算环形复杂度:的软件度量,有三种方法用于计算环形复杂度:的软件度量,有三种方法用于计算环形复杂度:的软件度量,有三种方法用于计算环形复杂度:控制流图中区域的数量对应于环形复杂度。控制流图中区域的数量对应于环形复杂度。控制流图中区域的数量对应于环形复杂度。控制流图中区域的数量对应于环形复杂度。给定控制流图给定控制流图给定控制流图给定控制流图GG的环形复杂度的环形复杂度的环形复杂度的环形复杂度V(G)V(G),定义为定义为定义为定义为V(G)=E-N+2V(G)=E-N+2其中,其中,其中,其中,E E是控制流图中边的数量,是控制流图中边的数量,是控制流图中边的数量,是控制流图中边的数量,N N是控制流图中是控制流图中是控制流图中是控制流图中的节点数量。的节点数量。的节点数量。的节点数量。给定控制流图给定控制流图给定控制流图给定控制流图GG的环形复杂度的环形复杂度的环形复杂度的环形复杂度V(G)V(G),也可定义为也可定义为也可定义为也可定义为 V(G)=P+1V(G)=P+1其中,其中,其中,其中,P P是控制流图是控制流图是控制流图是控制流图GG中判定节点的数量。中判定节点的数量。中判定节点的数量。中判定节点的数量。58练习练习根据左图给出的程序流程根据左图给出的程序流程根据左图给出的程序流程根据左图给出的程序流程图,完成以下要求:图,完成以下要求:图,完成以下要求:图,完成以下要求:(1 1)画出相应的控制流图)画出相应的控制流图)画出相应的控制流图)画出相应的控制流图(2 2)计算环形复杂度)计算环形复杂度)计算环形复杂度)计算环形复杂度(3 3)找出程序的独立路径)找出程序的独立路径)找出程序的独立路径)找出程序的独立路径集合集合集合集合ac593基本路径测试法的步骤基本路径测试法的步骤 (1)画出程序控制流图画出程序控制流图(2)计算程序环路复杂性计算程序环路复杂性(3)确定独立路径集合确定独立路径集合(4)准备测试用例准备测试用例60voidSort(voidSort(intint iRecordNumiRecordNum,intint iTypeiType)1122intintx=0;x=0;33intinty=0;y=0;4while(4while(iRecordNumiRecordNum-0)-0)556if(6if(iTypeiType=0)=0)7 7x=y+2;break;x=y+2;break;8else8else9 9if(if(iTypeiType=1)=1)10 x=y+10;10 x=y+10;11else11else12x=y+20;12x=y+20;131314144 46 67 79 9101012121313141461画出控制流图:画出控制流图:画出控制流图:画出控制流图:如右图所示如右图所示如右图所示如右图所示计算环形复杂度:计算环形复杂度:计算环形复杂度:计算环形复杂度:1010(边)(边)(边)(边)-8-8(节点)(节点)(节点)(节点)+2=4+2=4导出独立路径导出独立路径导出独立路径导出独立路径路径路径路径路径1 1:414414路径路径路径路径2 2:4671446714路径路径路径路径3 3:46910134144691013414路径路径路径路径4 4:4691213414469121341446791012131462输入数据输入数据输入数据输入数据预期输出预期输出预期输出预期输出测试用例测试用例测试用例测试用例1 1irecordnumirecordnum=0=0itypeitype=0=0 x=0 x=0y=0y=0测试用例测试用例测试用例测试用例2 2irecordnumirecordnum=1 1itypeitype=0=0 x=2x=2y=0y=0测试用例测试用例测试用例测试用例3 3irecordnumirecordnum=1 1itypeitype=1 1x=x=1 10 0y=0y=0测试用例测试用例测试用例测试用例4 4irecordnumirecordnum=1 1itypeitype=2 2x=0 x=0y=y=2 20 0设计测试用例:设计测试用例:设计测试用例:设计测试用例:63开始开始 i=1i=1,n1=n2=0n1=n2=0,sum=0sum=0ScoreiScorei-1 AND n250-1 AND n20 AND 0 AND scoreiscorei1000n10average=sum/n1average=sum/n1average=average=1 1 返回返回F FF FF FT TT TT T1 12 2和和3 34 45 5和和6 67 78 89 9101011111212641 12 23 34 45 56 67 78 89 9111110101212R R1 1R R2 2R R3 3R R4 4R R5 5R R6 6开始开始 i=1i=1,n1=n2=0n1=n2=0,sum=0sum=0ScoreiScorei-1 AND n250-1 AND n20 AND 0 AND scoreiscorei1000n10average=sum/n1average=sum/n1average=average=1 1 返回返回F FF FF FT TT TT T1 12 2和和3 34 45 5和和6 67 78 89 9101011111212步骤步骤1:导出过程的流图:导出过程的流图65步骤步骤步骤步骤2 2 2 2:确定环形复杂度:确定环形复杂度:确定环形复杂度:确定环形复杂度V(G)V(G)V(G)V(G)1 1 1 1)V(G)=6 V(G)=6 V(G)=6 V(G)=6(个区域)(个区域)(个区域)(个区域)2 2 2 2)V(G)=EV(G)=EV(G)=EV(G)=EN+2=16N+2=16N+2=16N+2=1612+2=612+2=612+2=612+2=6 其其其其中中中中E E E E为为为为流流流流图图图图中中中中的的的的边边边边数数数数,N N N N为为为为结点数;结点数;结点数;结点数;3 3 3 3)V(G)=P+1=5+1=6V(G)=P+1=5+1=6V(G)=P+1=5+1=6V(G)=P+1=5+1=6 其中其中其中其中P P P P为谓词结点的个数。为谓词结点的个数。为谓词结点的个数。为谓词结点的个数。在流图中,结点在流图中,结点在流图中,结点在流图中,结点2 2 2 2、3 3 3 3、5 5 5 5、6 6 6 6、9 9 9 9是谓词结点。是谓词结点。是谓词结点。是谓词结点。1 12 23 34 45 56 67 78 89 9111110101212R R1 1R R2 2R R3 3R R4 4R R5 5R R6 666步骤步骤步骤步骤3 3 3 3:确定基本路径集合:确定基本路径集合:确定基本路径集合:确定基本路径集合路径路径路径路径1 1 1 1:1-2-9-10-121-2-9-10-121-2-9-10-121-2-9-10-12路径路径路径路径2 2 2 2:1-2-9-11-121-2-9-11-121-2-9-11-121-2-9-11-12路径路径路径路径3 3 3 3:1-2-3-9-10-121-2-3-9-10-121-2-3-9-10-121-2-3-9-10-12路径路径路径路径4 4 4 4:1-2-3-4-5-8-21-2-3-4-5-8-21-2-3-4-5-8-21-2-3-4-5-8-2路径路径路径路径5 5 5 5:1-2-3-4-5-6-8-21-2-3-4-5-6-8-21-2-3-4-5-6-8-21-2-3-4-5-6-8-2路径路径路径路径6 6 6 6:1-2-3-4-5-6-7-8-21-2-3-4-5-6-7-8-21-2-3-4-5-6-7-8-21-2-3-4-5-6-7-8-21 12 23 34 45 56 67 78 89 9111110101212R R1 1R R2 2R R3 3R R4 4R R5 5R R6 6674.基本路径测试中的图形矩阵工具基本路径测试中的图形矩阵工具图图形形矩矩阵阵是是在在基基本本路路径径测测试试中中起起辅辅助助作作用用的的软软件件工工具具,利利用用它它可可以以实实现现自自动动地地确确定定一个基本路径集一个基本路径集。为为了了使使导导出出程程序序控控制制流流图图和和决决定定基基本本测测试试路路径径的的过过程程均均自自动动化化实实现现,开开发发了了一一个个辅辅助助基基本本路路径径测测试试的的软软件件工工具具,称称为为图图形形矩矩阵阵(graphmatrix),在在进进行行基基本本路路径径测测试试中中很很有用。有用。68图矩阵是控制流图的矩阵表示形式。图矩阵是控制流图的矩阵表示形式。图矩阵是控制流图的矩阵表示形式。图矩阵是控制流图的矩阵表示形式。图图图图矩阵是一个方形矩阵,矩阵是一个方形矩阵,矩阵是一个方形矩阵,矩阵是一个方形矩阵,其维数等于控制流图的其维数等于控制流图的其维数等于控制流图的其维数等于控制流图的节点数。节点数。节点数。节点数。矩阵中的矩阵中的矩阵中的矩阵中的每列和每行都对应于标识的节点,每列和每行都对应于标识的节点,每列和每行都对应于标识的节点,每列和每行都对应于标识的节点,矩阵元素对应于节点间的边。矩阵元素对应于节点间的边。矩阵元素对应于节点间的边。矩阵元素对应于节点间的边。通常,控制流图中的结点用数字标识,边则用字通常,控制流图中的结点用数字标识,边则用字通常,控制流图中的结点用数字标识,边则用字通常,控制流图中的结点用数字标识,边则用字母标识。如果在控制流图中从第母标识。如果在控制流图中从第母标识。如果在控制流图中从第母标识。如果在控制流图中从第 i i个结点到第个结点到第个结点到第个结点到第 j j个个个个结点有一个标识为结点有一个标识为结点有一个标识为结点有一个标识为 x x的边相连接,则在对应图矩阵的边相连接,则在对应图矩阵的边相连接,则在对应图矩阵的边相连接,则在对应图矩阵的第的第的第的第 i i行第行第行第行第 j j列有一个非空的元素列有一个非空的元素列有一个非空的元素列有一个非空的元素 x x。参见书本参见书本参见书本参见书本5959页的图页的图页的图页的图693.2.5 其他白盒测试方法其他白盒测试方法1域测试域测试域测试在分析域测试在分析输入域输入域的基础上,选择适的基础上,选择适当的测试点,对应不同的执行路径,进行测当的测试点,对应不同的执行路径,进行测试,主要检查程序控制流(结构)的错误。试,主要检查程序控制流(结构)的错误。2符号测试符号测试允许程序的输入不仅仅是具体的数值数允许程序的输入不仅仅是具体的数值数据,而且包括据,而且包括符号值符号值,用于避免具体值的非,用于避免具体值的非典型性。典型性。703Z路径覆盖路径覆盖Z路径覆盖是路径覆盖是路径覆盖的一种路径覆盖的一种变体,它是体,它是将程序中的将程序中的循循环结构构简化化为选择结构构的的一种一种路路径覆盖。径覆盖。循循环简化的目的是限制循化的目的是限制循环的次数,无的次数,无论循循环的形式和循的形式和循环体体实际执行的次数,行的次数,简化后化后的循的循环测试只考只考虑执行循行循环体一次和零次(不体一次和零次(不执行)两种情况,即考行)两种情况,即考虑执行行时进入循入循环体一体一次和跳次和跳过循循环体体这两种情况。两种情况。71 在循在循在循在循环简环简化的思化的思化的思化的思路下,循路下,循路下,循路下,循环环与判定与判定与判定与判定分支的效果是一分支的效果是一分支的效果是一分支的效果是一样样的,即:循的,即:循的,即:循的,即:循环环要么要么要么要么执执行、要么跳行、要么跳行、要么跳行、要么跳过过。724程序变异程序变异程序变异方法是一种程序变异方法是一种错误驱动错误驱动测试。测试。所谓错误驱动测试方法,是指该方法是针所谓错误驱动测试方法,是指该方法是针对某类特定程序错误的。显然,要想找出对某类特定程序错误的。显然,要想找出程序中所有的错误几乎是不可能的。比较程序中所有的错误几乎是不可能的。比较现实的解决办法是将错误的搜索范围尽可现实的解决办法是将错误的搜索范围尽可能地缩小,以利于专门能地缩小,以利于专门测试某类错误测试某类错误是否是否存在。存在。733.2.6 白盒测试应用策略白盒测试应用策略以以下下是是各各种种白白盒盒测测试试方方法法的的综综合合应应用用策策略,可供在实际测试应用过程中参考。略,可供在实际测试应用过程中参考。(1)在在测测试试中中,应应尽尽量量先先使使用用工工具具进进行行静态结构分析。静态结构分析。(2)测测试试中中可可采采取取先先静静态态后后动动态态的的组组合合方方式式:先先进进行行静静态态结结构构分分析析、代代码码检检查查,再进行覆盖率测试。再进行覆盖率测试。74(3)利利用用静静态态分分析析的的结结果果作作为为导导引引,通通过过代代码码检检查查和和动动态态测测试试的的方方式式对对静静态态发发现现结结果果进进行行进进一一步步的的确确认认,使使测测试试工工作作更更为为有效。有效。(4)覆覆盖盖率率测测试试是是白白盒盒测测试试的的重重点点,一一般般可可使使用用基基本本路路径径测测试试法法达达到到语语句句覆覆盖盖标标准准;对对于于软软件件的的重重点点模模块块,应应使使用用多多种种覆覆盖率标准衡量代码的覆盖率。盖率标准衡量代码的覆盖率。75(5)在在不不同同的的测测试试节节点点,测测试试的的侧侧重重点点不不同同:在在单单元元测测试试阶阶段段,以以代代码码检检查查、逻逻辑辑覆覆盖盖为为主主;在在集集成成测测试试阶阶段段,需需要要增增加加静静态态结结构构分分析析等等;在在系系统统测测试试阶阶段段,应应根根据黑盒测试的结果,采取相应的白盒测试。据黑盒测试的结果,采取相应的白盒测试。76
展开阅读全文