如何划分等价类
在给定了输入或外部条件之后,等价类的划分原则如下:
- 如果输入条件规定了一个取值范围(例如,“数量可以是1到999”),那么就应确定出一个有效等价类(1<数量<999),以及两个无效等价类(数量<1,数量>999)。
- 如果输入条件规定了取值的个数(例如,“汽车可登记一至六名车主”),那么就应确定出一个有效等价类和两个无效等价类(没有车主,或车主多于六个)。
- 如果输入条件规定了一个输入值的集合,而且有理由认为程序会对每个值进行不同处理(例如,“交通工具的类型必须是公共汽车、卡车、出租车、火车或摩托车”),那么就应为每个输入值确定一个有效等价类和一个无效等价类(例如,“拖车”)。
- 如果存在输入条件规定了“必须是”的情况,例如“标识符的第一个字符必须是字母”,那么就应确定一个有效等价类(首字符是字母)和一个无效等价类(首字符不是字母)。
- 以上是基于字面上的需求划分的等价类,而细化等价类依据的是数据在内存或数据库中存储的类型。(举例,测试加法器,两个文本框,要求输入-99~99之间的整数。整数的存储在计算机底层中会使用不同的算法,正整数和负整数算法不同。所以测试时正整数和负整数应该分开来测(一般对有效等价类数据应用,无效等价类数据一般不需要正、负分别测)。所以将有效等价类细分为:-99--(-1)负整数、0—99 正整数。
划分等价类的标准:
- 完备测试、避免冗余;
- 划分等价类重要的是:集合的划分,划分为互不相交的一组子集,而子集的并是整个集合;
- 并是整个集合:完备性;
- 子集互不相交:保证一种形式的无冗余性;
- 同一类中标识(选择)一个测试用例,同一等价类中,往往处理相同,相同处理映射到"相同的执行路径"。
设计测试用例
确定等价类
确定等价类是选取每一个输入条件(通常是规格说明中的一个句子或短语)并将其划分为两个或更多的组。注意,我们确定了两类等价类:有效等价类代表对程序的有效输入,而无效等价类代表的则是其他任何可能的输入条件(即不正确的输入值)。这样,我们就遵循了测试原则,即要注意无效和未预料到的输入情况。
建立等价类表
划分等价类后,应建立等价类表,列出与每一个输入条件对应的有效等价类和无效等价类,并为每个等价类设置一个唯一的编号。
生成测试用例
现在利用等价类表来生成测试用例,其过程如下:
- 编写新的测试用例,尽可能多地覆盖那些尚未被涵盖的有效等价类,直到所有的有效等价类都被测试用例所覆盖(包含进去)。
- 编写新的用例,每次覆盖一个(仅一个)尚未被涵盖的无效等价类,直到所有的无效等价类都被测试用例所覆盖(包含进去)
用测试用例每次只覆盖1个无效等价类,是因为某些特定的输入错误检查可能会屏蔽或取代其他输入错误检查。举例,如果规格说明规定了“请输入书籍类型(硬皮、软皮或活页)及数量(1~999)”,代表两个错误输入(书籍类型错误,数量错误)的测试用例“(XYZ,0)”,很可能不会执行对数量的检查,因为程序也许会提示“XYZ是未知的书籍类型”,就不检查输入的其余部分了。
使用场景
有数据输入(编辑框)的地方,可以使用等价类划分法。例如用户登录、注册、新建、查询。
实战演练
注册邮箱
测试用例 | |||
编号 | 输入数据 | 覆盖等价类 | 预期输出 |
1 | test_123 | 1、5、9 | 合法输入 |
2 | test | 2、5、9 | 非法输入 |
3 | test 123456789 123456789 | 3、5、9 | 非法输入 |
4 | NULL | 4 | 非法输入 |
5 | test&&123 | 1、6、9 | 非法输入 |
6 | test 123 | 1、7、9 | 非法输入 |
7 | test测试123 | 1、8、9 | 非法输入 |
8 | l23_test | 1、5、10 | 非法输入 |