等价类划分法
由于穷举测试工作量太大,以至于无法实际完成,促使我们在大量的可能数据中选取其中的一部分作为测试用例。例如,在不了解等价分配技术的前提下,我们做计算器程序的加法测试时,测试了1+1,1+2,1+3和1+4之后,还有必要测试1+5和1+6吗?能否放心地认为它们是正确的?
等价类划分是把程序的输入域划分为若干部分,然后从每个部分中选取少数代表性数据作为测试用例。每一类的代表性数据在测试中的作用等价于这一类中的其他值,也就是说,如果某一类中的一个例子发现了错误,这一类等价类中的其他例子也能发现同样的错误;反之,如果某一类中的一个例子没有发现错误,则这一类中的其他例子也不会查出错误(除非等价类中的某些例子属于另一等价类,因为几个等价类可能相交的)。使用这一方法设计测试用例,首先必须在分析需求规格说明的基础上划分等价类,列出等价类表。
1、划分等价类和列出等价类表
等价类是指某个输入域的子集合。等价类划分有两种不同的情况:有效等价类和无效等价类
有效等价类:指对于程序的规格说明来说是合理的、有意义的输入数据构成的集合。利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。
无效等价类:与有效等价类的定义相反
设计测试用例时,要同时考虑这两种等价类。因为软件不仅要能接收合理的数据,也要能经受意外的考验。这样的测试才能确保软件具有更高的可靠性。
下面给出6条确定等价类的原则:
(1)在输入条件规定了取值范围或值的个数的情况下,可以确立一个有效等价类和两个无效等价类。
(2)在输入条件规定了输入值的集合或者规定了“必须如何”的条件情况下,可以确定一个有效等价类和一个无效等价类
(3)在输入条件是一个布尔量的情况下,可以确定一个有效等价类和一个无效等价类。
(4)在规定了输入数据的一组值(假定n个),并且程序要对每一个输入值分别处理的情况下,可确立n个有效等价类和一个无效等价类。
(5)在规定了输入数据必须遵守的规则的情况下,可确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。
(6)在确知已划分的等价类中,各元素在程序处理中的方式不同的情况下,则应再将该等价类进一步地划分为更小的等价类。
2、确定测试用例
根据已列出的等价类表,按以下步骤确定测试用例:
(1)为每个等价类规定一个唯一的编号
(2)设计一个新的测试用例,使其尽可能多地覆盖尚未覆盖的有效等价类。重复这一步,最后使得所有有效等价类均被测试用例所覆盖。
(3)设计一个新的测试用例,使其只覆盖一个无效等价类。重复这一步是所有无效等价类均被覆盖。
3、例题:根据下面给出的规格说明,利用等价类划分的方法,给出足够的测试用例。
“一个程序读入3个整数,把这3个数值作为一个三角形的3条边的长度值,这个程序要打印出信息,说明这个三角形是不是等边的、是等腰的、还是一般的。”
分析:我们可以设三角形的3条边分别为A,B,C。如果它们能构成三角形,必须满足:A>0,B>0,C>0,且A+B>C,A+C>B,B+C>A。
如果是等腰的,还有判断 A=B,或B=C,或A=C
如果是等边的,则需判断A=B且B=C且A=C
列出等价类表,如下:
输入条件 | 有效等价类 | 无效等价类 |
是否三角形的3条边 |
(A>0), (1) (B>0), (2) (C>0), (3) (A+B>C), (4) (B+C)>A, (5) (A+C)>B, (6) |
(A<=0), (7) (B<=0), (8) (C<=0), (9) (A+B<=C), (10) (B+C<=A), (11) (A+C<=B), (12) |
是否等腰三角形 |
(A=B), (13) (A=C), (14) (B=C), (15) |
(A!=B) and (B!=C) and (A!=C), (16) |
是否等边三角形 |
(A=B) and (B=C) and (A=C), (17) |
(A!=B), (18) (B!=C), (19) (C!=A), (20) |
设计测试用例:输入顺序是 A,B,C,如下表:
序号 | 【A,B,C】 | 覆盖等价类 | 输出 |
1 | 【3,4,5】 | (1),(2),(3),(4),(5),(6) | 一般三角形 |
2 | 【0,1,2】 | (7) | 不能构成三角形 |
3 | 【1,0,2】 | (8) | 不能构成三角形 |
4 | 【1,2,0】 | (9) | 不能构成三角形 |
5 | 【1,2,3】 | (10) | 不能构成三角形 |
6 | 【1,3,2】 | (11) | 不能构成三角形 |
7 | 【3,1,2】 | (12) | 不能构成三角形 |
8 | 【3,3,4】 | (1),(2),(3),(4),(5),(6),(13) | 等腰三角形 |
9 | 【3,4,4】 | (1),(2),(3),(4),(5),(6),(14) | 等腰三角形 |
10 | 【3,4,3】 | (1),(2),(3),(4),(5),(6),(15) | 等腰三角形 |
11 | 【3,4,5】 | (1),(2),(3),(4),(5),(6),(16) | 非等腰三角形 |
12 | 【3,3,3】 | (1),(2),(3),(4),(5),(6),(17) | 等边三角形 |
13 | 【3,4,4】 | (1),(2),(3),(4),(5),(6),(18) | 非等边三角形 |
14 | 【3,4,3】 | (1),(2),(3),(4),(5),(6),(19) | 非等边三角形 |
15 | 【3,3,4】 | (1),(2),(3),(4),(5),(6),(20) | 非等边三角形 |
请记住,等价分配的目标是把可能的测试用例组合缩减到仍然足以满足软件测试需求为止。因为选择了不完全测试,就要冒一定的风险,所以必须仔细选择分类。