等价类划分法
概述
等价类划分法是黑盒测试用例设计中一种常用的设计方法,它将不能穷举的测试过程进行合理分类,从而保证设计出来的测试用例具有完备性和代表性。
等价类划分法(ECP:Equivalence Class Partitioning) 是把所有可能的输入数据,即程序的输入域划分成若干子集,各个输入数据对于揭露程序中的错误都是等效的,它们具有等价特性,从每一个子集中选取少数具有代表性的数据作为测试用例。所有等价类的并集就是整个输入域。
也就是说,如果某一类中的一个例子发现了错误,这一等价类中的其他例子也能发现同样的错误;反之,如果某一类中的一个例子没有发现错误,则默认这一类中的其他例子也不会查出错误。当然这是有风险的,但是非穷举的测试都是基于风险的,而等价类与其他方法相比是最经济的。
基本概念
有效等价类
是指对软件规格说明来说,合理、有意义的输入数据所构成的集合。利用有效等价类可以检验程序是否满足测试需求的功能和性能。
无效等价类
则和有效等价类相反,即不满足程序输入要求或者无效的输入数据所构成的集合。利用无效等价类可以检验程序异常情况的处理,才能确保软件具有更高的可靠性。
例如,检测软件输入条件是是否备份数据,那么有效等价类就是”备份数据”,无效等价类就是”不备份数据”。
等价类的意义
等价类有两个重要意义:
- 完备性:为整个输入域提供一种形式的完备性
- 无冗余性:所划分的子集之间互不相交则可保证某种程度上的无冗余性
等价类划分法的步骤
使用等价类划分法设计测试用例工作主要分成两个步骤完成。
第一步:设计等价类表
在分析需求规格说明的基础上划分等价类,然后列出等价类表。
| 输入条件 | 有效等价类 | 无效等价类 |
|---|---|---|
| … | … | … |
第二步:生成测试用例
- 设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖的有效等价类,重复这个过程,直至所有的有效等价类均被测试用例所覆盖
- 设计一个新的测试用例,使其仅覆盖一个无效等价类,重复这个过程,直至所有的无效等价类均被测试用例所覆盖
注意:为什么不能只设计一个测试用例覆盖所有的无效等价类呢?
如果用单个测试用例覆盖无效等价类,会因为同时输入多个无效的测试可能屏蔽某些部分输入错误的检查。例如,如果设计密码测试用例输入”323#a”,包含有3个错误,系统可能只提示”密码位数少于6位”,那么我们无法确认系统是否约束了类型不相符的问题,而造成漏测。
再比如,如果规格说明规定了”请输入商品编号及数量(1~10)“,代表两个错误(商品编号错误和数量错误)的测试用例”ABC 12”,系统有可能只提示”商品编号不正确,请重新输入”,而屏蔽了对数量的约束的测试。
等价类划分的原则
等价类的划分是一个启发式的过程,遵循以下原则:
1. 按照区间划分
如果在输入条件规定了取值范围或值的个数的情况下,可以确定一个有效等价类和两个无效等价类。
例如:学生的成绩范围是0~100分,那么可以划分为1个有效等价类和2个无效等价类。
再比如,若规定一房产最多只能有5个业主,那么就应有1个有效等价类和2个无效等价类(没有业主和业主多于5个)。
如果输入是两个参数X1和X2的多个区间,则可以建立二维数轴的多空间划分,形成等价类,然后每个等价类空间中选取典型数据作为测试用例。
2. 按有限数划分
在规定了一组输入数据(假设包括有限n个输入值),并且程序要对每一个输入值分别进行处理的情况下,可确定n个有效等价类(每个值确定一个有效等价类)和一个无效等价类(所有不允许的输入值的集合)。
例如:输入值是学历,允许值:专科、本科、硕士、博士和博士后。那么就有5个有效等价类和1个无效等价类。
3. 按集合划分
在输入条件规定了输入值的集合或规定了”必须如何”的条件下,可以确定一个有效等价类和一个无效等价类(该集合有效值之外)。
例如,规定”x是整数”,那么就一个有效等价类和一个无效等价类(x是非整数的实数)。
4. 按照限制条件或规则划分
在规定了输入数据必须遵守的规则或限制条件的情况下,可确定一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。
例如,程序输入条件为以字符a开头、长度为8的字符串,并且字符串不包含’a’~‘z’之外的其它字符,则:
- 有效等价类:满足了上述所有条件的字符串
- 无效等价类:不以’a’开头的字符串、长度不为8的字符串、包含了’a’~‘z’之外其它字符的字符串
5. 细分等价类
在确知已划分的等价类中各元素在程序中的处理方式不同的情况下,则应再将该等价类进一步划分为更小的等价类,并建立等价类表。
等价类划分法的分类
1. 标准等价类测试
标准等价类测试不考虑无效数据值,测试用例使用每个等价类中的一个值。通常,标准等价类测试用例的数量和最大等价类中元素的数目相等。
2. 健壮等价类测试
(详细内容见课件)
3. 对等区间的划分
(详细内容见课件)
示例:三角形问题
利用输出域来定义等价类:
- R1:{〈a,b,c〉:边为a,b,c的等边三角形}
- R2:{〈a,b,c〉:边为a,b,c的等腰三角形}
- R3:{〈a,b,c〉:边为a,b,c的一般三角形}
- R4:{〈a,b,c〉:边为a,b,c不构成三角形}
总结
等价类划分法的步骤只有两步,其中最关键的是设计等价类的技巧,需要根据实际情况,依据等价类划分的原则进行划分,如果遇到难以划分的情况,至少可以划分成有效等价类和无效等价类两类,然后再进一步尝试细分子类。
大题总结
等价类表
| 输入条件 | 有效等价类 | 无效等价类 | |
|---|---|---|---|
| 根据题目中的条件竖向列出来 | 符合当前条件的叙述 | 不符合当前条件的等价类 | |
| (且需要为每个有效等价类、无效等价类编写编号,类似于(1)) |
通过等价类划分法而画出来的测试用例表
| 输入数据 | 期望输出 | 覆盖范围(填写上面说的等价类编号) |
|---|---|---|
尽可能用最少的用例来覆盖最多的有效等价类 但无效等价类至少一个编号一个用例
但例如三角形问题,输入条件很多或者无法清晰的列出来,可以从其值域入手,跳过等价类表,直接写出测试用例
练习题:
某在线课程的”成绩录入”系统要求教师输入学生的百分制成绩,有效范围为0到100之间的整数(包含0和100)。系统应能正确识别有效成绩并存入数据库,对于无效输入应给出明确的错误提示。
请使用等价类划分法为该系统的成绩输入功能设计测试用例,要求:
- 列出所有划分出的有效等价类和无效等价类,并为每个等价类编号
- 根据等价类设计一组测试用例