资源描述
第第四四章章第 四 章白盒测试方法 白盒测试基本概念白盒测试基本概念1逻辑覆盖逻辑覆盖2基本路径测试基本路径测试3循环测试循环测试4面向对象的白盒测试面向对象的白盒测试5其他白盒测试方法简介其他白盒测试方法简介6主主要要内内容容第四章第四章白盒测试方法白盒测试方法白盒测试基本概念1逻辑覆盖2基本路径测试3循环测试4面向对象白盒测试的基本概念白盒测试的基本概念白盒测试:把程序看成装在白盒测试:把程序看成装在一个透明的盒子里,程序的一个透明的盒子里,程序的结构和处理过程完全可见,结构和处理过程完全可见,按照程序的内部逻辑测试程按照程序的内部逻辑测试程序,以检查程序中的每条通序,以检查程序中的每条通路是否都能按照预先要求正路是否都能按照预先要求正确工作。确工作。白盒测试针对被测单元的内白盒测试针对被测单元的内部进行,它的突出特点是基部进行,它的突出特点是基于被测程序的于被测程序的源代码源代码,而不,而不是基于软件的规格说明书。是基于软件的规格说明书。白盒测试的基本概念白盒测试:把程序看成装在一个透明的盒子里,白盒测试方法的分类白盒测试方法的分类静态测试静态测试:着重在于纠正软件系统在描述、表示和规:着重在于纠正软件系统在描述、表示和规格上的错误,是进一步测试的前提,方法包括:格上的错误,是进一步测试的前提,方法包括:桌面检查(桌面检查(Deskchecking)代码评审(代码评审(Codereading/review)走查(走查(Walkthroughs)动态测试动态测试:根据程序的控制结构设计测试用例,要求:根据程序的控制结构设计测试用例,要求:保证一个模块中的所有独立路径至少执行一次保证一个模块中的所有独立路径至少执行一次对所有逻辑值均需测试对所有逻辑值均需测试True和和False在上下边界及可操作范围内运行所有循环在上下边界及可操作范围内运行所有循环检查内部数据结构以确保其有效性检查内部数据结构以确保其有效性白盒测试方法的分类静态测试:着重在于纠正软件系统在描述、表示白盒白盒测试的常用方法的常用方法逻辑覆盖覆盖基本路基本路径径测试程序程序结构分析构分析插桩插桩白盒测试的常用方法逻辑覆盖基本路径测试 程序结构分析 插桩控制流图的图形符号控制流图的图形符号 控制流图的图形符号 语句覆盖测试用例课件白盒测试基本概念白盒测试基本概念1逻辑覆盖逻辑覆盖2基本路径测试基本路径测试3循环测试循环测试4面向对象的白盒测试面向对象的白盒测试5其他白盒测试方法简介其他白盒测试方法简介6主主要要内内容容第四章第四章白盒测试方法白盒测试方法白盒测试基本概念1逻辑覆盖2基本路径测试3循环测试4面向对象逻逻辑辑覆覆盖盖以以程程序序的的内内部部逻逻辑辑结结构构为基础,主要分以下几种方式:为基础,主要分以下几种方式:逻逻 辑辑 覆覆 盖盖语句覆盖句覆盖判定覆盖判定覆盖条件覆盖条件覆盖判定条件覆盖判定条件覆盖条件条件组合覆盖合覆盖路径覆盖路径覆盖逻辑覆盖以程序的内部逻辑结构为基础,主要分以下几种方式:逻1语句句覆覆盖盖StatementCoverage设计足足够多的多的测试用例,用例,使得程序中的每个使得程序中的每个语句至句至少少执行一次。行一次。语 句 覆 盖设计足够多的测试用例,使得程序中的每1语语句句覆覆盖盖用例用例ABX1204语句覆盖句覆盖对程程序的序的逻辑覆盖很覆盖很少,只能少,只能测试部部分分语句,是很弱句,是很弱的的逻辑判断判断标准。准。1 语 句 覆 盖用例ABX1204语句覆盖对程序的逻辑语语句句覆覆盖盖测试用例:测试用例:a=10,b=5intfoo(inta,intb)returna/b;尽管语句覆盖率达到了所谓的尽管语句覆盖率达到了所谓的100%,但是却没有发现最简单的但是却没有发现最简单的Bug,如:,如:b=0时会出现一个除零异常。时会出现一个除零异常。语 句 覆 盖测试用例:int foo(int a,int2 判判 定定 覆覆 盖盖Dicision Coverage不不仅每个每个语句都必句都必须至少至少执行一次,而且每个判定表达式的行一次,而且每个判定表达式的每种可能的每种可能的结果都果都应该至少至少执行行一次,即每个判定的一次,即每个判定的“真真”分支分支和和“假假”分支至少都分支至少都执行一次。行一次。判定覆盖又称分支覆盖。判定覆盖又称分支覆盖。判 定 覆 盖 不仅每个语句都必须至少执行一2判定覆盖判定覆盖(分支覆盖分支覆盖)用例用例ABX12042111判定覆盖比判定覆盖比语句覆盖句覆盖强,但是,但是对程序程序逻辑的覆的覆盖程度仍然不高。盖程度仍然不高。122 判定覆盖(分支覆盖)用例ABX12042 1 1 13 条条 件件 覆覆 盖盖Condition Coverage不不仅每个每个语句都必句都必须至少至少执行一次,而且每个判定表达式中行一次,而且每个判定表达式中的每个条件都取到各种可能的的每个条件都取到各种可能的结果,即每个条件的果,即每个条件的“真真”条件条件和和“假假”条件条件至少都至少都执行一次。行一次。条 件 覆 盖 不仅每个语句都必须至少执行一次3条条件件覆覆盖盖用例用例ABX12042111A1,B!=0,A=2,X=1A1条件覆盖条件覆盖1:用例用例ABX1211210312程序中共有程序中共有4个条件个条件8个结果个结果A1,B=0,A=2,X1(全真全真)A=1,B!=0,A!=2,X1,条件覆盖特点条件覆盖特点条件覆盖特点判定覆盖判定覆盖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 1)a=5,b=15a=5,b=15 true,false true,false 分支一分支一(2 2)a=15,b=5 a=15,b=5 false,true false,true 分支一分支一这时候,虽然做到了条件覆盖,这时候,虽然做到了条件覆盖,但却没有把两个判定分支都执但却没有把两个判定分支都执行到,没有做到判定覆盖。行到,没有做到判定覆盖。*结论:结论:判定覆盖不一定包含条判定覆盖不一定包含条件覆盖,条件覆盖也不一定包件覆盖,条件覆盖也不一定包含判定覆盖含判定覆盖判定覆盖 vs 条件覆盖判定覆盖:int foo(int a4 判判 定定 条条 件件 覆覆 盖盖Decision/Condition Coverage设计足足够多的多的测试用例,用例,使得判定中的每个使得判定中的每个条件条件都取都取到各种可能的到各种可能的值,而且每个,而且每个判定判定表达式也都取到各种可表达式也都取到各种可能的能的结果。果。判 定 条 件 覆 盖 设计足够多的测试用例,使得4判定判定/条件覆盖条件覆盖*表表面面上上看看,判判定定条条件件覆覆盖盖测试了了所所有有条条件件的的所所有有可可能能结果果,但但事事实上上有有些些条条件件会会掩掩盖盖另另一一些些条条件件。例例如如,在在“与与”表表达达式式中中,如如果果某某一一条条件件为“假假”,则整整个个判判定定的的值为“假假”,这个个判判定定中中的的其其他他条条件件就就不不起起作作用用了了。同同样地地,若若在在“或或”表表达达式式中中某某一一条条件件为“真真”,则整整个个判判定定的的值为“真真”,其其它它条条件件也也就就不不起起作作用用了了。因因此此,采采用用判判定定条条件件覆覆盖盖时,判判定定表表达达式式中中的的错误不一定能不一定能测试出来。出来。用例用例ABX12042111124 判定/条件覆盖*表面上看,判定条件覆盖测试了所有条件5 条条 件件 组 合合 覆覆 盖盖Condition Combination Coverage设计足足够多的多的测试用例,用例,使得每个判定表达式中条件使得每个判定表达式中条件的各种可能的各种可能组合都至少出合都至少出现一次。一次。条 件 组 合 覆 盖 设计足够多的5条件组合覆盖条件组合覆盖a点的所有条件点的所有条件组合:合:(1)A1,B0;(2)A1,B0(3)A 1,B0;(4)A 1,B0b点的所有条件点的所有条件组合:合:(5)A2,x1;(6)A2,x1(7)A 2,x1;(8)A 2,x1ab一一组测试用例用例:满足足(1)和和(5):A2,B0,x4满足足(2)和和(6):A2,B1,x1满足足(3)和和(7):A1,B0,x2满足足(4)和和(8):A1,B1,x1第二第二组测试用例用例:满足足(1)和和(8):A3,B0,x1满足足(2)和和(7):A3,B1,x2满足足(3)和和(6):A无取无取值,B0,x1满足足(4)和和(5):A无取无取值,B1,x2满足条件足条件组合覆盖合覆盖标准的准的测试数据,也一定数据,也一定满足判定覆盖、足判定覆盖、条件覆盖和判定条件覆盖和判定/条件覆盖条件覆盖标准,是准,是这几种覆盖几种覆盖标准中最准中最强的。不的。不过它不一定使程序中每它不一定使程序中每条路径都条路径都执行到。行到。5 条件组合覆盖a点的所有条件组合:ab一组测试用例:第二条件覆盖条件覆盖vs条件组合覆盖条件组合覆盖条件覆盖条件覆盖(3个条件个条件6个结果个结果):(1)a=5,b=7,c=6(全真)(全真)(2)a=7,b=9,c=4(全假)(全假)intfoo(inta,intb)if(a6|b5)/判定判定h return1;条件组合覆盖条件组合覆盖:k条件条件h条件条件:(1)c5;(2)c=5测试用例测试用例(1)a6,b8(2)a=8(3)a=6,b=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=6条件覆盖 vs 条件组合覆盖条件覆盖(3个条件6个结果):1.语句覆盖语句覆盖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;1.语句覆盖 上面三种覆盖率都达到了100%,很好!但是6 路路 径径 覆覆 盖盖Path Coverage设计足足够多的多的测试用用例,使程序的每一条可能例,使程序的每一条可能路径都至少路径都至少执行一次。行一次。路 径 覆 盖 设计足够多的测试用例路路径径覆覆盖盖路径覆盖将所有可能的返回值都测试到了,这正路径覆盖将所有可能的返回值都测试到了,这正是它被很多人认为是是它被很多人认为是“最强的覆盖最强的覆盖”的原因。的原因。intfoo(inta,intb)intnReturn=0;if(a10)nReturn+=1;/分支一分支一if(b0)if(y=0)k=x+100;elseif(y=1)k=k+10;elsek=20;returnk;基基本本路路径径测测试试inttest2(intx,inty)intk=0;if(x0)if(y=0)k=x+100;elseif(y=1)k=k+10;elsek=20;/if(y=0)/if(x0)returnk;第一步:第一步:给程序语给程序语句编号句编号int test2(int x,int y)基本路径测第二步:画出第二步:画出程序流图程序流图路径路径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第三步:找第三步:找出基本路径出基本路径测试用例测试用例: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;elseif(y=1)k+=10;elsek=20;returnk;第二步:画出程序流图路径1:1,2,10第三步:找出基白盒测试基本概念白盒测试基本概念1逻辑覆盖逻辑覆盖2基本路径测试基本路径测试3循环测试循环测试4面向对象的白盒测试面向对象的白盒测试5其他白盒测试方法简介其他白盒测试方法简介6主主要要内内容容第四章第四章白盒测试方法白盒测试方法白盒测试基本概念1逻辑覆盖2基本路径测试3循环测试4面向对象循循环环测测试试简单循环简单循环串接循环串接循环嵌套循环嵌套循环循 环 测 试简单循环串接循环嵌套循环跳过循环跳过循环只通过循环一次只通过循环一次通过循环两次通过循环两次通过循环通过循环m次,其中次,其中mn-1通过循环通过循环n1,n,n+1次次简单循环测试简单循环测试注注:n是允许通过循环的最大次数是允许通过循环的最大次数 简单循环测试注:n是允许通过循环的最大次数 嵌套循环测试嵌套循环测试对最内层循环做简单循环的全部对最内层循环做简单循环的全部测试。所有其它层的循环变量置测试。所有其它层的循环变量置为最小值。为最小值。逐步外推,对其外面一层循环进逐步外推,对其外面一层循环进行测试。测试时保持所有外层循行测试。测试时保持所有外层循环的循环变量取最小值,所有其环的循环变量取最小值,所有其它嵌套内层循环的循环变量取它嵌套内层循环的循环变量取“典型典型”值。值。反复进行,直到所有各层循环测反复进行,直到所有各层循环测试完毕。试完毕。对全部各层循环同时取最小循环对全部各层循环同时取最小循环次数,或者同时取最大循环次数次数,或者同时取最大循环次数嵌套循环测试串接串接循环测试循环测试如果串接循环的各个循环都如果串接循环的各个循环都彼此独立,则可以使用简单彼此独立,则可以使用简单循环的方法来测试串接循环。循环的方法来测试串接循环。当循环不独立时,使用测试当循环不独立时,使用测试嵌套循环的方法来测试串接嵌套循环的方法来测试串接循环。循环。串接循环测试白盒测试基本概念白盒测试基本概念1逻辑覆盖逻辑覆盖2基本路径测试基本路径测试3循环测试循环测试4面向对象的白盒测试面向对象的白盒测试5其他白盒测试方法简介其他白盒测试方法简介6主主要要内内容容第四章第四章白盒测试方法白盒测试方法白盒测试基本概念1逻辑覆盖2基本路径测试3循环测试4面向对象面向对象的白盒测试面向对象的白盒测试类测试一般有两种主要的方式:功能性测试和结类测试一般有两种主要的方式:功能性测试和结构性测试,即对应于传统结构化软件的黑盒测试构性测试,即对应于传统结构化软件的黑盒测试和白盒测试。和白盒测试。结构性测试要考虑程序的代码是否正确,对类中结构性测试要考虑程序的代码是否正确,对类中的方法进行测试,它把类作为一个单元来进行测的方法进行测试,它把类作为一个单元来进行测试。测试分为两层:第一层考虑类中各独立方法试。测试分为两层:第一层考虑类中各独立方法的代码;第二层考虑方法之间的相互作用。的代码;第二层考虑方法之间的相互作用。对于一个类的测试要保证类在其状态的代表集上对于一个类的测试要保证类在其状态的代表集上能够正确工作,构造函数的参数选择以及消息序能够正确工作,构造函数的参数选择以及消息序列的选择都要满足这一准则。列的选择都要满足这一准则。面向对象的白盒测试类测试一般有两种主要的方式:功能性测试和结面向对象的白盒测试面向对象的白盒测试方法的单独测试方法的单独测试结构性测试的第一层是考虑各独立的方法,结构性测试的第一层是考虑各独立的方法,这可以与过程的测试采用同样的方法,两者这可以与过程的测试采用同样的方法,两者之间最大的差别在于方法改变了它所在实例之间最大的差别在于方法改变了它所在实例的状态,这就要取得隐藏的状态信息来估算的状态,这就要取得隐藏的状态信息来估算测试的结果,传给其它对象的消息被忽略,测试的结果,传给其它对象的消息被忽略,而以桩来代替,并根据所传的消息返回相应而以桩来代替,并根据所传的消息返回相应的值,测试数据要求能完全覆盖类中代码,的值,测试数据要求能完全覆盖类中代码,可以用传统的测试技术来获取。可以用传统的测试技术来获取。面向对象的白盒测试方法的单独测试面向对象的白盒测试面向对象的白盒测试方法的综合测试方法的综合测试 第二层要考虑一个方法调用本对象类中的第二层要考虑一个方法调用本对象类中的其它方法和从一个类向其它类发送信息的其它方法和从一个类向其它类发送信息的情况。单独测试一个方法时,只考虑其本情况。单独测试一个方法时,只考虑其本身执行的情况,而没有考虑动作的顺序问身执行的情况,而没有考虑动作的顺序问题,测试用例中加入了激发这些调用的信题,测试用例中加入了激发这些调用的信息,以检查它们是否正确运行了。对于同息,以检查它们是否正确运行了。对于同一类中方法之间的调用,一般只需要极少一类中方法之间的调用,一般只需要极少甚至不用附加数据,因为方法都是对类进甚至不用附加数据,因为方法都是对类进行存取,故这一类测试的准则是要求遍历行存取,故这一类测试的准则是要求遍历类的所有主要状态。类的所有主要状态。面向对象的白盒测试方法的综合测试 第二层要考虑一个白盒测试基本概念白盒测试基本概念1逻辑覆盖逻辑覆盖2基本路径测试基本路径测试3循环测试循环测试4面向对象的白盒测试面向对象的白盒测试5其他白盒测试方法简介其他白盒测试方法简介6主主要要内内容容第四章第四章白盒测试方法白盒测试方法白盒测试基本概念1逻辑覆盖2基本路径测试3循环测试4面向对象程程序序插插桩桩方方法法是是借借助助往往被被测测程程序序中中插插入入操操作作来来实实现现测测试试目目的的的的方方法法。该该法法是是软软件件动动态态测测试试中中的的一一种种基基本本测测试试手手段段,有有着广泛的应用。着广泛的应用。如如果果我我们们想想要要了了解解一一个个程程序序在在某某次次运运行行中中所所有有可可执执行行语语句句被被覆覆盖盖的的情情况况,或或是是每每个个语语句句的的实实际际执执行行次次数数,最最好好的的办办法法是利用插桩技术。是利用插桩技术。插插桩桩测测试试程序插桩方法是借助往被测程序中插入操作来实现测试目的的方法。语句覆盖测试用例课件桩桩1桩桩2桩桩3桩桩6桩桩4桩桩5桩1桩2桩3桩6桩4桩5程序插桩时需要着重考虑:程序插桩时需要着重考虑:1.探测哪些信息;探测哪些信息;2.在程序的什么部位设置探测点;在程序的什么部位设置探测点;3.需要设置多少个探测点。需要设置多少个探测点。程序插桩时需要着重考虑:域测试域测试(DomainTesting)域测试是一种基于程序结构的测试方法。域测试是一种基于程序结构的测试方法。Howden把程序中出现的错误分为域错误、计算型把程序中出现的错误分为域错误、计算型错误和丢失路径错误三种。错误和丢失路径错误三种。如果程序的控制流有错误,对于某一特定的输入如果程序的控制流有错误,对于某一特定的输入可能执行的是一条错误路径,这种错误称为路径可能执行的是一条错误路径,这种错误称为路径错误,也叫做域错误。错误,也叫做域错误。如果对于特定输入执行的是正确路径,但由于赋如果对于特定输入执行的是正确路径,但由于赋值语句的错误致使输出结果不正确,则称此为计值语句的错误致使输出结果不正确,则称此为计算型错误。算型错误。另外一类错误是丢失路径错误。另外一类错误是丢失路径错误。域测试(Domain Testing)域测试是主要针对域错误进行的程序测试。域测试是主要针对域错误进行的程序测试。域测试方法基于对输入空间的分析。域测试方法基于对输入空间的分析。测试的理想结果就是检验输入空间中的每一个输测试的理想结果就是检验输入空间中的每一个输入元素是否都产生正确的结果。入元素是否都产生正确的结果。域测试正是在分析输入域的基础上,选择适当的域测试正是在分析输入域的基础上,选择适当的测试点以后进行测试的。测试点以后进行测试的。域测试有两个致命的弱点:一是为进行域测试对域测试有两个致命的弱点:一是为进行域测试对程序提出的限制过多,二是当程序存在很多路径程序提出的限制过多,二是当程序存在很多路径时,所需的测试点也很多。时,所需的测试点也很多。域测试域测试(DomainTesting)域测试是主要针对域错误进行的程序测试。域测试(Domain 符号测试方法符号测试方法基本思想是允许程序的输入不仅仅是具体的数基本思想是允许程序的输入不仅仅是具体的数值数据,而且包括符号值,符号值可是基本符值数据,而且包括符号值,符号值可是基本符号变量值,也可是这些符号变量值的一个表达号变量值,也可是这些符号变量值的一个表达式。式。普通测试执行的是算术运算,符号测试则是执普通测试执行的是算术运算,符号测试则是执行代数运算。行代数运算。符号测试方法使用问题的关键在于开发出比传符号测试方法使用问题的关键在于开发出比传统的编译器功能更强,能够处理符号运算的编统的编译器功能更强,能够处理符号运算的编译器和解释器。译器和解释器。符号测试方法Z路径覆盖测试方法路径覆盖测试方法称简化循环意义下的路径覆盖为称简化循环意义下的路径覆盖为Z路径覆盖。路径覆盖。即无论循环的形式和实际执行循环体的次数多即无论循环的形式和实际执行循环体的次数多少,我们只考虑循环一次和零次两种情况。少,我们只考虑循环一次和零次两种情况。(a)(b)(c)Z路径覆盖测试方法(a)AnyQuestionsAny Questions
展开阅读全文