51Testing软件测试论坛

标题: 黑盒测试简介以及方法简介 [打印本页]

作者: 一月蔷薇_456    时间: 2018-2-27 16:34
标题: 黑盒测试简介以及方法简介
引言:
黑盒测试是从软件的外部对软件实施测试,也常形容为闭着眼睛测试。在接下来的学习中将介绍几
种常用的黑盒测试方法,其中包括等价类划分、边界值分析、决策表测试等。

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时才能构成三角形。但如果把大于号改成大于等于号就无法构成三角形了。问题恰恰出现在那些
容易被疏忽的边界上。

实际上,边界条件就是软件操作界限所在的边缘条件。一些可能与边界有关的数据类型有:数值,速
度,字符,地址,位置,尺寸,数量等。同时,考虑这些数据类型的下述特征:
    第一个/最后一个、最小值/最大值、开始/完成、超过/在内、空/满、最短/最长、最快/最慢、最早/
最迟、最高/最低、相邻/最远等。



作者: 一月蔷薇_456    时间: 2018-2-27 16:35
2.2  次边界条件

有些边界在软件内部,用户几乎是看不到,但软件测试仍有必要对这些边界条件进行检查,这样的边
界条件称为次边界条件或内部边界条件。2的幂次方和ASCII码就是这种例子。
寻求次边界条件比较困难,虽然不要求软件测试人员成为程序员或者具有阅读源代码的能力,但要求
软件测试员能大体了解软件的工作方式。

一、2的幂次方

     计算机中的数是用二进制数“0”和“1”来表示的,8位二进制数组成一个字节,4个字节组成一个字。
对于一些常用的2的幂次方对应十进制数的表示范围或值,是作为边界条件的重要数据。但它们通常
在软件内部使用,外部是看不见的除非用户提出这些范围,否则在软件需求规格说明中不会明确指出。
       进行软件测试时,要考虑是否需要对这些边界条件进行测试。

     例如,假如某种通信协议支持256条命令,为了提高数据传输效率,通信软件总是将常用的信息
压缩到一个很小的单元中,必要时再扩展为大一些的单元。比如,将常用的15条命令压缩为一个半
字节数据,在遇到第16-256之间的命令时,软件转而发送一个一字节的命令。用户只知道可以执行
256条命令,并不知道软件根据半字节/字节边界执行了不同的计算和操作。为了覆盖所有可能的2的
幂次方边界
,还要考虑临近半字节边界的14、15和16,以及临近字节边界254、255和256。


二、ASCII表

   数字0-9的ASCII值是48-57。斜杠字符(/)在数字0前面,而冒号字符(:)在数字9后面。大写
字母A-Z对应的ASCII码值是65-90。小写字母对应的ASCII码值是97-122.这些情况都表示次边界条件。
   如果对文本输入或文本转换软件进行测试,在考虑数据区间包含哪些值时,最好参考一下ASCII表。
