《白盒测试及测试案例设计已经看》由会员分享,可在线阅读,更多相关《白盒测试及测试案例设计已经看(60页珍藏版)》请在金锄头文库上搜索。
1、A Free sample background from Slide 1第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计第第4章章 白盒测试及其用例的设计白盒测试及其用例的设计4.1 4.1 白盒测试方法白盒测试方法4.2 4.2 白盒测试的基本概念白盒测试的基本概念4.3 4.3 覆盖测试覆盖测试4.4 4.4 路径测试路径测试4.5 4.5 最少测试用例数计算最少测试用例数计算A Free sample background from Slide 2第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计本章教学目标本章教学目标理论环节理论环节理论环节理论环节n n学习理解白
2、盒测试方法的基本概念学习理解白盒测试方法的基本概念n n学习理解白盒测试的覆盖理论学习理解白盒测试的覆盖理论n n学习掌握白盒测试的路径表达学习掌握白盒测试的路径表达n n学习掌握白盒测试的基本路径测试法学习掌握白盒测试的基本路径测试法实践环节实践环节实践环节实践环节n n通过案例运用学习掌握覆盖问题的解决方法通过案例运用学习掌握覆盖问题的解决方法n n运用基本路径测试方法进行实际程序测试运用基本路径测试方法进行实际程序测试A Free sample background from Slide 3第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计4.1 白盒测试方法白盒测试方法n n为
3、什么要进行白盒测试?为什么要进行白盒测试? 如果所有软件错误的根源都可以追溯到某个唯一原因,如果所有软件错误的根源都可以追溯到某个唯一原因,那么问题就简单了。然而,事实上一个那么问题就简单了。然而,事实上一个bug bug 常常是由多个常常是由多个因素共同导致的,如下图所示。因素共同导致的,如下图所示。Return 假设此时开发工作已结束,程序假设此时开发工作已结束,程序送交到测试组,没有人知道代码中有送交到测试组,没有人知道代码中有一个潜在的被一个潜在的被 0 0 除的错误。若测试组除的错误。若测试组采用的测试用例的执行路径没有同时采用的测试用例的执行路径没有同时经过经过x=0x=0和和y=
4、5/xy=5/x进行测试,显然测试进行测试,显然测试工作似乎非常完善,测试用例覆盖了工作似乎非常完善,测试用例覆盖了所有执行语句,也没有被所有执行语句,也没有被 0 0 除的错误除的错误发生。发生。A Free sample background from Slide 4第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计白盒测试方法白盒测试方法(续)(续)n n白盒测试也称结构测试或逻辑驱动测试,是针对被测单元白盒测试也称结构测试或逻辑驱动测试,是针对被测单元内部是如何进行工作的测试。它根据程序的控制结构设计内部是如何进行工作的测试。它根据程序的控制结构设计测试用例,主要用于软件或程序
5、验证。测试用例,主要用于软件或程序验证。n n白盒测试法检查程序内部逻辑结构,对所有逻辑路径进行白盒测试法检查程序内部逻辑结构,对所有逻辑路径进行测试,是一种穷举路径的测试方法。测试,是一种穷举路径的测试方法。但但即使每条路径都测即使每条路径都测试过了,仍然可能存在错误。因为:试过了,仍然可能存在错误。因为:穷穷举举路路径径测测试试无无法法检检查查出出程程序序本本身身是是否否违违反反了了设设计计规规范范,即程序是否是一个错误的程序。即程序是否是一个错误的程序。穷举路径测试不可能查出程序因为遗漏路径而出错。穷举路径测试不可能查出程序因为遗漏路径而出错。穷举路径测试发现不了一些与数据相关的错误。穷
6、举路径测试发现不了一些与数据相关的错误。A Free sample background from Slide 5第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计白盒测试方法白盒测试方法(续)(续)n n采采用用白白盒盒测测试试方方法法必必须须遵遵循循以以下下几几条条原原则则,才才能能达达到到测试的目的:测试的目的:保证一个模块中的所有独立路径至少被测试一次。保证一个模块中的所有独立路径至少被测试一次。所有逻辑值均需测试真所有逻辑值均需测试真 (true) (true) 和假和假 (false) (false) 两种情况。两种情况。检查程序的内部数据结构,保证其结构的有效性。检查程序
7、的内部数据结构,保证其结构的有效性。在上下边界及可操作范围内运行所有循环。在上下边界及可操作范围内运行所有循环。n n白白盒盒测测试试主主要要是是检检查查程程序序的的内内部部结结构构、逻逻辑辑、循循环环和和路径。常用测试用例设计方法有:路径。常用测试用例设计方法有:逻辑覆盖法(逻辑驱动测试)逻辑覆盖法(逻辑驱动测试)基本路径测试方法基本路径测试方法A Free sample background from Slide 6第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计4.2 白盒测试的基本概念白盒测试的基本概念4.2.1 4.2.1 控制流图控制流图4.2.2 4.2.2 环形复杂度
8、环形复杂度4.2.3 4.2.3 图矩阵图矩阵ReturnA Free sample background from Slide 7第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计4.2.1 控制流图控制流图n n控制流图(可简称流图)是对程序流程图进行简化后得到控制流图(可简称流图)是对程序流程图进行简化后得到的,它可以更加突出的表示程序控制流的结构。的,它可以更加突出的表示程序控制流的结构。n n控制流图中包括两种图形符号:节点和控制流线。控制流图中包括两种图形符号:节点和控制流线。节点由带标号的圆圈表示,可代表一个或多个语句、一个节点由带标号的圆圈表示,可代表一个或多个语句、一
9、个处理框序列和一个条件判定框(假设不包含复合条件)。处理框序列和一个条件判定框(假设不包含复合条件)。控制流线由带箭头的弧或线表示,可称为边。它代表程序控制流线由带箭头的弧或线表示,可称为边。它代表程序中的控制流。中的控制流。n n对于复合条件,则可将其分解为多个单个条件,并映射成对于复合条件,则可将其分解为多个单个条件,并映射成控制流图。控制流图。常见结构的控制流图常见结构的控制流图A Free sample background from Slide 9第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计4.2.2 环形复杂度环形复杂度n n环形复杂度也称为圈复杂度,它是一种为程序逻
10、辑复杂度环形复杂度也称为圈复杂度,它是一种为程序逻辑复杂度提供定量尺度的软件度量。提供定量尺度的软件度量。n n环形复杂度的应用环形复杂度的应用可以将环形复杂度用于基本路径方可以将环形复杂度用于基本路径方法,它可以提供:程序基本集的独立路径数量;确保所有法,它可以提供:程序基本集的独立路径数量;确保所有语句至少执行一次的测试数量的上界。语句至少执行一次的测试数量的上界。独立路径是指程序中至少引入了一个新的处理语句集合或独立路径是指程序中至少引入了一个新的处理语句集合或一个新条件的程序通路。一个新条件的程序通路。采用流图的术语,即独立路径必采用流图的术语,即独立路径必须至少包含一条在本次定义路径
11、之前不曾用过的边。须至少包含一条在本次定义路径之前不曾用过的边。n n测试可以被设计为基本路径集的执行过程,但基本路径集测试可以被设计为基本路径集的执行过程,但基本路径集通常并不唯一。通常并不唯一。 A Free sample background from Slide 10第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计计算环形复杂度的方法计算环形复杂度的方法n n环形复杂度以图论为基础,为我们提供了非常有用的软件环形复杂度以图论为基础,为我们提供了非常有用的软件度量。可用如下三种方法之一来计算环形复杂度:度量。可用如下三种方法之一来计算环形复杂度:控制流图中区域的数量对应于环形复
12、杂度。控制流图中区域的数量对应于环形复杂度。给定控制流图给定控制流图GG的环形复杂度的环形复杂度V(G)V(G),定义为定义为 V(G) = E-N+2 V(G) = E-N+2 其中,其中,E E是控制流图中边的数量,是控制流图中边的数量,N N是控制流图中的节点是控制流图中的节点数量。数量。给定控制流图给定控制流图GG的环形复杂度的环形复杂度V(G)V(G),也可定义为也可定义为 V(G) = P+1 V(G) = P+1 其中,其中,P P是控制流图是控制流图GG中判定节点的数量。中判定节点的数量。A Free sample background from Slide 11第四章第四章
13、白盒测试及其用例的设计白盒测试及其用例的设计4.2.3 图矩阵图矩阵n n图矩阵是控制流图的矩阵表示形式。图矩阵是控制流图的矩阵表示形式。n n图图矩阵是一个方形矩阵,矩阵是一个方形矩阵,其维数等于控制流图的节点数。其维数等于控制流图的节点数。矩阵中的矩阵中的每列和每行都对应于标识的节点,矩阵元素对应每列和每行都对应于标识的节点,矩阵元素对应于节点间的边。于节点间的边。n n通常,控制流图中的结点用数字标识,边则用字母标识。通常,控制流图中的结点用数字标识,边则用字母标识。如果在控制流图中从第如果在控制流图中从第 i i 个结点到第个结点到第 j j 个结点有一个标识个结点有一个标识为为 x
14、x 的边相连接,则在对应图矩阵的第的边相连接,则在对应图矩阵的第 i i 行第行第 j j 列有一个列有一个非空的元素非空的元素 x x 。A Free sample background from Slide 12第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计习题习题n n根据左图给出的程序流程图,根据左图给出的程序流程图,完成以下要求:完成以下要求:(1 1)画出相应的控制流图。)画出相应的控制流图。(2 2)计算环形复杂度。)计算环形复杂度。(3 3)给出相应的图矩阵。)给出相应的图矩阵。(4 4)找出程序的独立路径集合。)找出程序的独立路径集合。A Free sample
15、background from Slide 13第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计4.3 覆盖测试覆盖测试4.3.1 4.3.1 测试覆盖率测试覆盖率4.3.2 4.3.2 逻辑覆盖法逻辑覆盖法4.3.3 4.3.3 面向对象的覆盖面向对象的覆盖4.3.4 4.3.4 测试覆盖准则测试覆盖准则ReturnA Free sample background from Slide 14第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计4.3.1 测试覆盖率测试覆盖率n n测试覆盖率:用于确定测试所执行到的覆盖项的百分比。测试覆盖率:用于确定测试所执行到的覆盖项的百分比
16、。其中的覆盖项是指作为测试基础的一个入口或属性,比如其中的覆盖项是指作为测试基础的一个入口或属性,比如语句、分支、条件等。语句、分支、条件等。n n测试覆盖率可以表示出测试的充分性,在测试分析报告中测试覆盖率可以表示出测试的充分性,在测试分析报告中可以作为量化指标的依据,测试覆盖率越高效果越好。但可以作为量化指标的依据,测试覆盖率越高效果越好。但覆盖率不是目标,只是一种手段。覆盖率不是目标,只是一种手段。 n n测试覆盖率包括功能点覆盖率和结构覆盖率:测试覆盖率包括功能点覆盖率和结构覆盖率:功能点覆盖率大致用于表示软件已经实现的功能与软件需功能点覆盖率大致用于表示软件已经实现的功能与软件需要实
17、现的功能之间的比例关系。要实现的功能之间的比例关系。结构覆盖率包括语句覆盖率、分支覆盖率、循环覆盖率、结构覆盖率包括语句覆盖率、分支覆盖率、循环覆盖率、路径覆盖率等等。路径覆盖率等等。A Free sample background from Slide 15第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计4.3.2 逻辑覆盖法逻辑覆盖法n n根据覆盖目标的不同,逻辑覆盖又可分为语句覆盖、判定根据覆盖目标的不同,逻辑覆盖又可分为语句覆盖、判定覆盖、条件覆盖、判定覆盖、条件覆盖、判定/ /条件覆盖、组合覆盖和路径覆盖。条件覆盖、组合覆盖和路径覆盖。语句覆盖:选择足够多的测试用例,使得程
18、序中的每个可语句覆盖:选择足够多的测试用例,使得程序中的每个可执行语句至少执行一次。执行语句至少执行一次。判定覆盖:通过执行足够的测试用例,使得程序中的每个判定覆盖:通过执行足够的测试用例,使得程序中的每个判定至少都获得一次判定至少都获得一次“ “真真” ”值和值和“ “假假” ”值,值, 也就是使程序也就是使程序中的每个取中的每个取“ “真真” ”分支和取分支和取“ “假假” ”分支至少均经历一次,分支至少均经历一次,也称为也称为“ “分支覆盖分支覆盖” ”。条件覆盖:设计足够多的测试用例,使得程序中每个判定条件覆盖:设计足够多的测试用例,使得程序中每个判定包含的每个条件的可能取值(真包含的
19、每个条件的可能取值(真/ /假)都至少满足一次。假)都至少满足一次。A Free sample background from Slide 16第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计逻辑覆盖法逻辑覆盖法(续)(续)判定判定/ /条件覆盖:设计足够多的测试用例,使得程序中每条件覆盖:设计足够多的测试用例,使得程序中每个判定包含的每个条件的所有情况(真个判定包含的每个条件的所有情况(真/ /假)至少出现一次,假)至少出现一次,并且每个判定本身的判定结果(真并且每个判定本身的判定结果(真/ /假)也至少出现一次。假)也至少出现一次。 满足判定满足判定/ /条件覆盖的测试用例一定同
20、时满足判定覆盖条件覆盖的测试用例一定同时满足判定覆盖和条件覆盖。和条件覆盖。组合覆盖:通过执行足够的测试用例,使得程序中每个判组合覆盖:通过执行足够的测试用例,使得程序中每个判定的所有可能的条件取值组合都至少出现一次。定的所有可能的条件取值组合都至少出现一次。 满足组合覆盖的测试用例一定满足判定覆盖、条件覆满足组合覆盖的测试用例一定满足判定覆盖、条件覆盖和判定盖和判定/ /条件覆盖。条件覆盖。路径覆盖:设计足够多的测试用例,要求覆盖程序中所有路径覆盖:设计足够多的测试用例,要求覆盖程序中所有可能的路径。可能的路径。 A Free sample background from Slide 17第
21、四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计逻辑覆盖法逻辑覆盖法(续)(续)组合覆盖判断/条件覆盖判断覆盖条件覆盖语句覆盖A Free sample background from Slide 18第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计逻辑覆盖法逻辑覆盖法(续)(续)void void DoWorkDoWork ( (intint x,intx,int y,inty,int z) z) intint k=0,j=0; k=0,j=0; if ( (x3)&(z3)&(z5) ) if ( (x=4)|(y5) ) j=x*y+10; j=x*y+10; / /语
22、句块语句块2 2 j=j%3; /j=j%3; /语句块语句块3 3 A Free sample background from Slide 19第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计逻辑覆盖法逻辑覆盖法(续)(续)X3 & z5执行语句块执行语句块3FFTTabdceA Free sample background from Slide 20第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计语句覆盖语句覆盖n n要实现要实现DoWorkDoWork函数的语句覆盖,只需设计一个测试用例函数的语句覆盖,只需设计一个测试用例就可以覆盖程序中的所有可执行语句。就可以覆盖程
23、序中的所有可执行语句。测试用例输入为:测试用例输入为: x=4x=4、y=5y=5、z=5 z=5 程序执行的路径是:程序执行的路径是:abdabdn n分析:分析: 语句覆盖可以保证程序中的每个语句都得到执行,但语句覆盖可以保证程序中的每个语句都得到执行,但发现不了判定中逻辑运算的错误,即它并不是一种充分的发现不了判定中逻辑运算的错误,即它并不是一种充分的检验方法。例如在第一个判定检验方法。例如在第一个判定(x3)&(z3)&(z5y5错误写为错误写为y5y3)&(z3)&(z3 x3 取真值记为取真值记为T1T1,取假值记为取假值记为- -T1T1 条件条件z10 z5) )( (x=4)
24、|(y5) ): 条件条件x=4 x=4 取真值记为取真值记为T3T3,取假值记为取假值记为- -T3 T3 条件条件y5 y5 取真值记为取真值记为T4T4,取假值记为取假值记为- -T4T4A Free sample background from Slide 24第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计条件覆盖条件覆盖(续)(续)n n根据条件覆盖的基本思想,要使上述根据条件覆盖的基本思想,要使上述4 4个条件可能产生的个条件可能产生的8 8种情况至少满足一次,设计测试用例如下:种情况至少满足一次,设计测试用例如下: 测试用例测试用例 执行路径执行路径 覆盖条件覆盖条件
25、 覆盖分支覆盖分支 x=4 x=4、y=6y=6、z=5 z=5 abdabd T1 T1、T2T2、T3T3、T4 T4 bdbd x=2 x=2、y=5y=5、 z=15 z=15 aceace - -T1T1、-T2-T2、 -T3 -T3、-T4 -T4 cecen n分析:上面这组测试用例不但覆盖了分析:上面这组测试用例不但覆盖了4 4个条件的全部个条件的全部8 8种种情况,而且将两个判定的情况,而且将两个判定的4 4个分支个分支b b、c c、d d、e e也同时覆盖也同时覆盖了,即同时达到了条件覆盖和判定覆盖。了,即同时达到了条件覆盖和判定覆盖。A Free sample bac
26、kground from Slide 25第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计条件覆盖条件覆盖(续)(续)n n说明:虽然前面的一组测试用例同时达到了条件覆盖和判说明:虽然前面的一组测试用例同时达到了条件覆盖和判定覆盖,但是,并不是说满足条件覆盖就一定能满足判定定覆盖,但是,并不是说满足条件覆盖就一定能满足判定覆盖。如果设计了下表中的这组测试用例,则虽然满足了覆盖。如果设计了下表中的这组测试用例,则虽然满足了条件覆盖,但只是覆盖了程序中第一个判定的取假分支条件覆盖,但只是覆盖了程序中第一个判定的取假分支c c 和第二个判定的取真分支和第二个判定的取真分支d d,不满足判定
27、覆盖的要求。,不满足判定覆盖的要求。 测试用例测试用例 执行路径执行路径 覆盖条件覆盖条件覆盖分支覆盖分支x=2x=2、y=6y=6、z=5 z=5 acdacd- -T1T1、T2T2、 -T3 -T3、T4 T4 cdcdx=4x=4、y=5y=5、z=15 z=15 acdacdT1T1、-T2-T2、 T3 T3、-T4 -T4 cdcdA Free sample background from Slide 26第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计判定判定/条件覆盖条件覆盖n n判定判定/ /条件覆盖实际上是将判定覆盖和条件覆盖结合起来条件覆盖实际上是将判定覆盖和
28、条件覆盖结合起来的一种方法,即:设计足够的测试用例,使得判定中每个的一种方法,即:设计足够的测试用例,使得判定中每个条件的所有可能取值至少满足一次,同时每个判定的可能条件的所有可能取值至少满足一次,同时每个判定的可能结果也至少出现一次。结果也至少出现一次。n n根据判定根据判定/ /条件覆盖的基本思想,只需设计以下两个测试条件覆盖的基本思想,只需设计以下两个测试用例便可以覆盖用例便可以覆盖4 4个条件的个条件的8 8种取值以及种取值以及4 4个判定分支。个判定分支。 测试用例测试用例 执行路径执行路径 覆盖条件覆盖条件覆盖分支覆盖分支x=4x=4、y=6y=6、z=5 z=5 abdabdT1
29、T1、T2T2、 T3 T3、T4 T4 bdbdx=2x=2、y=5y=5、z=15z=15aceace- -T1T1、-T2-T2、 -T3 -T3、-T4 -T4 ceceA Free sample background from Slide 27第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计判定判定/条件覆盖条件覆盖(续)(续)n n分析:从表面上看,判定分析:从表面上看,判定/ /条件覆盖测试了各个判定中的条件覆盖测试了各个判定中的所有条件的取值,但实际上,编译器在检查含有多个条件所有条件的取值,但实际上,编译器在检查含有多个条件的逻辑表达式时,某些情况下的某些条件将会被
30、其它条件的逻辑表达式时,某些情况下的某些条件将会被其它条件所掩盖。因此,判定所掩盖。因此,判定/ /条件覆盖也不一定能够完全检查出条件覆盖也不一定能够完全检查出逻辑表达式中的错误。逻辑表达式中的错误。 例如:对于第一个判定例如:对于第一个判定( (x3)&(z3)&(z3x3和和z10z3x3为假,则编译器将不再检查为假,则编译器将不再检查z10z5)(x=4)|(y5)来来说,若条件说,若条件x=4x=4满足,就认为该判定为真,这时将不会再满足,就认为该判定为真,这时将不会再检查检查y5y5,那么同样也无法发现这个条件中的错误。,那么同样也无法发现这个条件中的错误。A Free sample
31、 background from Slide 28第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计组合覆盖组合覆盖n n组合覆盖的目的是要使设计的测试用例能覆盖每一个判定组合覆盖的目的是要使设计的测试用例能覆盖每一个判定的所有可能的条件取值组合。的所有可能的条件取值组合。n n对对DoWorkDoWork函数中的各个判定的条件取值组合加以标记:函数中的各个判定的条件取值组合加以标记: 1 1、x3, z3, z3, z=10 x3, z=10 记做记做T1 -T2T1 -T2,第一个判定的取假分支第一个判定的取假分支 3 3、x=3, z10 x=3, z10 记做记做- -T1 T
32、2T1 T2,第一个判定的取假分支第一个判定的取假分支 4 4、x=10 x=10 记做记做- -T1 -T2T1 -T2,第一个判定的取假分支第一个判定的取假分支 5 5、x=4, y5 x=4, y5 记做记做T3 T4T3 T4,第二个判定的取真分支第二个判定的取真分支 6 6、x=4, y=5 x=4, y5 x!=4, y5 记做记做- -T3 T4T3 T4,第二个判定的取真分支第二个判定的取真分支 8 8、x!=4, y=5 x!=4, y8 AND Y5X0 OR Y0引用语句1引用语句2NYNYX16 OR Y10引用语句3NYA Free sample background
33、 from Slide 33第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计4.3.3 面向对象的覆盖面向对象的覆盖n n继承上下文覆盖继承上下文覆盖继承上下文覆盖继承上下文覆盖由于传统的结构化度量没有考虑面向对象的一些特性(如由于传统的结构化度量没有考虑面向对象的一些特性(如多态、继承和封装等),所以在面向对象领域,传统的结多态、继承和封装等),所以在面向对象领域,传统的结构化覆盖必须被加强,以满足面向对象特性。构化覆盖必须被加强,以满足面向对象特性。继承上下文覆盖考虑在每个类的上下文内获得的覆盖率级继承上下文覆盖考虑在每个类的上下文内获得的覆盖率级别。它是扩展到面向对象领域里的一
34、种覆盖率度量方法,别。它是扩展到面向对象领域里的一种覆盖率度量方法,用于度量在系统中的多态调用被测试得多好。用于度量在系统中的多态调用被测试得多好。继承上下文定义将基类上下文内例行程序的执行作为独立继承上下文定义将基类上下文内例行程序的执行作为独立于继承类上下文内例行程序的执行。同样,它们在考虑继于继承类上下文内例行程序的执行。同样,它们在考虑继承类上下文内例行程序的执行也独立于基类上下文内例行承类上下文内例行程序的执行也独立于基类上下文内例行程序的执行。为了获得程序的执行。为了获得100100继承上下文覆盖,代码必须继承上下文覆盖,代码必须在每个适当的上下文内被完全执行。在每个适当的上下文内
35、被完全执行。 A Free sample background from Slide 34第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计面向对象的覆盖面向对象的覆盖(续)(续)n n基于状态的上下文覆盖基于状态的上下文覆盖基于状态的上下文覆盖基于状态的上下文覆盖在绝大多数面向对象的系统中存在这样的一些类:这些类在绝大多数面向对象的系统中存在这样的一些类:这些类的对象可以存在于众多不同状态中的任何一种,并且由于的对象可以存在于众多不同状态中的任何一种,并且由于类的行为依赖于状态,每个类的行为在每个可能的状态中类的行为依赖于状态,每个类的行为在每个可能的状态中其性质是不同的。其性质是不
36、同的。基于状态的上下文覆盖对应于被测类对象的潜在状态。基于状态的上下文覆盖对应于被测类对象的潜在状态。这样基于状态的上下文覆盖把一个状态上下文内的一个例这样基于状态的上下文覆盖把一个状态上下文内的一个例行程序的执行认为是独立于另一个状态内相同例行程序的行程序的执行认为是独立于另一个状态内相同例行程序的执行。为了达到执行。为了达到100100的基于状态的上下文覆盖,例行程的基于状态的上下文覆盖,例行程序必须在每个适当的上下文(状态)内被执行。序必须在每个适当的上下文(状态)内被执行。A Free sample background from Slide 35第四章第四章 白盒测试及其用例的设计白
37、盒测试及其用例的设计4.3.4 测试覆盖准则测试覆盖准则n n逻辑覆盖的出发点是合理的、完善的。所谓逻辑覆盖的出发点是合理的、完善的。所谓“ “覆盖覆盖” ”,就是,就是想要做到全面而无遗漏,但逻辑覆盖并不能真正做到无遗漏。想要做到全面而无遗漏,但逻辑覆盖并不能真正做到无遗漏。n n例如:我们不小心将前面提到的程序段中的例如:我们不小心将前面提到的程序段中的 if (x3 & Z3 & Z=3 & Z=3 & Z10) 按照我们前面设计的测试用例(按照我们前面设计的测试用例(x x的值取的值取2 2或或4 4)来看,)来看,逻辑覆盖对这样的小问题都无能为力。分析出现这一情况的逻辑覆盖对这样的小
38、问题都无能为力。分析出现这一情况的原因在于:错误区域仅仅在原因在于:错误区域仅仅在x=3x=3这个点上,即仅当这个点上,即仅当x x的值取的值取3 3时,测试才能发现错误。面对这类情况,我们应该从中吸取时,测试才能发现错误。面对这类情况,我们应该从中吸取的教训是测试工作要有重点,要多针对容易发生问题的地方的教训是测试工作要有重点,要多针对容易发生问题的地方设计测试用例。设计测试用例。A Free sample background from Slide 36第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计测试覆盖准则测试覆盖准则(续)(续)n nESTCAESTCA覆盖准则:覆盖准则
39、:在容易发生问题的地方设计测试用例,在容易发生问题的地方设计测试用例,即重视程序中谓词(条件判断)的取值。即重视程序中谓词(条件判断)的取值。n nESTCAESTCA覆盖准则覆盖准则是一套错误敏感用例分析规则。这一规则是一套错误敏感用例分析规则。这一规则虽然并不完备,但在普通程序中却是有效的。原因在于这虽然并不完备,但在普通程序中却是有效的。原因在于这是一种经验型的覆盖准则,规则本身针对了程序编写人员是一种经验型的覆盖准则,规则本身针对了程序编写人员容易发生的错误,或是围绕着发生错误的频繁区域,从而容易发生的错误,或是围绕着发生错误的频繁区域,从而提高了发现错误的命中率。具体规则如下:提高了
40、发现错误的命中率。具体规则如下: 规则规则1 1 对于对于A A relrel B B型型 ( (relrel可以是可以是 ) ) 的分支谓词,的分支谓词,应适当的选择应适当的选择A A与与B B的值,使得测试执行到该分支语句时,的值,使得测试执行到该分支语句时,ABABAB的情况分别出现一次。的情况分别出现一次。 这是为了检测逻辑符号写错的情况,如将这是为了检测逻辑符号写错的情况,如将“ “AB”AB”AB”。A Free sample background from Slide 37第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计测试覆盖准则测试覆盖准则(续)(续) 规则规则2
41、2 对于对于A A relrel C C型型 ( (relrel可以是可以是 或或, , A A是变量,是变量,C C是常量是常量) )的分支谓词:当的分支谓词:当relrel为为 时,应适当的选择时,应适当的选择A A的值,使的值,使A=C+MA=C+M。 这是为了检测这是为了检测“ “差差1”1”之类的错误,如之类的错误,如“ “A1”A1”错写成错写成“ “A0”A0”。 规则规则3 3 对外部输入变量赋值,使其在每一个测试用例中均对外部输入变量赋值,使其在每一个测试用例中均有不同的值与符号,并与同一组测试用例中其他变量的值与有不同的值与符号,并与同一组测试用例中其他变量的值与符号不同。
42、符号不同。 这是为了检测程序语句中的错误,如应该引用某一变量这是为了检测程序语句中的错误,如应该引用某一变量而错成引用另一个常量。而错成引用另一个常量。A Free sample background from Slide 38第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计测试覆盖准则测试覆盖准则(续)(续)n n关于关于LCSAJLCSAJLCSAJ (LCSAJ (Linear Code Sequence and JumpLinear Code Sequence and Jump) ) 的字面含义是的字面含义是线性代码序列与跳转。在程序中,一个线性代码序列与跳转。在程序中,一个
43、LCSAJLCSAJ是一组顺序是一组顺序执行的代码,以控制跳转为其结束点。执行的代码,以控制跳转为其结束点。LCSAJLCSAJ的起点是根据程序本身决定的。它的起点可以是程的起点是根据程序本身决定的。它的起点可以是程序第一行或转移语句的入口点,或是控制流可跳达的点。序第一行或转移语句的入口点,或是控制流可跳达的点。如果有几个如果有几个LCSAJLCSAJ首尾相接,且第一个首尾相接,且第一个LCSAJLCSAJ起点为程序起点为程序起点,最后一个起点,最后一个LCSAJLCSAJ终点为程序终点,这样的终点为程序终点,这样的LCSAJLCSAJ串串就组成了程序的一条路径(就组成了程序的一条路径(LC
44、SAJLCSAJ路径)。一条路径)。一条LCSAJLCSAJ程程序路径可能是由序路径可能是由2 2个、个、3 3个或多个个或多个LCSAJLCSAJ组成的。组成的。A Free sample background from Slide 39第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计测试覆盖准则测试覆盖准则(续)(续)n n基于基于LCSAJLCSAJ与路径的关系,提出了层次与路径的关系,提出了层次LCSAJLCSAJ覆盖准则。覆盖准则。它是一个分层的覆盖准则,可以概括的描述为:它是一个分层的覆盖准则,可以概括的描述为:第一层第一层 语句覆盖。语句覆盖。第二层第二层 分支覆盖。分
45、支覆盖。第三层第三层 LCSAJLCSAJ覆盖,即程序中的每一个覆盖,即程序中的每一个LCSAJLCSAJ都至少都至少在测试中经历过一次。在测试中经历过一次。第四层第四层 两两两两LCSAJLCSAJ覆盖,即程序中的每两个相连的覆盖,即程序中的每两个相连的LCSAJLCSAJ组合起来在测试中都要经历一次。组合起来在测试中都要经历一次。第第n+2n+2层层 每每n n个首尾相连的个首尾相连的LCSAJLCSAJ组合在测试中都要经组合在测试中都要经历一次。历一次。 n n在实施测试时,若要实现上述的层次在实施测试时,若要实现上述的层次LCSAJLCSAJ覆盖,需要产覆盖,需要产生被测程序的所有生被
46、测程序的所有LCSAJLCSAJ。A Free sample background from Slide 40第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计测试覆盖准则测试覆盖准则(续)(续)n n例:找出前面例:找出前面DoWorkDoWork函数的所有函数的所有LCSAJLCSAJ和和LCSAJLCSAJ路径。路径。LCSAJLCSAJ(5 5个):个): (1 1)intint k=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
47、+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)A Free sample background from Slide 41第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计4.4 路径测试路径测试4.4.1 4.4.1 路径表达式路径表达式4.4.2 4.4.2 基本路径测试方法基本路径测试方法4.4.3 4.4.3 循环测试方
48、法循环测试方法4.4.4 4.4.4 产生测试用例产生测试用例ReturnA Free sample background from Slide 42第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计4.4.1 路径表达式路径表达式n n为了满足路径覆盖,必须首先确定具体的路径以及路径的为了满足路径覆盖,必须首先确定具体的路径以及路径的个数。我们通常采用控制流图的边(弧)序列和节点序列个数。我们通常采用控制流图的边(弧)序列和节点序列表示某一条具体路径,更为概括的表示方法为表示某一条具体路径,更为概括的表示方法为:(1 1)弧弧a a和和弧弧b b相相乘乘,表表示示为为abab,它它表
49、表明明路路径径是是先先经经历历弧弧a a,接着再经历弧接着再经历弧b b,弧弧a a和弧和弧b b是先后相接的。是先后相接的。(2 2)弧弧a a和和弧弧b b相相加加,表表示示为为a+ba+b,它它表表明明两两条条弧弧是是“ “或或” ”的的关系,是并行的路段。关系,是并行的路段。n n路径数的计算:路径数的计算: 在路径表达式中,将所有弧均以数值在路径表达式中,将所有弧均以数值1 1来代替,再进来代替,再进行表达式的相乘和相加运算,最后得到的数值即为该程序行表达式的相乘和相加运算,最后得到的数值即为该程序的路径数。的路径数。A Free sample background from Sli
50、de 43第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计4.4.2 基本路径测试方法基本路径测试方法n n路径测试就是从一个程序的入口开始,执行所经历的各个路径测试就是从一个程序的入口开始,执行所经历的各个语句的完整过程。从广义的角度讲,任何有关路径分析的语句的完整过程。从广义的角度讲,任何有关路径分析的测试都可以被称为路径测试。测试都可以被称为路径测试。n n完成路径测试的理想情况是做到路径覆盖,但对于复杂性完成路径测试的理想情况是做到路径覆盖,但对于复杂性大的程序要做到所有路径覆盖(测试所有可执行路径)是大的程序要做到所有路径覆盖(测试所有可执行路径)是不可能的。不可能的。n
51、n在不能做到所有路径覆盖的前提下,如果某一程序的每一在不能做到所有路径覆盖的前提下,如果某一程序的每一个独立路径都被测试过,那么可以认为程序中的每个语句个独立路径都被测试过,那么可以认为程序中的每个语句都已经检验过了,即达到了语句覆盖。这种测试方法就是都已经检验过了,即达到了语句覆盖。这种测试方法就是通常所说的基本路径测试方法。通常所说的基本路径测试方法。 A Free sample background from Slide 44第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计基本路径测试方法基本路径测试方法(续)(续)n n基本路径测试方法是在控制流图的基础上,通过分析控制基本路
52、径测试方法是在控制流图的基础上,通过分析控制结构的环形复杂度,导出执行路径的基本集,再从该基本结构的环形复杂度,导出执行路径的基本集,再从该基本集设计测试用例。基本路径测试方法包括以下集设计测试用例。基本路径测试方法包括以下4 4个步骤:个步骤:(1 1)画出程序的控制流图。)画出程序的控制流图。(2 2)计算程序的环形复杂度,导出程序基本路径集中的独立)计算程序的环形复杂度,导出程序基本路径集中的独立路径条数,这是确定程序中每个可执行语句至少执行一次路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。所必须的测试用例数目的上界。(3 3)导出基本路径集,确定程序的独
53、立路径。)导出基本路径集,确定程序的独立路径。(4 4)根据()根据(3 3)中的独立路径,设计测试用例的输入数据和)中的独立路径,设计测试用例的输入数据和预期输出。预期输出。A Free sample background from Slide 45第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计基本路径测试方法基本路径测试方法(续)(续)void Sort ( int iRecordNum, int iType )1 2 int x=0;3 int y=0;4 while ( iRecordNum- 0 )5 6 If ( iType=0 )7x=y+2;8 else9 If (
54、 iType=1 )10 x=y+10;11 else12 x=y+20;13 14 A Free sample background from Slide 46第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计基本路径测试方法基本路径测试方法(续)(续)n n画出控制流图:画出控制流图: 如右图所示如右图所示n n计算环形复杂度:计算环形复杂度: 1010(条边)(条边)- 8- 8(个节点)(个节点)+ 2 = 4+ 2 = 4n n导出独立路径(用语句编号表示)导出独立路径(用语句编号表示) 路径路径1 1:414414 路径路径2 2:4671446714 路径路径3 3:46
55、910134144691013414 路径路径4 4:46912134144691213414467910121314A Free sample background from Slide 47第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计基本路径测试方法基本路径测试方法(续)(续)输入数据输入数据预期输出预期输出测试用例测试用例1 1irecordnumirecordnum = 0 = 0itypeitype = 0 = 0x = 0x = 0y = 0y = 0测试用例测试用例2 2irecordnumirecordnum = = 1 1itypeitype = 0 = 0x
56、= 0x = 0y = 0y = 0测试用例测试用例3 3irecordnumirecordnum = = 1 1itypeitype = = 1 1x = x = 1 10 0y = 0y = 0测试用例测试用例4 4irecordnumirecordnum = = 1 1itypeitype = = 2 2x = 0x = 0y = y = 2 20 0n n设计测试用例:设计测试用例:A Free sample background from Slide 48第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计习题习题1 1、使用基本路径测试方法,为以下程序段设计测试用例。、使用基
57、本路径测试方法,为以下程序段设计测试用例。 void Do (int X,int A,int B) void Do (int X,int A,int B) 1 if ( (A1)&(B=0) ) 1 if ( (A1)&(B=0) ) 2 X = X/A; 2 X = X/A; 3 if ( (A=2)|(X1) ) 3 if ( (A=2)|(X1) ) 4 X = X+1; 4 X = X+1; 5 5 2 2、在三角形问题中,要求输入三个边长:、在三角形问题中,要求输入三个边长:a a,b b,c c。当三边。当三边不可能构成三角形时提示错误,可构成三角形时计算三角不可能构成三角形时提示
58、错误,可构成三角形时计算三角形的周长。若是等腰三角形打印形的周长。若是等腰三角形打印“ “等腰三角形等腰三角形” ”,若是等,若是等边三角形,则打印边三角形,则打印“ “等边三角形等边三角形” ”。画出相应的程序流程。画出相应的程序流程图,并采用图,并采用基本路径测试方法为该程序设计测试用例。基本路径测试方法为该程序设计测试用例。A Free sample background from Slide 49第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计4.4.3 循环测试方法循环测试方法n n从本质上说,循环测试的目的就是检查循环从本质上说,循环测试的目的就是检查循环结构的有效性。结
59、构的有效性。n n通常,循环可以划分为简单循环、嵌套循环、串接循环和通常,循环可以划分为简单循环、嵌套循环、串接循环和 非结构循环非结构循环4 4类。类。(1 1)测试简单循环。设其循环的最大次数为)测试简单循环。设其循环的最大次数为n n ,可采用以下,可采用以下测试集:测试集:跳过整个循环;跳过整个循环;只循环一次;只循环一次;只循环两次;只循环两次;循环循环 m m 次,其中次,其中mnm8 AND Y5X0 OR Y0引用语句1引用语句2NYNYX16 OR Y10引用语句3NYA Free sample background from Slide 60第四章第四章 白盒测试及其用例的设计白盒测试及其用例的设计习题习题2 2、某程序所画出的、某程序所画出的N N-S-S图图如右图所示的如右图所示的,至少需要,至少需要多少个测试用例才能对该多少个测试用例才能对该程序实现逻辑覆盖?程序实现逻辑覆盖?