(2)A>I,B≠0 (3)A≤1,B=0 (4)A≤1,B≠O (5)A=2,X>1 (6)A=2,X≤1 (7)A≠2,X>1 (8)A≠2,X≤1
和其他逻辑覆盖标准中的测试数据一样,条件组合(5)~(8)中的X值是指在程序流程图第二个判定框(b点)的X值。
下面的4组测试数据可以使上面列出的8种条件组合每种至少出现一次: I.A=2,B=O,X=4
(针对1,5两种组合,执行路径sacbed) Ⅱ.A=2,B=1,X=1
(针对2,6两种组合,执行路径sabed) Ⅲ.A=1,B=0,X=2
(针对3,7两种组合,执行路径sabed) Ⅳ.A=1,B=1,X=1
(针对4,8两种组合,执行路径sabd)
显然,满足条件组合覆盖标准的测试数据,也一定满足判定覆盖、条件覆盖和判定/条件覆盖标准。因此,条件组合覆盖是前述几种覆盖标准中最强的。但是,满足条件组合覆盖标准的测试数据并不一定能使程序中的每条路径都执行到,例如,上述4组测试数据都没有测试到路径sacbd。 以上根据测试数据对源程序语句检测的详尽程度,简单讨论了几种逻辑覆盖标准。在上面的分析过程中常常谈到测试数据执行的程序路径,显然,测试数据可以检测的程序路径的多少,也反映了对程序测试的详尽程度。从对程序路径的覆盖程度分析,能够提出下述一些主要的逻辑覆盖标准。 6.点覆盖
图论中点覆盖的概念定义如下:如果连通图G的子图G’是连通的,而且包含G的所有结点,则称G’是G的点覆盖。
在第6.5节中已经讲述了从程序流程图导出流图的方法。在正常情况下流图是连通的有向图。满足点覆盖标准要求选取足够多的测试数据,使得程序执行路径至少经过流图的每个结点一次,由于流图的每个结点与一条或多条语句相对应,显然,点覆盖标准和语句覆盖标准是相同的。 7.边覆盖
图论中边覆盖的定义是:如果连通图G的子图G”是连通的,而且包含G的所有边,则称G”是G的边覆盖。为了满足边覆盖的测试标准,要求选取足够多测试数据,使得程序执行路径至少经过流图中每条边一次。通常边覆盖和判定覆盖是一致的。
8.路径覆盖
路径覆盖的含义是,选取足够多测试数据,使程序的每条可能路径都至少执行一次(如果程序图中有环,则要求每个环至少经过一次)。 作为一个练习,请读者自己设计用路径覆盖标准测试图7.5所示模块的测试数据。
7.6.2 控制结构测试
现有的很多种白盒测试技术,是根据程序的控制结构设计测试数据的技术,下面介绍
几种常用的控制结构测试技术。 1.基本路径测试
基本路径测试是Tom McCabe提出的一种白盒测试技术。使用这种技术设计测试用例时,首先计算程序的环形复杂度,并用该复杂度为指南定义执行路径的基本集合,从该基本集合导出的测试用例可以保证程序中的每条语句至少执行一次,而且每个条件在执行时都将分别取真、假两种值。 使用基本路径测试技术设计测试用例的步骤如下: 第一步,根据过程设计结果画出相应的流图。 例如,为了用基本路径测试技术测试下列的用PDL描述的求平均值过程,首先画出图7.6所示的流图。注意,为了正确地画出流图,我们把被映射为流图结点的PDL语句编了序号。 PROCEDURE average;
/*这个过程计算不超过100个在规定值域内的有效数字的平均值; 同时计算有效数字的总和及个数。 */
INTERFACE RETURNS average,total.input,total.valid; INTERFACE ACCEPTS value.minimum,maximum;
TYPE value[1?100]IS SCALAR ARRAY;
TYPE average,total.input,total.valid; minimum,maximum.sum IS SCALAR;
TYPE i IS INTEGER; 1: i=1
total.input=total.valid=O; sum=O:
2: D0 WHILE value[i]<> -999 3: AND total.input 4: increment total.input byl; 5: IF value[i]>=minimum 6: AND value[i]<=maximum 7: THEN increment total.valid by 1; sum=sum+value[i]; 8: ENDIF increment i by 1; 9: ENDDO 10: IF total.valid>O 11: THEN average=sum/total.valid; 12: ELSE average=-999: 13: ENDIF END average 第二步,计算流图的环形复杂度。 1 2 3 10 4 11 12 13 5 6 8 7 9 图7.6 求平均值过程的流图 环形复杂度定量度量程序的逻辑复杂性。有了描绘程序控制流的流图之后,可以用第6.5.1小节讲述的3种方法之一计算环形复杂度。经计算,图7.6所示流图的环形复杂度为6。 第三步,确定线性独立路径的基本集合。 所谓独立路径是指至少引入程序的一个新处理语句集合或一个新条件的路径,用流图术语描述,独立路径至少包含一条在定义该路径之前不曾用过的边。 使用基本路径测试法设计测试用例时,程序的环形复杂度决定了程序中独立 路径的数量,而且这个数是确保程序中所有语句至少被执行一次所需的测试数量的上界。 对于图7.6所描述的求平均值过程来说,由于环形复杂度为6,因此共有6条独立路径。例如,下面列出了6条独立路径: 路径1:1—2—10—11—13 路径2:1—2—10一12一13 路径3:1—2—3—10一11—13 路径4:1—2—3—4—5—8—9—2一? 路径5:1—2—3—4—5—6—8—9—2一? 路径6:1—2—3—4—5—6—7—8—9—2一? 路径4、5、6后面的省略号(?)表示,可以后接通过控制结构其余部分的任意路径(例如, 10一11—13)。 通常在设计测试用例时,识别出判定结点是很有必要的。本例中结点2、3、5、6和10是判定结点。 第四步,设计可强制执行基本集合中每条路径的测试用例。 应该选取测试数据使得在测试每条路径时都适当地设置好了各个判定结点的条件。例如,可以测试上一步得出的基本集合的测试用例如下: 路径1的测试用例: value[k]一有效输入值,其中k 预期结果:基于是的正确平均值和总数 注意,路径1无法独立测试,必须作为路径4、5和6的一部分来测试。 路径2的测试用例: value[1]=-999 预期结果:average=-999,其他都保持初始值 路径3的测试用例: 试图处理101个或更多个值 前100个数值应该是有效输入值 预期结果:前100个数的平均值,总数为100 注意,路径3也无法独立测试,必须作为路径4、5和6的一部分来测试。 路径4的测试用例: value[i]=有效输入值,其中i<100 value[k] 预期结果:基于是的正确平均值和总数 路径5的测试用例: value[i]=有效输入值,其中i<100 value[k]>maximum,其中k 预期结果:基于是的正确平均值和总数 路径6的测试用例: value[i]=有效输入值,其中i 每个条件都分别取过true值和false值。 应该注意,某些独立路径(例如,本例中的路径1和路径3)不能以独立的方式测试,也就是说,程序的正常流程不能形成独立执行该路径所需要的数据组合(例如,为了执行本例中的路径1,需要满足条件total.valid>O)。在这种情况下,这些路径必须作为另一个路径的一部分来测试。 2.条件测试 尽管基本路径测试技术简单而且高效,但是仅有这种技术还不够,还需要使用其他控制结构测试技术,才能进一步提高自盒测试的质量。 用条件测试技术设计出的测试用例,能够检查程序模块中包含的逻辑条件。一个简单条件是一个布尔变量或一个关系表达式,在布尔变量或关系表达式之前还可能有一个NOT(\?”)算符。关系表达式的形式如下: E1〈关系算符>E2 其中,E1和E2是算术表达式,而<关系算符>是下列算符之一:“<”,“≤”,“=”,“≠”,“>”或“≥”。复合条件由两个或多个简单条件、布尔算符和括弧组成。布尔算符有OR(“|”),AND(“&”)和NOT(\?”)。不包含关系表达式的条件称为布尔表达式。 因此,条件成分的类型包括布尔算符、布尔变量、布尔括弧(括住简单条件或复合条件)、关系算符及算术表达式。 如果条件不正确,则至少条件的一个成分不正确。因此,条件错误的类型如下: ·布尔算符错(布尔算符不正确,遗漏布尔算符或有多余的布尔算符) ·布尔变量错 ·布尔括弧错 ·关系算符错 ·算术表达式错 条件测试方法着重测试程序中的每个条件。本节下面将讲述的条件测试策略有两个优点:①容易度量条件的测试覆盖率;②程序内条件的测试覆盖率可指导附加测试的 设计。 条件测试的目的不仅是检测程序条件中的错误,而且是检测程序中的其他错误。如果程序P的测试集能有效地检测P中条件的错误,则它很可能也可以有效地检测P中的其他错误。此外,如果一个测试策略对检测条件错误是有效的,则很可能该策略对检测程序的其他错误也是有效的。 人们已经提出了许多条件测试策略。分支测试可能是最简单的条件测试策略:对于复合条件C来说,C的真分支和假分支以及C中的每个简单条件,都应该至少执行一次。 域测试要求对一个关系表达式执行3个或4个测试。对于形式为 E1<关系算符>E2 的关系表达式来说,需要3个测试分别使E1的值大于、等于或小于E2的值。如果<关系算符>错误而E1和E2正确,则这3个测试能够发现关系算符的错误。为