一、等价类划分法
1. 什么等价类划分法
等价类划分是一种典型的黑盒测试用例设计方法,使用该方法主要是对
测试子项进行测试规格分析,等到用例,而不用对系统内部的处理深入了解。
等价类是指某个
输入域的子集合,在该子集合中,
各个输入的数据对于揭露软件中的错误都是等效的。并合理地假定:
测试某等价类的代表值就等于对这一类的其它的值的测试。因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为输入条件,就可以
用少量代表性的测试数据取得较好的测试结果。
等价类划分有两种情况,
有效等价类 和
无效等价类。
有效等价类:是指对于的规格说明来说是合理的,有意义的输入数据构成的集合。利用有效等价类可以检验程序是否实现了规格说明中所规定的功能和性能。
无效等价类:是指对于系统的规格说明来说是不合理或无意义的输入数据构成的集合。
2. 产生的背景(或说目的)
采用等价类划分,是将系统的输入域划分为若干部分,然后从每个部分选取少量代表性数据进行测试,这样可以
避免穷举法产生的大量用例。
3. 如何使用等价类划分法
3.1 划分等价类
等价类划分追求效率与效果的平衡,到底将等价类划分多细取决于人力资源与进度,但必须做到将所有的等价类都覆盖到。出发点与目标是考虑设计用例把每个输入的每种情况都有用例覆盖。具体可以参考如下几条原则:
1. 在输入条件规定了取值范围或值的个数时,可以确定一个有效等价类和两个无效等价类。
例:
输入条件
|
有效等价类
|
无效等价类
|
1~9
|
1~9
|
小于1
大于9
|
输入数字字符个数为3(不考虑非数字字符)
|
输入3个数字
|
输入少于3个
输入多于3个
|
2. 在输入条件规定了输入值的集合或者必须如何的条件时,可以确定一个有效等价类和一个无效等价类。
例:
输入条件
|
有效等价类
|
无效等价类
|
集合[1,2,3]
|
[1,2,3]
|
非[1,2,3]
|
数字字符
|
数字字符
|
非数字字符
|
3. 在输入条件是一个布尔值时,可以确定一个有效等价类和一个无效等价类
例:
输入条件
|
有效等价类
|
无效等价类
|
true
|
true
|
false
|
4. 在输入条件规定了输入数据为一组值,假设为n,且程序会对每个值分别进行处理时,可以确定n个有效等价类和一个无效等价类。(区别的集合,集合强调的是整体概念,即集合中的所有值会得到相同的情况,这也是为什么此种情况为何强调程序对每个值分别进行处理的原因)
例:
输入条件
|
有效等价类
|
无效等价类
|
某公司对员工职级与薪水划分为3级,对应输入条件P1、P2、P3分别得到m1、m2、m3三种薪水
|
P1
P2
P3
|
除了P1、P2、P3之外任意值
|
5. 在输入条件规定了输入数据必须遵守的规则时,则可确立一个有效等价类和若干个无效等价类。
例:
输入条件
|
有效等价类
|
无效等价类
|
注册用户名:
必须为大写字母开头,且为字母、数字组合
|
以大写字母开头的字母及数字字符组合的字符串
|
非大写字母开头
无数字字符
数字字符开头
空
...
(从不同的角度出发,可以有不同的无效等价类)
|
6. 在确知已划分的等价类中各元素在程序处理中的方式不同时,则应再将该等价类类进一步划分为更小的等价类。
例:
输入条件
|
有效等价类
|
无效等价类
|
注册用户名:
必须为大写字母开头,且为字母、数字组合、长度为[3,8]
|
输入字符类型:以大写字母开头的字母及数字字符组合的字符串
|
非大写字母开头
无数字字符
数字字符开头
空
特殊字符
...
(从不同的角度出发,可以有不同的无效等价类)
|
输入字符长度:[3,8]
|
长度小于3
长度大于8
|
7. 输出域覆盖:当遇到中间输出结果,对最终结果有影响时,需要将中间作为输入条件进行考虑。(对于所测试的功能来说,输入输出之间一般为非线性关联,所以在对输入进行等价类边界值方法进行划分区间,选取数据进行测试用例设计时,并不能覆盖到所有的输出结果。输出域覆盖法,则是根据现有输入,以及已存在的数据得到输出结果,然后对输出结果进行等价类边界值分析,从而反推输入信息,来进行测试用例设计的方法)
例:输入三个整数为三角形三边a,b,c,检查确定三角形为一般三角形、等腰三角形、等边三角形。
域
|
输入条件(输入域的输出结果)
|
有效等价类
|
无效等价类
|
输入域
|
输入3个整数
|
三个数为整数
|
一边为非整数 a为非整数
b为非整数
c为非整数
两边为非整数 ab为非整数
ac为非整数
bc为非整数
三边为非整数 abc均为非整数
|
3个数
|
只输入一个数 只输入a
只输入b
只输入c
只输入两个数 只输入ab
只输入ac
只输入bc
输入三个以上 输入3个以上
|
||
正数
|
一边为非正 a<=0
b<=0
c<=0
两边为非正 a<=0&b<=0
a<=0&c<=0
b<=0&c<=0
三边为非正 a<=0、b<=0、c<=0
|
||
输出域
|
一般三角形
|
a+b>c
a+c>b
b+c>a
|
a+b<=c
a+c<=b
b+c<=a
|
等腰三角形
|
a=b
a=c
b=c
(且以上三个条件,两边之后大于第三边)
|
a!=b&a!=c&b!=c
|
|
等边三角形
|
a=b=c
|
a!=b=c
a=b!=c
a!=b!=c
|
3.2 确定测试用例
划分完等价类后可以按以下步骤设计测试用例
1. 为每一个等价类确定一个唯一的编号
2. 用最少的用例覆盖最多的有效等价类,即有效等价类要尽可能多的覆盖尚未覆盖的有效等价类,重复这一步,直到所有有效等价类都被覆盖
3. 每个无效等价类对应一个用例,重复这一步,直到所有无效等价类都被覆盖
3.3 案例
输入三个一正整数,判断三个数组成一般三角形、等腰三角形、等边三解开:
第一步:划分有效等价类、无效等价类并编号
域
|
输入条件(输入域的输出结果)
|
有效等价类
|
无效等价类
|
输入域
|
输入3个整数
|
三个数为整数(1)
|
一边为非整数 a为非整数(11)
b为非整数(12)
c为非整数 (13)
两边为非整数 ab为非整数(14)
ac为非整数(15)
bc为非整数(16)
三边为非整数 abc均为非整数(17)
|
3个数(2)
|
只输入一个数 只输入a(18)
只输入b(19)
只输入c(20)
只输入两个数 只输入ab(21)
只输入ac(22)
只输入bc(23)
输入三个以上 输入3个以上 (24)
三个数都不输入 abc均为空 (25)
|
||
正数(3)
|
一边为非正 a<=0(26)
b<=0(27)
c<=0(28)
两边为非正 a<=0&b<=0(29)
a<=0&c<=0(30)
b<=0&c<=0(31)
三边为非正 a<=0、b<=0、c<=0(32)
|
||
输出域
|
一般三角形
|
a+b>c(4)
a+c>b(5)
b+c>a(6)
|
a+b<=c(33)
a+c<=b(34)
b+c<=a(35)
|
等腰三角形
|
a=b(7)
a=c(8)
b=c(9)
(且以上三个条件,两边之后大于第三边)
|
a!=b&a!=c&b!=c(36)
|
|
等边三角形
|
a=b=c(10)
|
a!=b=c (37)
a=b!=c (38)
a!=b!=c (39)
|
第二步:覆盖有效等价类,无效等价类
① 有效等价类覆盖
测试数据
|
预期结果
|
覆盖范围
|
6,7,8
|
一般三角形
|
(1)(2)(3)(4)(5)(6)
|
6,6,7
|
等腰三角形
|
(1)(2)(3)(4)(5)(6)(7)
|
6,7,6
|
(1)(2)(3)(4)(5)(6)(8)
|
|
6,7,7
|
(1)(2)(3)(4)(5)(6)(9)
|
|
6,6,6
|
等边三角形
|
(1)(2)(3)(4)(5)(6)(10)
|
②无效等价类覆盖
测试数据
|
预期结果
|
覆盖范围
|
0,1,2
|
不构成三角形
|
(11)
|
1,0,2
|
(12)
|
|
1,2,0
|
(13)
|
|
0,0,1
|
(14)
|
|
0,1,0
|
(15)
|
|
1,0,0
|
(16)
|
|
0,0,0
|
(17)
|
|
6,[],[]
|
(18)
|
|
[],7,[]
|
(19)
|
|
[],[],8
|
(20)
|
|
6,7,[]
|
(21)
|
|
6,[],8
|
(22)
|
|
[],7,8
|
(23)
|
|
6,7,8,9
|
(24)
|
|
[],[],[]
|
(25)
|
|
-1,1,2
|
(26)
|
|
1,-1,2
|
(27)
|
|
1,2,-1
|
(28)
|
|
-2,-1,1
|
(29)
|
|
-2,1,-1
|
(30)
|
|
1,-2,-1
|
(31)
|
|
-3,-2,-1
|
(32)
|
|
6,7,14
|
(33)
|
|
6,14,7
|
(34)
|
|
14,6,7
|
(35)
|
|
3,4,5
|
非等腰三角形
|
(36)
|
4,5,5
|
非等边三角形
|
(37)
|
4,4,5
|
(38)
|
|
4,5,6
|
(39)
|
黑盒用例设计方法后续内容,持续更新~~~