等价类划分
等价列划分设计方法是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少量具有代表性的数据作为测试用例。
等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的。并合理地假定:测试某等价类的代表值就等于对这一类其他值的测试。
等价类划分有两种不同的情况:有效等价类和无效等价类。设计时要同时考虑这两种等价类。
下面给出6条确定等价类的原则:
- 在输入条件规定了取值范围或值的个数的情况下,则可以确立一个有效等价类和两个无效等价类。
- 在输入条件规定了输入值的集合或者规定了“必须如何”的条件的情况下,则可以确立一个有效等价类和一个无效等价类。
- 在输入条件是一个布尔量的情况下,可以确立一个有效等价类和一个无效等价类。
- 在规定了输入数据的一组值(假定n个),并且程序要对每一个输入值分别处理的情况下,可以确立n个有效等价类和一个无效等价类。
- 在规定了输入数据必须遵守的规则的情况下,可以确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。
- 在确知已划分的等价类中各元素在程序处理中的方式不同的情况下,则应再将该等价类进一步的划分为更小的等价类。
在确立了等价类后,可建立等价类表,列出所有划分出的等价类。然后从划分出的等价类中按以下的3个原则设计测试用例:
- 为每一个等价类规定一个唯一的编号
- 设计一个新的测试用例,使其尽可能多的覆盖尚未被覆盖的有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止。
- 设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖为止。
例子:
根据下面给出的规格说明,利用等价类划分的方法,给出足够的测试用例。
"一个程序读入3个整数,它们分别代表一个三角形的3个边长。该程序判断所输入的整数是否构成一个三角形,以及该三角形是一般的、等腰的或等边的,并将结果打印出来。"
要求:设三角形的3条边分别为A、B、C,并且
(1) 列出等价类表,格式如下:
输入条件 | 有效等价类 | 无效等价类 |
(注意:将等价类编号) | (注意:将等价类编号) |
(2) 设计测试用例,格式如下:
用例n:输入【A,B,C】覆盖等价类……(列出等价类序号),输出结果为……。
答:设三角形的3条边分别为A,B,C。如果它们能够构成三角形的3条边,必须满足:
A>0,B>0,C>0,且A+B>C,B+C>A,A+C>B。
如果是等腰的,还要判断A=B,或B=C,或A=C。
如果是等边的,则需判断是否A=B,且B=C,且A=C。
输入条件 | 有效等价类 | 无效等价类 |
是否三角形的三条边 | (A>0), (1) | (A≤0), (7) |
(B>0), (2) | (B≤0), (8) | |
(C>0), (3) | (C≤0), (9) | |
(A+B>C), (4) | (A+B≤C), (10) | |
(B+C>A), (5) | (B+C≤A), (11) | |
(A+C>B), (6) | (A+C≤B), (12) | |
是否等腰三角形 | (A=B), (13) | (A≠B)and(B≠C)and(C≠A) (16) |
(B=C), (14) | ||
(C=A), (15) | ||
是否等边三角形 | (A=B)and(B=C)and(C=A) | (A≠B), (18) |
(17) | (B≠C), (19) | |
(C≠A), (20) |
举例 | |||
序号 | 【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),(14),(18) | 非等边三角形 |
14 | 【3,4,3】 | (1),(2),(3),(4),(5),(6),(15),(19) | |
15 | 【3,3,4】 | (1),(2),(3),(4),(5),(6),(13),(20) |