|
引言:
黑盒测试是从软件的外部对软件实施测试,也常形容为闭着眼睛测试。在接下来的学习中将介绍几
种常用的黑盒测试方法,其中包括等价类划分、边界值分析、决策表测试等。
1. 等价类划分测试
等价类划分是一种典型的黑盒测试方法,该方法完全不考虑程序的内部结构,只根据对软件的要求
和说明,即需求规格说明,把程序输入域划分成若干个部分,然后从每个部分中选取少数有代表性
的数据作为测试输入。使用等价类划分方法设计测试用例,必须在分析需求规格说明的基础上划分
等价类。
等价类划分把程序的输入域划分成若干个互不相交的子集,称之为等价类。
所谓等价类是指输入域的某个子集合,所有等价类的并便是整个输入域,这对于测试有两个非常重
要的意义:完备性和无冗余性。
由于等价类由等价关系决定,因此等价类中的元素有一些共同的特点:如果用等价类中的一个元素
作为测试数据进行测试不能发现软件中的故障,那么使用等价类中的其他元素进行测试也不可能发
现故障。
如果测试数据全都从同一个等价类选取,除去其中一个测试数据对发现软件故障有意义外,使用其
他的测试数据进行测试都是徒劳,它们对测试工作的进展没有意义,不如把测试时间花在其他等价
类元素的测试中。
例如:三角形问题中,如果选择三元组(2,2,2)作为测试输入,可以判定这是一个等边三角形。
若再以三元组(100,100,100)或(5,5,5)作为测试输入,与测试用例(2,2,2)一样的方
式进行,它们具有等价的测试效果。因此,这些测试用例是冗余的。使用等价类划分测试的目的是
既希望进行
完备的测试,同时又希望避免冗。
传统的等价类划分测试的实现分两步进行,一是确定等价类,二是确定测试用例。
1.1 划分等价类
软件不能只接收有效地,合理的数据,还应经受意外的考验,即接受无效的或不合理的数据,这
样获得的软件才能具有较高的可靠性。因此,在考虑等价类时,应注意区别两种不同的情况。
(1)有效等价类
有效等价类是指对软件规格说明而言,是有意义的,合理的输入数据所构成的集合。
利用有效等价类,可以检验程序是否实现了规格说明预先的功能和性能。在具体问题中,有效等价
类可以是一个,也可以是多个。
(2)无效等价类
无效等价类是指对软件规格说明而言,是不合理或无意义的输入数据所构成的集合。
利用无效等价类,可以检查软件功能和性能的实现是否有不符合规格说明要求的地方。对于具体
的问题,无效等价类至少应有一个,也可能有多个。
以下给出几条确定等价类的原则:
(1)按区间划分
如果规格说明规定了输入条件的取值范围或值的数量,则可以确定一个有效等价类和两个无效等
价类。例如:如果软件规格说明要求输入的是1-12月中的一个月,则1-12定义了一个有效等价类
和两个无效等价类(月<1和月>12)。
(2)按数值划分
如果规格说明规定了输入数据的一组值,而且软件要对每个输入值分别进行处理。则可为每个输
入值确立一个有效等价类,此外针对这组确立一个无效等价类,它是所有不允许的输入值的集合。
(3)按数值集合划分
如果规格说明规定了输入值的集合,则可确定一个有效等价类和一个无效等价类。例如:某软件涉
及标识符,要求“标识符应以字母开头”,则“以字母开头者”作为一个有效等价类,“以非字母开头”为
一个无效等价类。
(4)按限制条件或规则划分
如果规格说明规定了输入数据必须遵守的规则或限制条件,则可以确立一个有效等价类(符合规则)
和若干个无效等价类(从不同角度违反规则)。
(5)细分等价类
等价类中的各个元素在程序中的处理各不相同,则可将等价类进一步划分成更小的等价类。
1.2 设计测试
在设计测试用例时,应同时考虑有效等价类和无效等价类侧似乎用例的设计。希望用最少的测试用例,
覆盖所有的有效等价类。但对每个无效等价类,设计一个测试用例来覆盖它即可。
根据已列出的等价类,按以下步骤确定测试用例:
(1)为每个等价类规定一个唯一的编号。
(2)设计一个新的测试用例,尽可能多的覆盖尚未被覆盖的有效等价类,重复这一步,知道测试用
例覆盖了所有的有效等价类。
(3)设计一个新的测试用例,使其覆盖并只覆盖一个还没有被覆盖的无效等价类。重复一步,直至
测试用例覆盖了所有的无效等价类。
注:通常程序发现一类错误后就不再检查是否还有其他错误,因此,应该使每个测试方案只覆盖一个
无效的等价类。
常见的等价类划分测试形式:
针对是否对无效数据进行检测,可以将等价类测试分为标准等价类测试和健壮等价类测试。
大多数有关软件测试的教材都讨论了健壮等价类测试的问题,这种形式的测试关注无效数据值,体现
了20世纪60-70年代的主流程序设计风格。随着现代程序设计语言的出现,特别像那些具有强数据类
型语言,图形用户界面语言的出现,使得输入数据的检验不再那么重要。
为了便于理解,这里以一个有两个输入变量x1和x2的程序F为例,说明标准等价类测试和健壮等价类测试。
假设,输入变量x1和x2在下列范围内取值。
a<=x1<=d,区间[a,b](b,c)[c,d]
e<=x2<=g,区间[e,f][f,g]
因此,变量x1和x2的无效等价类为x1<a,x1>d,x2<e,x2>g
1、标准等价类测试
不考虑无效数据值,测试用例使用每个等价类中的一个值。
2、健壮等价类测试
(1)对有效输入来说,测试用例从每个有效等价类中取一个值。
(2)对无效输入来说,一个测试用例有一个无效值,其他值都取有效值。
注:健壮等价类测试也有两个问题:一是规格说明往往没有定义无效测试用例的期望输出应该是什么
样的,因此测试人员需要花费大量的时间来定义这些测试用例的期望输出;二是强类型语言没有必要
考虑无效输入。
等价类划分测试举例:
1、三角形问题的等价类测试用例
(1)传统等价类划分测试用例设计
使用等价类划分方法必须仔细分析程序规范说明。在三角形问题中,输入条件为:
整数,3个数,取值在1-100之间
(2)标准和健壮等价类划分测试用例设计
在大多数情况下,从输入域划分等价类,但不是不能被测程序的输出与定义等价类,实际上,对于三
角形问题是最简单的方法。
三角形问题有4种可能输出:等边三角形,等腰三角形,一般三角形和非三角形。可确定下列输出等
价类。
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的不能形成三角形}
2、nextdate函数的等价类测试用例设计
Nextdate是一个含有三个变量的函数,则可定义为:
M1={month:1<=month<=12}
D1={day:1<=day<=31}
Y1={year:1912<=year<=2050}
相应的无效等价类是:
M2 ={month:month<1}
M3={month:month >12}
D2={day:day<1}
D3 ={day:day>31}
Y2 ={year:year<1912}
Y3 ={year:year>2050}
如果更仔细地选择等价关系,得到的等价类可能会更有用。
3、雇佣金问题的等价类测试用例设计
有效等价类:
L1={枪机:1<=枪机<=70}
L2 ={枪机:枪机=-1}
S1 ={枪托:1<=枪托<=80}
B1 ={枪管:1<=枪管<=90}
无效等价类:
L3={枪机:枪机=0或枪机<-1}
L4 ={枪机:枪机>70}
S2 ={枪托:枪托< 1}
S3 ={枪托:枪托>80}
B2 ={枪管:枪管<1}
B3={枪管:枪管>90}
无论是标准等价类还是健壮等价类测试用例,都知道一个是有效的等价类测试用例,很难判断雇佣金
问题的计算部分有没有问题,因此,输入域等价类划分不能产生令人满意的测试用例集合。对雇佣金
问题的输出值域定义等价类也许可以改进测试用例集合。
销售额=45*枪机+30*枪托+25*枪管
可以在佣金值域上定义3个等价类:
S1={<枪机,枪托,枪管>:销售额<=1000}
S2 ={<枪机,枪托,枪管>: 1000 <销售额<=1800}
S3={<枪机,枪托,枪管>:销售额>1800}
2.边界值分析
人们从长期的测试工作经验得知,大量的故障往往发生在输入定义域或输出值域的边界上,而不是在
内部。说明边界值分析、测试的最佳方式是,如果在悬崖峭壁边上可以自如行走那么在平地上行走就
更没有问题了。
但是,在软件设计和程序编写中,常常对规格说明中的输入域边界或输出域边界重视不够,以至于形
成一些差错。
实践表明,在设计测试用例时,对边界附近的处理必须给予足够的重视。为检验边界附近的处理设计
专门的测试用例,常常可以取得良好的测试效果。
使用边界值分析方法设计测试用例,首先应确定边界情况。输入等价类与输出等价类的边界,就是着
重测试的边界情况。
边界值分析方法的基本思想是:选取正好等于,刚刚大于或刚刚小于边界的值作为测试数据,而不是
选取等价类中典型值或任意值作为测试数据。
边界值分析方法是一种最有效的黑盒测试方法,但当边界情况和复杂的时候,要找出适当的边界测试
用例还需针对问题的输入域、输出域边界,耐心仔细的逐个进行考虑。
2.1 边界条件
边界条件是一些特殊的情况。程序在处理大量中间数值时都正确,但在边界处可能出现问题。
比如,在作三角形判断时,要输入三角形的3条边长a、b和c。我们知道,当满足a<b+c; b<a+c;c<
a+b时才能构成三角形。但如果把大于号改成大于等于号就无法构成三角形了。问题恰恰出现在那些
容易被疏忽的边界上。
实际上,边界条件就是软件操作界限所在的边缘条件。一些可能与边界有关的数据类型有:数值,速
度,字符,地址,位置,尺寸,数量等。同时,考虑这些数据类型的下述特征:
第一个/最后一个、最小值/最大值、开始/完成、超过/在内、空/满、最短/最长、最快/最慢、最早/
最迟、最高/最低、相邻/最远等。
|
|