黑盒测试的定义
黑盒测试又称功能测试,它是通过一系列测试用例来检测软件的功能是否正常。在黑盒测试中,我们把软件看成是一个黑盒子(不关注内部的实现原理),通过关注软件的输入输出结果,来判断软件是否存在问题。
黑盒测试主要有以下几种方法:
等价类划分法
等价类划分法将程序所有可能输入的数据划分为若干部分(子集),然后从每个子集中选取具有代表性的数据作为测试用例,测试用例包含有效等价类和无效等价类,二者间的区别为:
等价类 |
输入 |
关注点 |
有效等价类 |
合理的、有意义的 |
功能和性能 |
无效等价类 |
不合理的、无意义的 |
异常处理 |
例如一个Web登录界面中,需要输入用户的邮箱,那么有效等价类可以理解为符合邮箱格式规范的字符串集合,例如[email protected]
、[email protected]
等,无效等价类可以理解为不符合邮箱格式规范的字符串集合,例如123456
、abbbc@@
等字符串。
等价类划分法是一种典型的、常用的测试方法。在设计测试用例时,要同时考虑有效等价类和无效等价类的设计。软件不能只接收合理的数据,还要经受意外的考验,接受无效的或不合理的数据,这样软件才能具有较高的可靠性。
等价类划分方法
等价类划分主要有4种方法:
-
按双边区间划分
如果输入条件规定了取值范围,或者值得个数,则可以确定一个有效等价类和两个无效等价类。
例如一个用户的ID的取值范围是
[1000,9999] ,那么有效等价类为区间
[1000,9999] 中所有得ID,无效等价类为
(−∞,1000) 和
(10000,+∞)
-
按取值划分
如果规定了输入数据的一组值(假定n
个),且程序要对每一个输入值分别进行处理的情况下,可确定n
个有效等价类(每个值确定一个有效等价类)和一个无效等价类(所有不允许的输入值的集合)。
例如,程序输入x
取值于一个固定的枚举类型
{1,3,7,10},且程序中对这4个数值分别进行了处理。那么有效等价类为
x=1,3,7,10,无效等价类为
x=1,3,7,10。
-
按单边区间划分
如果输入条件规定了输入值的集合,这时可确立一个有效等价类和一个无效等价类。
例如,在头像上传API中,规定头像大小不能超过100KB,那么有效等价类为小于等于100K的图片,无效等价类为大于100K的图片。
-
按限制条件/规则划分
如果规定了输入数据必须遵守的规则或限制条件,可确定一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。
例如规定了输入数据为非0正整数,那么有效等价类为非0的正整数,无效等价类为0、字符串、负数、小数等。
等价类测试的类型
等价类测试的类型按照测试用例的完整性划分,具体可以划分为两个大类:弱等价类测试,强等价类测试。其中,强等价类测试可以再划分为弱一般等价类测试和弱健壮等价类测试。强等价类测试可以划分为强一般等价类测试、强健壮等价类测试。
所谓弱,是指从各个等价类中选取值时只考虑等价类自身,查出的缺陷属于“单缺陷”,即单一因素造成的缺陷。所谓强,是指考虑了等价类之间的相互影响,查出的缺陷属于多种因素造成的“多缺陷”。
从测试用例的选型上来看:
- 弱:单缺陷假设,不考虑取值组合的情况
- 强:多缺陷假设,考虑取值组合的情况
在“一般”和“健壮”上:
- 一般:不考虑无效值(无效等价类,即异常区域)
- 健壮:考虑无效值
综上所述,这四种等价类测试类型可以理解为:
-
弱一般等价类测试
单缺陷假设(取值不组合),不考虑异常区域。在设计测试用例上:
1、对于有效输入,取每个有效等价类的一个值
2、对于无效数据,不考虑(不取无效等价类)
-
强一般等价类测试
多缺陷假设(取值组合),不考虑异常区域测试用例的设计时需要考虑等价类之间的相互作用,选取等价类的笛卡尔积的元素值来实现。在设计测试用例上:
1、对于有效输入,考虑有效等价类之间的组合
2、对于无效输入,不考虑
-
弱健壮等价类测试(传统的等价类测试类型)
基于单缺陷假设,考虑无效等价类,选取的测试用例要覆盖每一个有效等价类和无效等价类,但时不能同时覆盖两个无效等价类。
-
强健壮等价类测试
每个无效等价类和有效等价类的组合都要覆盖到,考虑所有的有效和无效情况。
边界值分析法
软件的很多错误都是发生在输入或者输出范围的边界上,而不是输入输出范围的内部,所以边界值分析法也就诞生了。边界值分析法是一种对输入或输出的边界值进行测试的一种黑盒测试方法,是作为对等价类划分法的补充,这种情况下,其测试用例来自等价类的边界。
边界点
边界点分为上点、内点和离点:
下面一系列图片中,蓝色的为上点,橘色为离点,绿色为内点:
边界值分析使用与等价类划分法相同的划分,只是边界值分析假定错误更多地存在于划分的边界上,因此在等价类的边界上以及两侧的情况设计测试用例。
设计测试用例的方法
-
如果输入条件规定了值的范围
则应取刚达到这个范围的边界的值,以及刚刚超越这个范围边界的值作为测试输入数据。
例如程序的需求文档中提到:“如果身高在170cm至180cm,则…”,那么测试数据应当选取170
和180
,还应当选取170.1
、169.9
、179.9
、180.1
等。
-
如果输入条件规定了值的个数
则用最大个数,最小个数,比最小个数少一,比最大个数多一的数作为测试数据。
例如ID的范围应当是
[1,1000],那么测试数据可以取值为1
、1000
、0
、1001
。
-
如果输出条件规定了值的范围
则应取刚达到这个范围的边界的值,以及刚刚超越这个范围边界的值作为测试输入数据。
-
如果输出条件规定了值的个数
则用最大个数,最小个数,比最小个数少一,比最大个数多一的数作为测试数据。
-
分析需求,找出其它可能的边界条件
边界值分析法类型
假设变量
x1、
x2 的取值范围分别是
[a,b]、
[c,d]
-
一般边界条件测试用例设计法
该方法生成的测试用例有
4n+1 个,分别是
{a,b,c,d,a+,b−,c+,d−,normal}
-
健壮性边界条件测试用例设计法
取值包含
{a,b,c,d,a+,a−,b−,b+,c+,c−,d+,d−,normal},一共是
6n+1 个测试用例
-
最坏边界条件测试用例设计法
测试用例一共有
5n 个
-
健壮最坏边界条件测试用例设计法
测试用例包含
7n 个
判定表
等价类划分法和边界值分析方法比较适合输入变量或输入条件相互独立的情况,但是当输入变量或输入条件相互依赖、相互制约的时候,采用等价类划分法和边界值分析方法是难以描述的,测试效果也很难保障,而判定表驱动法就是为了解决这类问题。
什么是判定表驱动法?
判定表驱动法(或决策表法) 是根据需求描述建立判定表后,导出测试用例的方法。在所有的黑盒测试方法中,基于判定表的测试是最为严格、最具有逻辑性的测试方法,并且可以设计出完整的测试用例集合。
什么是判定表?
判定表(也称决策表)是一个用来表示条件和行动的二维表,是分析和表达多逻辑条件下执行不同操作的情况的工具。
判定表类型
- 有限条目判定表
所有条件都是二值条件,即真或假
- 扩展条目判定表
条件可以有多个值
实例——阅读指南判定表
上述判定表可以简化,简化规则主要有:
- 规则合并
若两条或多条规则的动作项相同,条件项只有一项不同,则可将该项合并,合并后的条件项用符号“-”表示,说明执行的动作与该条件的取值无关,称为无关条件。
如图a表示了两个柜子的动作项一致,条件项中的第三条件的取值不同,这表示在第一、第二条件分别取真值和假值时,第三条件不论取何值,都执行同一动作。就是说要执行的动作与第三条件的取值无关。这样,我们将这两条规则合并,合并后的第三条件取值用“—”表示,以示与取值无关。
- 规则包含
无关条件项“-”在逻辑上又可包含其他的条件项取值,
具有相同动作的规则还可进一步合并。
按照上述规则,我们可以对“阅读指南判定表”进行合并:
合并后:
继续合并:
判定表的建立步骤
- 列出所有条件桩和动作桩
在上述例子中,条件桩有:你觉得疲倦吗?、你对内容感兴趣吗?书中内容使你糊涂吗?
动作桩有:请回到本章开头重读、继续读下去、跳到下一章去读、停止阅读休息
- 确定规则的个数
在上述例子中,规则个数为12
- 填入条件项
- 填入动作项
- 简化判定表
因果图法
当输入条件过多时,使用判定表会产生大量测试用例,而且也不能覆盖条件之间的先后关系,因果图法就解决了这个问题。
因果图法(Cause-Effect Graphics)是一种利用图解法分析输入的各种组合情况,从而设计测试用例的方法。
- 因果图提供了一个把需求转化为判定表的系统化方法
- 因果图法最终生成的就是判定表,它适合于检查程序输入条件的各种组合情况。
与判定表法相比,因果图法存在以下优缺点:
- 优点:
能把复杂的问题按各种可能的情况一一列举出来,简明而易于理解,也可避免遗漏。
可以指出需求规格说明书的不完整性和不明确之处。
- 缺点:
不能表达重复执行的动作,例如循环结构。
当条件和动作关系不明确,先使用因果图
如果需求是以判定表形式给出的、项目在设计阶段就采用了判定表,则直接用判定表设计测试用例。
因果图关系符号
因果图关系符号有4种:恒等、非、或、与
c 表示原因,通常在图的左部,
e 表示结果,通常在图的右部。
c 和
e 均可取值为0或1,0表示状态不发生,1表示状态发生。
- 恒等
表示原因和结果之间一对一的关系,若原因出现,则结果出现;若原因不出现,则结果也不出现。
如图,在
c1=1 的情况下
e1=1,在
c1=0 的情况下
e1=0。
- 非
表示原因与结果之间的一种否定关系。若原因出现,则结果不出现;若原因不出现,反而结果出现。
如图,在
c1=1 的情况下
e1=0,在
c1=0 的情况下
e1=1。
- 或
表示若几个原因中有一个出现,则结果出现;只有当这几个原因都不出现时,结果才不出现。
如图,如果
c1 或者
c2 或者
c3 是1,那么
e1=1,只有在
c1=c2=c3=0 的情况下
e1=0。
- 与
表示若几个原因都出现,结果才出现;若几个原因中有一个不出现,结果就不出现。
当
c1=c2=1 时,
e1=1,其它情况
e1=0。
因果图约束符号
- 约束(异/互斥)
表示几个原因不会同时成立,可能他们都不成立,但最多有一个成立。
如图,a和b中至多有一个可能为1,即a和b不能同时为1。
- 约束
表示几个原因中至少有一个必须成立,当然也可能都成立。
如图,a、b和c中至少有一个必须是1,即 a、b 和c不能同时为0。
- 约束(唯一)
表示几个原因中必须有且仅有一个成立。
如图,a和b必须有一个,且仅有1个为1。
- 约束(要求)
表示当a出现时,b必须也出现。
如图,a是1时,b必须是1,即不可能a是1时b是0。
- 约束(屏蔽)
表示当a是1时,b必须是0;而当a为0时,b的值不一定
设计用例的步骤
- 分析软件需求规格说明中哪些是原因(即输入条件或输入条件的等价类),哪些是结果(即输出条件),并给每个原因和结果赋予一个标识符。
- 分析软件规格说明中的语义,找出原因与结果之间、原因与原因之间对应的关系, 根据这些关系画出因果图。
- 由于语法或环境的限制,有些原因与原因之间、原因与结果之间的组合情况不可能出现。为表明这些特殊情况,在因果图上用一些记号表明约束或限制条件。
- 把因果图转换为判定表。
- 根据判定表中的每一列设计测试用例。
案例
某软件的一个模块的需求规格说明书中描述:
- 年薪制员工:严重过失,扣年终风险金的4%;过失,扣年终风险金的2%。
- 非年薪制员工:严重过失,扣当月薪资的8%;过失,扣当月薪资的4%。
请绘制出因果图和判定表,并给出相应的测试用例。
首先分析原因和结果:
原因 |
结果 |
C1:年薪制员工 |
A1:扣年终风险金的4% |
C2:非年薪制员工 |
A2:扣年终风险金的2% |
C3:严重过失 |
A3:扣当月薪资的8% |
C4:过失 |
A4:扣当月薪资的4% |
然后画出因果图:
根据因果图也可将其转换为决策表: