等价类划分,指的是一种典型的、重要的黑盒测试方法。其就是解决如何选择适当的数据子集来代表整个数据集的问题,通过降低测试的数目去实现合理的覆盖,以此来发现更多的软件缺陷。
概述
等价类划分法将程序所有可能的输入数据(有效的和无效的)划分成若干个等价类。然后从每个部分中选取具有代表性的数据当做测试用例进行合理的分类,测试用例由有效等价类和无效等价类的代表组成,从而保证测试用例具有完整性和代表性。等价类划分法是一种系统性的确定要输入的测试条件的方法。等价类划分不仅可以用来确定测试用例中的数据的输入输出的精确取值范围,也可以用来准备中间值、状态和与时间相关的数据以及接口参数等。
等价类相关基本概念
有效等价类:指对于程序规格说明来说,是合理的、有意义的输入数据构成的集合。利用有效等价类可以检验程序是否实现了规格说明预先规定的功能和性能。有效等价类可以是一个,也可以是多个,根据系统的输入域划分若干部分,然后从每个部分中选取少数有代表性数据当做数据测试的测试用例,等价类是输入域的集合。
无效等价类:和有效等价类相反,无效等价类是指对于软件规格说明而言,没有意义的、不合理的输入数据集合。利用无效等价类,可以找出程序异常说明情况,检查程序的功能和性能的实现是否有不符合规格说明要求的地方。
弱一般等价类: 基于单缺陷假设,只针对有效等价类中进行用例设计,不针对无效等价类进行用例设计。也就是用例仅覆盖正常场景。这里描述的所谓的“弱”主就是指基于单缺陷假设,“一般”是指仅考虑有效等价类的覆盖,也就是正常场景。
强一般等价类:基于多缺陷假设,覆盖每个有效等价类进行用例设计。不针对无效等价类进行用例设计。所谓的“强”指的是基于多缺陷假设,也就是1个用例中考虑多个等价类中取值的组合。
弱健壮等价类:基于单缺陷假设的健壮性测试,同时考虑覆盖有效等价类和无效等价类。所谓的“健壮”是指同时覆盖了有效等价类,也就是异常场景。一个程序只有同时能够处理各种异常的输入,才能称之为程序具有健壮性。
强健壮等价类:基于多缺陷假设的健壮性测试。同时考虑覆盖有效等价类和无效等价类。
这里描述的概念后续都会通过实际案例进行讲解,如果不能马上理解,可以继续先往下看,最后再来看这些基本概念,可能就更容易明白。
等价类划分方法和原则
划分等价类最重要的是:集合的划分,划分为一组互不相交的子集,而子集的并集是一个集合。下面根据不同场景举例等价类划分的方法和原则。
(1)在输入条件规定的取值范围或值的个数的情况下,可以确定一个有效等价类和两个无效等价类。假设输入学生成绩范围为[0,100],则有效等价类为[0,100],无效等价类为成绩<0和>100。
(2)在规定了输入数据的一组值中(假定有n个值),并且程序要对每个输入值分别处理的情况下,可以确定n个有效等价类和一个无效等价类。假设程序选项输入为1、2、3三个选项。则有效等价类1、2、3,无效等价类为非整数值1/2/3。
(3)在规定输入数据必须遵守的规则的情况下,可以确定一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。假设程序规定输入为非0的正整数。应该充分考虑是否可以拆分为单一的子规则,然后得到从不同角度违反规则的无效等价类。该例子起码可以拆分为非0、数字、正数、整数4个子规则。至少每一个子规则对应1个无效等价类。即0、字符串、负数、小数,设置可以挖掘出输入为空的隐含等价类。
(4)在输入条件规定了输入值的集合或规定了“必须如何”的条件下,可以确定一个有效等价类和一个无效等价类。假设程序设定连续输入密码错误次数最多为3次。则有效等价类为小于等于3次,无效等价类为大于3次。
(5)在确定已划分的等价类中各元素在程序处理中的方式不同的情况下,则应将该等价类进一步地划分为更小的等价类。假设程序为测试输入日期的有效性,初步有效等价类是Month=[1,12],Day=[1,31],可是考虑到闰年、闰月、长月、短月等。需要进一步细分,当然这还涉及到年月日组合的问题。
等价类表转换测试用例方法
(1)按照输入条件、有效等价类、无效等价类、 建立等价类表,列出所有划分出的等价类。
(2)为每一个等价类规定一个唯一的编号。
(3)设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止。
(4)设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖为止。
等价类划分实例
1、某日期检查程序,要求用户输入以年月表示的日期。假设日期限定在1990年1月~2049年12月,并规定日期由6位数字字符组成,前4位表示年,后2位表示月。现用等价类划分法设计测试用例,来测试程序的”日期检查功能”。(不考虑2月的问题)
(1)阅读程序规格说明书,识别影响程序输出结果的因子。这里包括输入类型和长度(6位数字字符)、输入组成(前4位表示年、后2位表示月)。
(2)针对不同的因子划分出有效等价类和无效等价类。
A、输入日期类型和长度。有效等价类:6位数字字符,无效等价类:有非数字字符、少于6位数字字符、多于6位数字字符。
B、年份范围。有效等价类:[1990,2049],无效等价类:小于1990,大于2049。
C、月份范围。有效等价类:[01,12],无效等价类:等于00,大于12
依次对不同因子的有效等价类和无效等价类进行编号,获得等价类表如下所示:
输入等价类 | 有效等价类 | 无效等价类 |
日期的类型及长度 | ①6位数字字符 | ②有非数字字符 ③少于6位数字字符 ④多于6位数字字符 |
年份范围 | ⑤在1990~2049之间 | ⑥小于1990 ⑦大于2049 |
月份范围 | ⑧在01~12之间 | ⑨等于00 ⑩大于12 |
(3)设计测试用例覆盖有效等价类。每个用例尽可能多地覆盖尚未被覆盖的有效等价类。步骤(2)中的等价类表中列出了3个有效等价类,编号分别为①、⑤、⑧,设计的测试用例如下:
TestCase1:输入测试数据200211,输出日期合法。覆盖的有效等价类为:①、⑤、⑧ <– 强弱一般等价类就只有这1个用例。仅覆盖有效等价类。
(4)设计测试用例覆盖无效等价类,每个用例仅覆盖一个尚未被覆盖的无效等价类。设计结果如下:
TestCase2:输入测试数据95June,输出日期不合法。覆盖无效等价类:② 有非数字字符
TestCase3:输入测试数据20036,输出日期不合法。覆盖无效等价类:③ 少于6位数字字符
TestCase4:输入测试数据2001006,输出日期不合法。覆盖无效等价类: ④ 多于6位数字字符
TestCase5:输入测试数据198912,输出日期不合法。覆盖无效等价类:⑥ 年份小于1990
TestCase6:输入测试数据205401,输出日期不合法。覆盖无效等价类:⑦ 年份大于2049
TestCase7:输入测试数据201800,输出日期不合法。覆盖无效等价类: ⑨ 月份等于00
TestCase8:输入测试数据200113,输出日期不合法。覆盖无效等价类:⑩ 月份大于12
这里属于弱健壮等价类测试,仅考虑单缺陷假设,不做多缺陷假设。如果是强健壮等价类测试用例设计,还包括如下:
TestCase9:输入测试数据2June,输出日期不合法。覆盖无效等价类:⑩ ③ 覆盖 少于6位并且包含非数字字符
TestCase10:输入测试数据200June,输出日期不合法。覆盖无效等价类:⑩ ④ 覆盖 大于6位并且包含非数字字符
TestCase11:输入测试数据1989Je,输出日期不合法。覆盖无效等价类:⑩ ④ 覆盖 年份小于1990并且包含非数字字符
TestCaseN: …
小结
等价类划分方法的使用不仅要针对输入域进行等价类划分,也可以针对输出域进行等价类划分,这一点在使用过程中一定不要忘记了。此外,如果考虑将端到端场景进行细分,等价类划分方法同时也适用于中间过程的输入、输出域进行划分。比如输出三角形类型程序的判定,用例输出一定要覆盖到输出三角形类型中的等腰、等边、不等边三角形以及非三角形4种类型。