最小值,其中k<i
期望结果:基于k的正确平均值和总数
路径5测试用例:
value(i)=有效输入,其中i<100
value(k)>最大值,其中k≥i
期望结果:基于k的正确平均值和总数
路径6测试用例:
value(i)=有效输入,其中i<100
期望结果:基于k的正确平均值和总数
执行每个测试用例,并和期望值比较,一旦完成所有测试用例,测试者可以确定在程序中的所有语句至少被执行一次。
重要的是要注意,某些独立路径(如,例子中的路径1)不能以独立的方式被测试,即,穿越路径所需的数据组合不能形成程序的正常流,在这种情况下,这些路径必须作为另一个路径测试的一部分来进行测试。
16.4.4 图矩阵
导出流图和决定基本测试路径的过程均需要机械化,为了开发辅助基本路径测试的软件工具,称为图矩阵(graph matrix)的数据结构很有用。
图矩阵是一个正方形矩阵,其大小(即列数和行数)等于流图的节点数。每列和每行都对应于标识的节点,矩阵项对应于节点间的连接(边),图16-7显示了一个简单的流图及其对应的图矩阵[BEI90]。
该图中,流图的节点以数字标识,边以字母标识,矩阵中的字母项对应于节点间的连接,例如,边b连接节点3和节点4。
这里,图矩阵只是流图的表格表示,然而,对每个矩阵项加入连接权值(link weight),图矩阵就可以用于在测试中评估程序的控制结构,连接权值为控制流提供了另外的信息。最简单情况下,连接权值是 1(存在连接)或0(不存在连接),但是,连接权值可以赋予更有趣的属性:
·执行连接(边)的概率。
·穿越连接的处理时间。
·穿越连接时所需的内存。
·穿越连接时所需的资源。
举例来说,我们用最简单的权值(0或1)来标识连接,图16-7所示的图矩阵重画为图16-8。字母替换为1,表示存在边(为清晰起见,没有画出0),这种形式的图矩阵称为连接矩阵(linkmatrix)。图16-8中,含两个或两个以上项的行表示判定节点,所以,右边所示的算术计算就提供了另一种环形复杂性计算(参16.4.2节)的方法。
Beizer[BEI90]提供了可用于图矩阵的其他数学算法的处理,利用这些技术,设计测试用例的分析就可以自动化或部分自动化。
16.5 控制结构测试
16.4节所述的基本路径测试技术是控制结构测试技术之一。尽管基本路径测试简单高效,但是,其本身并不充分。本节讨论控制结构测试的其他变种,这些测试覆盖并提高了白盒测试的质量。
16.5.1 条件测试
条件测试是检查程序模块中所包含逻辑条件的测试用例设计方法。一个简单条件是一个布尔变量或一个可能带有NOT(“┓”)操作符的关系表达式。关系表达式的形式如:
E1<关系操作符>E2
其中E1和E2是算术表达式,而<关系操作符>是下列之一:“<”,“≤”,“=”,“≠”(“┓=”),“>”,或“≥”。复杂条件由简单条件、布尔操作符和括弧组成。我们假定可用于复杂条件的布尔算子包括OR“|”,AND“&”和NOT“┓”,不含关系表达式的条件称为布尔表达式。
所以条件的成分类型包括布尔操作符、布尔变量、布尔括弧(括住简单或复杂条件)、关系操作符或算术表达式。
如果条件不正确,则至少有一个条件成分不正确,这样,条件的错误类型如下:
·布尔操作符错误(遗漏布尔操作符,布尔操作符多余或布尔操作符不正确)。
·布尔变量错误。
·布尔括弧错误。
·关系操作符错误。
·算术表达式错误。
条件测试方法注重于测试程序中的条件。本节后面讨论的条件测试策略主要有两个优点,首先,测度条件测试的覆盖率是简单的,其次,程序的条件测试覆盖率为产生另外的程序测试提供了指导。
条件测试的目的是测试程序条件的错误和程序的其他错误。如果程序P的测试集能够有效地检测P中的条件错误,则该测试集可能也会有效地检测P中的其他错误,此