第5章1 白盒测试之逻辑覆盖.ppt_第1页
第5章1 白盒测试之逻辑覆盖.ppt_第2页
第5章1 白盒测试之逻辑覆盖.ppt_第3页
第5章1 白盒测试之逻辑覆盖.ppt_第4页
第5章1 白盒测试之逻辑覆盖.ppt_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章 白 盒 测 试,5.1 程序结构分析 5.2 逻辑覆盖 5.3 路径测试 5.4 数据流测试 5.5 其他白盒测试方法 5.6 本章小结,白盒测试,黑盒测试过程,5.1.2 程序的控制流图 控制流图是退化的程序流程图,图中每个处理都退化成一个节点,流线变成连接不同节点的有向弧。控制流图将程序流程图中结构化构件改用一般有向图的形式表示。在控制流图中用圆“”表示节点,一个圆代表一条或多条语句。程序流程图中的一个处理框序列或一个菱形判定框,可以映射成控制流图中的一个节点。控制流图中的箭头线称为边,它和程序流程图中的箭头线类似,代表控制流。将程序流程图简化成控制流图时,需要注意的是:在选择或多

2、分支结构中分支的汇聚处,即使没有执行语句也应该有一个汇聚节点。,在控制流图中,由边和节点围成的面积称为区域。需要注意的是:当计算区域数时,应该包括图外部未被围起来的那个区域。基本控制构造的图形符号如图5-1-1所示。,图5-1-1 基本控制流图的图形符号,程序和流图,void DoWork (int x, int y, int z) 1 int k=0,j=0; 2 if ( (x3) /语句块3 10 ,流程图及流图,将一个典型的程序流程图转换成控制流图,在图5-1-2中,我们给出了如何根据程序图绘制控制流图的例子。其中图(a)是一个含有两个出口判断和循环的程序流程图,我们把它简化成控制流图

3、的形式,如图(b)所示。其中、表示节点,e1、e2、e3、e4、e5、e6、e7、e8表示边,R1、R2、R3表示区域。,图5-1-2 程序流程图和控制流图,如果判定中的条件表达式是复合条件,即条件表达式是由一个或多个逻辑运算符(OR,AND,NAND,NOR)连接的逻辑表达式,则需要改复合条件的判定为一系列只有单个条件的嵌套的判定。,例如:对于下面代码所示的复合条件判定,其对应图的控制流图如图5-1-3所示。if (a | b) x+;else x-;条件语句if(a | b)中条件a和条件b各有一个只有单个条件的判定节点。,(a),(b),(c),图5-1-3 复合逻辑下的控制流图,1,2

4、,3,4,5,6,7,由于控制流图保留了控制流的全部轨迹,舍弃了各框的细节,因而画面简洁,路径清楚,用它来验证各种测试数据对程序执行路径的覆盖情况,比流程图更加方便。为了使控制流图在机器上表示,我们可以把控制流图表示成矩阵的形式,称为控制流图矩阵。在自动化测试中,导出控制流图和确定基本测试路径的过程均需要机械化,而图形矩阵的数据结构对此很有用。,定义9:有m个节点的控制流图矩阵,是一个mm矩阵,A=(a (i,j),其中a(i,j)是1,当且仅当从节点i到节点j有一条弧,否则该元素为0。图5-1-2的控制流图矩阵如表5-1-1所示。这个矩阵有7行7列,是由该控制图中7个节点决定的。矩阵中为“1

5、”的元素的位置决定了它们所连接节点的号码。例如,矩阵中处于第3行第4列的元素为“1”,那是因为在控制流图中从节点3到节点4有一条弧。这里必须注意方向,图中节点4到节点3没有弧,所以矩阵中第4行第3列也就没有元素。,图5-1-2 程序流程图和控制流图,在控制流图矩阵中,如果一行有两个或更多的元素为“1”,则这行所代表的节点一定是一个判定节点。通过判断连接矩阵中一行上有两个或两个以上元素为“1”的行的数目,就可以确定该图的圈复杂度。例如表5-1-1中,第2行和第3行分别有两个元素为“1”,因此它们是判定节点。控制流图的圈复杂度等于判定节点个数加一,通过控制流图矩阵可以得到它的判定节点为2,因此控制

6、流图的圈复杂度为3。,5.2 逻 辑 覆 盖逻辑覆盖测试(Logic Coverage Testing)是根据被测试程序的逻辑结构设计测试用例。逻辑覆盖测试考察的重点是图中的判定框。因为这些判定若不是与选择结构有关,就是与循环结构有关,是决定程序结构的关键成分。,为方便讨论,我们将结合一个Java小程序段加以说明: public void function(int a, int b, int c) if (a 1) ,图5-2-1 程序流程图,5.2.1 语句覆盖语句覆盖(Statement Coverage)是指在测试时设计若干个测试用例,运行被测试程序,使程序中的每条可执行语句至少执行一次

7、。这里所谓的“若干个”,当然是越少越好。在上述程序段中,我们如果选用的测试用例是:a = 5, b = 0, c = 6 CASE1则程序按路径ACE执行。这样该程序段的5个语句均得到执行,从而做到了语句覆盖。,但如果选用的测试用例是: a = 5, b = 1, c = 6 CASE2 则程序按路径ABE执行,语句c=c/a未执行,因此未能达到语句覆盖。若要做到语句覆盖则还需要设计一个测试用例,使其按ACD路径执行或按ACE路径执行。 为提高测试效率,我们在设计测试用例时应精心考虑测试数据的选取,尽量用较少的测试数据达到覆盖的要求。,从程序中每条语句都得到执行这一点来看,语句覆盖的方法似乎能

8、够比较全面地检验每一条语句,但它也存在一定的缺陷。语句覆盖仅仅针对程序逻辑中显式存在的语句,而对于隐藏的条件是无法测试的。语句覆盖对逻辑运算(如|和如果将其错写成:if (condition 0)x = a + b;假定给出的测试数据使执行该程序段时condition的值大于0,则x被赋予a + b的值,这样虽然做到了语句覆盖,然而却掩盖了其中的错误。,实际上,和后面介绍的其他几种逻辑覆盖比较起来,语句覆盖是比较弱的覆盖原则。 做到了语句覆盖可能给人们一种心理的满足,以为每个语句都经历过,似乎可以放心了。其实这仍然不是十分可靠的。 语句覆盖在测试被测程序中,除去对检查不可执行语句有一定作用外,

9、并没有排除被测程序包含错误的风险。,5.2.2 判定覆盖判定覆盖(Decision Coverage)的基本思想是,设计若干测试用例,运行被测试程序,使得程序中每个判断的取真分支和取假分支至少经历一次,即判断的真假值均曾被满足。判定覆盖又称为分支覆盖。仍以上述程序段为例,由于每个判定有两个分支,因此要达到判定覆盖至少需要两组测试用例。若选用的两组测试用例是:a = 5,b = 0,c = 6 CASE1a = 1,b = 0,c = 1 CASE3,则可分别执行路径ACE和ABD,从而使两个判断的4个分支C、E和B、D分别得到覆盖。当然,我们也可以选用另外两组测试用例:,a = 3,b = 0

10、,c = 2 CASE4 a = 5,b = 1,c = 2 CASE5,分别执行路径ACD及ABE,同样也可覆盖两个判定的真假分支。,我们注意到,上述两组测试用例不仅满足了判定覆盖,同时还做到了语句覆盖。从这一点可以看出判定覆盖具有比语句覆盖更强的测试能力。但判定覆盖也具有一定的局限性。在实际应用的程序中,往往大部分的判定语句是由多个逻辑条件组合而成(如:判定语句中包含and、or、case),若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。假设在此程序段中的第2个判断条件c1错写成了c1,使用上述测试用例CASE5,照样能按原路径执行(ABE)而不影响结果。这个

11、事实说明,只做到判定覆盖将无法确定判断内部条件的错误。,说明:以上仅考虑了两出口的判断,我们还应把判定覆盖准则扩充到多出口判断(如Case语句)的情况。因此,判定覆盖更为广泛的含义应该是使得每一个判定获得每一种可能的结果至少一次。如图5-2-2 所示的多出口判断,在这个图中,至少需要四个测试用例,才能达到判定覆盖。,图5-2-2 多出口判断,5.2.3 条件覆盖条件覆盖(Condition Coverage)的基本思想是,设计若干测试用例,执行被测程序以后,要使每个判断中每个条件的可能取值至少满足一次,即每个条件至少有一次为真值,有一次为假值。在上述程序段中,第一个判断应考虑到:a1取真值时,

12、记为T1;a1取假值时,即a1,记为F1;b = 0取真值时,记为T2;b = 0取假值时,即b0,记为F2。,第2个判断应考虑到:a = 5取真值时,记为T3;a = 5取假值时,即a5,记为F3;c1取真值时,记为T4;c1取假值时,即c1,记为F4。 我们使用条件覆盖设计的思想就是让测试用例能覆盖T1、T2、T3、T4、F1、F2、F3、F4这八种情况。下面给出三个测试用例:CASE6、CASE7、CASE8,执行该程序段所走路径及覆盖条件如表5-2-2所示。,从表中可以看到,三个测试用例把四个条件的八种情况均做了覆盖。进一步分析,测试用例覆盖了四个条件的八种情况,并把两个判断的四个分支

13、也覆盖了,这样我们是否可以说,做到了条件覆盖,也就必然实现了判定覆盖呢? 让我们来分析另一情况,假定选用两组测试用例是CASE8和CASE9,执行程序段的覆盖情况如表5-2-3所示。,这一覆盖情况表明,覆盖了条件的测试用例不一定覆盖了分支。事实上,它只覆盖了四个分支中的两个分支。条件覆盖只能保证每个条件的真值和假值至少满足一次,而不考虑所有的判定结果,因此做到了完全的条件覆盖并不能保证达到完全的判定覆盖。同理,做到了完全的判定覆盖也并不能保证达到了完全的条件覆盖。为了解决这一矛盾,需要对条件和分支兼顾。,5.2.4 判定-条件覆盖判定-条件覆盖(Decision-Condition Cover

14、age)的基本思想是将判定覆盖和条件覆盖结合起来,即设计足够的测试用例,使得判断条件中的每个条件的所有可能取值至少执行一次,并且每个判断本身的可能判定结果也至少执行一次。判定-条件覆盖实际上是将判定覆盖和条件覆盖结合起来的一种方法。按照判定-条件覆盖的要求,我们设计的测试用例要满足如下条件:(1) 所有条件的可能取值至少执行一次。(2) 所有判断的可能结果至少执行一次。本例中,我们可以设计两个测试用例来达到判定-条件覆盖,如表5-2-4所示。,从表面上看,判定-条件覆盖测试了各个判定中的所有条件的取值,但实际上,编译器在检查含有多个条件的逻辑表达式时,某些情况下的某些条件将会被其他条件所掩盖。

15、因此,判定-条件覆盖也不一定能够完全检查出逻辑表达式中的错误。,例如:对于条件表达式(a1)if (success)b-;,这两条语句实际只包括了两条执行路径,即success为真(success=true)时,对a和b进行处理,success为假(success=false)时,对a和b不处理。真和假不可能同时存在,而路径覆盖测试则认为是包含四条执行路径。这样不仅降低了测试效率,而且大量的测试结果的累积,也为排错带来麻烦。,其实,即使对路径数很小的程序做到了路径覆盖,仍然不能保证被测程序的正确性。例如:if (x = 5)x = x + y; 如果错写成:if (x 5)x = x + y;

16、 我们使用路径覆盖也发现不了其中的错误。,由此可以看出,采用任何一种覆盖方法都不能完全满足我们的要求,采用任何一种测试方法都不能保证程序的正确性。所以,在实际的测试用例设计过程中,可以根据需要将不同的覆盖方法组合起来使用,以实现最佳的测试用例设计。 一定要记住,测试的目的并非要证明程序的正确性,而是要尽可能找出程序中的错误。,对于比较简单的小程序,实现路径覆盖是可能做到的。但如果程序中出现较多判断和较多循环,可能的路径数目将会急剧增长,要在测试中覆盖所有的路径是无法实现的。为了解决这个难题,只有把覆盖路径数量压缩到一定的限度内,如程序中的循环体只执行一次。在实际测试中,即使对于路径数很有限的程

17、序已经做到路径覆盖,仍然不能保证被测试程序的正确性,还需要采用其他测试方法进行补充。结构性测试(白盒测试)是依据被测程序的逻辑结构设计测试用例,驱动被测程序运行完成的测试。结构性测试中的一个重要问题是,测试进行到什么程度时,可以结束测试了。这就是说需要给出结构性测试的覆盖准则。,5.2.7 案例使用逻辑覆盖测试方法测试以下程序段。 public void work(int x, int y, int z) 1 int k = 0, j = 0; 2 if (x 3) 说明:程序段中每行开头的数字(19)是对每条语句的编号。,图5-2-4 程序流程图和控制流图,1语句覆盖语句覆盖就是设计足够的测

18、试用例使程序中的每一条可执行语句至少执行一次。本例中,我们设计的用例只要保证两个if语句为真,则可以达到语句覆盖的要求。因此可以设计如下的测试用例:x=4、y=5、z=5。,2判定覆盖判定覆盖要求程序中每个判断的取真分支和取假分支至少经历一次。本例中,我们至少需要两组测试用例,分别覆盖两个if语句的真分支和假分支。选取的一组测试用例如下:x=4、y=5、z=5,其执行路径是:12345678。x=2、y=5、z=5,其执行路径是:12568。当然,我们选取的测试用例组并不是唯一结果。我们在选取测试用例时,在保证覆盖要求的情况下,应尽量选用测试用例数少的测试用例组。,3条件覆盖条件覆盖要求每个判断中每个条件的可能取值至少满足一次。本例中,一共有四个条件:x3;z5。我们设计测试用例使每个条件分别取真和取假。选取的一组测试用例如下:x=2、y=6、z=5,其执行路径是:125678。x=4、y=5、z=15,其执行路径是:125678。,4判定-条件覆盖判定-条件覆盖要求判断中每个条件的所有可能至少出现一次,并且每个判断本身的可能判定结果也至少出现一次。选取的一组测试用例如下:x=4、y=6、z=5,其执行路径是:12345678。x=2、y=5、z=15,其执行路径是:12568。,5条件组合覆盖条件组合覆盖要求每个判定的所有可能条件取值组合至

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论