例如,如果测试的文本框只接受用户输入字符A-Z和a-z,就应该在非法区间中,检测ASCII表中位于
这些字符前后的值——@、[、‘和{。


2.3  边界值分析测试

实际上,边界值测试更适于采用非强类型语言编写的程序。边界值分析测试的基本原理是故障往往
出现在输入变量的边界值附近。例如,当循环条件本应判断“<=”时,却错写成了“<”;计数器少记
一次等。美国陆军对其软件进行了研究,发现有相当一部分的故障是由边界值引起的。
边界值分析基于一种在可靠性理论中称为“单故障”的假设,即由两个或两个以上的故障同时出现而
导致软件失效的情况很少,也就是说,软件失效是由单故障引起的。边界值分析利用输入变量的最
小值min,稍大于最小值min+、域内任意值nom、稍小于最大值max-和最大值max来设计测试用例,
即通过使所有变量取正常值,只使一个变量分别取最小值,稍大于最小值、域内任意值、稍小于最大
值和最大值。
不管采用什么语言,变量的min、min+、nom、max-和max值根据语境可以清楚地确定。例如雇佣
金问题中的变量,其min、min+、nom、max-和max值很容易确定。如果没有显示地给出边界,例
如三角形问题,可以人为地设定一个边界。显然,边的下界是1,但如何确定上界呢?在默认情况下,
可以取最大可表示的整型值,或者规定一个数作为上界,如100或1000。


2.4   健壮性测试


   健壮性测试是边界分析测试的一种扩展,变量除了取min、min+、nom、max-和max5个边界值外,
还要考虑采用一个略超过最大值max+以及略小于最小值min-的取值,看看超过极限值时系统会出现什
么情况。
边界值分析的大部分讨论都可直接用于健壮性测试。健壮性测试最有意义的部分不是输入,而是预
期的输出。

边界值分析举例:

前面3个例子的每一个都是一个含有3个输入变量的函数。给出每个例子的所有边界值分析测试用例
非常浪费空间,所以,下面只列出一部分测试用例。
1、三角形问题的边界值分析测试用例设计。
在三角形问题描述中,除了要求边长是整数外,没有给出其他的限制条件。显然,边长下界为1,
上界可取100。
2、nextdate函数的边界值分析测试用例设计
在nextdate函数中,规定了变量month、day、year相应的取值范围,即1<=month<=12,1<=day
<=31和1912<=year<=2050。
3、雇佣金问题的边界值分析测试用例设计
对雇佣金问题,考虑输出域的边界值,尤其是在$1000和$1800这两个临界点附近。用输出值域来
确定测试用例,部分原因是因为在不同的销售额范围内,雇佣金按不同比例计算,想找出边界值在
$100、$1000、$1800以及$7800上的输入变量组合。

2.5  边界值分析的局限性

当被测程序含有多个独立变量,这些变量又受物理量的制约时,使用边界分析侧似乎方法比较适
合,关键是“独立”和“物理量”。
简单地看一下nextdate函数的边界值分析测试用例,就会发现这些测试用例是不充分的,例如,
没有强调对2月和闰年的测试。问题的根源是,边界值分析假设变量是独立的,而month、day和
year变量之间存在某些依赖关系。

边界值分析不适用逻辑变量和布尔型变量。比如,作为逻辑变量的一个例子,很难想象0000、0001、
5000、9998和9999这样的数字或电话号码会发生什么故障。尽管边界值分析测试很有用,但实际
运用中,并不如测试人员预想的那样令人满意。
基于函数(程序)输入定义域的测试方法,是所有测试方法中最基本的。这类测试方法都有一种假
设,即输入变量是真正独立的,如果不能保证这种假设,则这类方法不能产生令人满意的测试用例
(如:1912年2月31日)。这些方法可以应用于程序的输出值域,就像在雇佣金问题中所做的一样。


3.决策表测试

所有的黑盒测试方法中,基于决策表的测试最为严格,最具有逻辑性的测试方法。
在一些数据处理问题中,某些操作的实施依赖于多个逻辑条件的组合,即针对不同逻辑条件的组
合之,分别执行不同的操作,决策表很适合处理这类问题。

3.1  决策表

决策表通常由4部分组成:条件桩、条件项、动作桩和动作项。
条件桩分列出问题的所有条件,除了某些问题对条件的先后次序有特定的要求外,通常在这里列出
的条件其先后次序无关紧要。条件项部分对条件桩给出的条件列出所有可能的取值。动作桩则给出
了问题规定的可能采取的操作,这些操作的排列顺序一般没有什么约束。动作项指出在条件项的各
组取值情况下应采取的动作。
把任何一个条件组合的特定取值及相应要执行的动作称为一条规则,在决策表中贯穿条件项和动作
项的一列就是一条规则。显然,决策表中列出多少组条件取值,就有多少条规则。

若表中有两条或多条规则具有相同的动作,并且在条件项之间存在着极为相似的关系,便可以设法
将其合并。
结合三角形问题给出构造决策表的5个步骤如下:
  (1)确定规则的个数。例如,三角形问题的决策表有4个条件,每个条件可以取两个值,故应有16
种规则。
(2)列出所有的条件桩和动作桩。
(3)填入条件项。
(4)填入动作项,这样便可得到初始决策表。
(5)简化。


3.2   决策表测试的指导方针


基于决策表测试适合于要产生大量决策的情况(如:三角形问题),或者输入变量之间存在重要
的逻辑关系的情况(如:nextdate函数)。
决策表测试方法适用于具有以下特征的应用 程序:
1、if-then-else逻辑突出
2、输入变量之间存在逻辑关系
3、设计输入变量子集的计算
4、输入与输出之间存在因果关系

适合于使用决策表设计测试用例的情况有:
1、规格说明以决策表形式给出,或者是很容易转换成决策表
2、条件的排列顺序不会也不应影响执行的操作
3、规则的排列顺序不会也不应影响执行的操作
4、当某一规则的条件已经满足,并确定要执行的操作后,不必检验别的规则
5、如果某一规则要执行多个操作,这些操作的执行顺序无关紧要
      给出这些情况的目的是为了说明操作的执行应完全依赖于条件的组合。其实对于某些不满足
这几条的决策表,同样可以用设计测试用例,只不过需增加一些其他的测试用例罢了。


决策表规模较大,有N个条件的有限条目决策表(每个条件取真、假值)有2n个规则。现在已有
多种方法可以解决这个问题——扩展条目决策表(条件使用等价类)、代数简化表,将大表“分解
”为小表等方法。
与其他方法一样,迭代也比较有效。第一次识别的条件或动作可能不那么令人满意,把第一次得
到的结果作为铺路石,逐渐改进,直到得到满意的决策表为止。


4.因果图

等价类划分和边界值分析方法,着重考虑输入条件,不考虑输入条件的各种组合,也不考虑各
个输入条件之间的相互制约关系。
如果在测试时必须考虑输入条件的各种组合,可能的组合数将是一个天文数字,因此必须考虑
使用一种适合于描述多种条件的组合,产生多个相应动作的测试方法,这就需要因果图。

因果图方法能够帮助测试人员按照一定的步骤,高效率地开发测试用例,以检测程序输入条件的
各种组合情况。它是将自然语言规格说明转化成形式语言规格说明的一种严格的方法,可以指出
规格说明中存在的不完整性和二义性。

因果图中使用了简单的逻辑符号,以直线连接左右结点。左结点表示输入状态,右结点表示输
出状态。因果图用4种符号分别表示规格说明中的4种因果关系。
在实际问题中,输入状态相互之间还可能存在某些依赖关系,称之为:“约束”。比如,某些输
入条件本身不可能同时出现。输出状态之间也往往存在约束。

对于输入条件的约束有以下4种:
1、E约束:a和b中最多有一个可能为1,即a和b不能同时为1。
2、I约束:a、b和c中至少有一个必须是1,即abc不能同时为0。
3、O约束:a和b必须有一个且仅有一个为1。
4、R约束;a是1时,b必须是1,即当a是1时,b不能是0。
输出条件的约束只有M约束:若结果a是1,则结果b强制为0。

因果图方法最终生成决策表。利用因果图导出测试用例需要见过以下几个步骤:
1、分析程序规格说明中哪些是原因,哪些是结果。原因常常是输入条件或输入条件的等价类,
结果则是输出条件。
2、分析程序规格说明中语义的内容,找出原因与结果之间,原因与原因之间的对应关系,并
将其表示成连接各个原因与各个结果的“因果图”。
3、由于语法或环境的限制,有些原因与原因之间,原因与结果之间的组合情况不可能出现。
为表明这些特定的情况,在因果图上使用一些记号表明约束或限制条件。
4、把因果图转换成决策表。
5、根据决策表中每一列设计测试用例。


作者: libingyu135    时间: 2018-4-24 15:38
666666666666




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2