⏳前言
有了软件缺陷的暴露,我们就需要通过各种软件测试的方法来查找出软件的漏洞,编写出测试用例,及时修改bug。
在下面的这篇文章中,我们将谈论八大典型的黑盒测试方法,一起来学习⑧💡
一、等价类划分法
1、定义
一个程序可以有多个输入,等价类划分就是将这些输入数据按照输入需求进行分类,将它们划分为若干个子集,这些子集即为等价类(某个输入域的子集合),在每个等价类中选择有代表性的数据设计测试用例。
举个例子:
这种方法类似于学生站队,男生站左边,女生站右边,老师站中间,这样就把师生这整个群体划分成了三个等价类。
2、等价类划分法步骤
(1)先从程序规格说明书中找出各个输入条件; (2)再为每个输入条件划分等价类,形成若干互不相交的子集; (3)列出等价表
输入条件 | 有效等价类 | 无效等价类 |
…… | …… | …… |
3、设计测试用例步骤
等价类划分法设计测试用例要经历划分等价类(列出等价类表)和选取测试用例两步。
(1)划分等价类
等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的。测试代表值就等价于这一类其他值的测试。
那在划分等价类的时候,会出现有效等价类和无效等价类,这个时候我们需要怎么判断呢?
有效等价类就是有效值的集合,它们是符合程序要求、合理且有意义的输入数据。
无效等价类就是无效值的集合,它们是不符合程序要求、不合理或无意义的输入数据。
因此,在设计测试用例时,要同时考虑有效等价类和无效等价类的设计。
同时,在划分等价类的时候,需要遵循一定的划分原则:
等价类划分原则:
原则1:如果输入条件规定了取值范围或值的个数的情况下,可以确定一个有效等价类和两个无效等价类。
原则2:如果输入条件规定了输入值的集合或者规定了 “必须如何”的条件 的情况下,可以确立一个有效等价类和一个无效等价类。
原则3:如果输入条件是一个布尔量的情况下,可确定一个有效等价类和一个无效等价类。
原则4:如果规定了输入数据的一组值(假定n个),并且程序要对每一个输入值分别处理的情况下,可确定n个有效等价类和一个无效等价类。
原则5:如果规定了输入数据必须遵守的规则,可确定一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。
原则6:在确知已划分的等价类中,各元素在程序处理中的方式不同的情况下,则应再将该等价类进一步地划分为更小的等价类。
同一个等价类中的数据发现程序缺陷的能力是相同的,如果使用等价类中的其中一个数据不能捕获缺陷,那么使用等价类中的其他数据也不能捕获缺陷;同样,如果等价类中的其中一个数据能够捕获缺陷,那么该等价类中的其他数据也能捕获缺陷,即等价类中的所有输入数据都是等效的。
(2)设计测试用例
- 在确立了等价类之后,建立等价类列表,列出所有划分出的等价类。
- 为每个等价类规定一个唯一编号。
- 设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖的有效等价类。重复这一步,直到所有的有效等价类都被覆盖为止。
- 设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类。重复这一步,直到所有的无效等价类都被覆盖为止。
4、案例:学生选修课程
看到这里,不妨再做下案例分析。
案例1:每个学生可以选修1~3门课程,要求采用等价类设计测试用例。
解题思路:首先分析有效等价类和无效等价类,然后建立等价类表。
【解析】
(1)根据题干分析有效等价类和无效等价类:
有效等价类:选修1~3门课
无效等价类:没有选修课、选修3门课以上
(2)根据分析建立等价类表:
(3)根据等价类表设计测试用例覆盖有效等价类和无效等价类:
案例2:某连锁酒店集团实行积分奖励计划,会员每次入住集团旗下酒店均可以获得一定积分,积分由欢迎积分加消费积分构成。其中欢迎积分跟酒店等级有关,具体标准如表1-1所示;消费积分跟每次入住消费金额有关,具体标准为每消费1元获得2积分(不足1元的部分不给分)。此外,集团会员分为优先会员、金会员、白金会员三个级别,金会员和白金会员在入住酒店时可获得消费积分的额外奖励,奖励规则如表1-2所示。
表1-1 集团不同等级酒店的欢迎积分标准
表1-2 额外积分奖励规则
该酒店集团开发了一个程序来计算会员每次入住后所累积的积分,程序的输入包括会员级别L、酒店等级C和消费金额A(单位:元),程序的输出为本次积分S。其中,L为单个字母且大小写不敏感,C为取值1到6的整数,A为正浮点数且最多保留两位小数,S为整数。
【问题一】采用等价类划分法对该程序进行测试,等价类表如表1-3所示,请补充表中空(1)-(7)。
【问题二】根据以上等价类表设计的测试用例如下表所示,请补充表2-4中空(1)-(13)。
二、边界值分析法
1、边界值分析法概述
(1)边界值分析法是对软件的输入或输出边界进行测试的一种方法,它通常作为等价类划分法的一种补充测试。
(2)在等价类划分法中,无论是输入等价类还是输出等价类,都会有多个边界,而边界值分析法就是在这些边界附近寻找某些点作为测试数据,而不是在等价类内部选择测试数据。
2、设计测试用例
设计测试用例步骤:
(1)首先划分等价类,根据等价类划分情况确定边界情况。
(2)选取正好等于、刚刚大于、刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值。
3、边界值设计原则
原则1:如果输入条件规定了值的范围,则应取刚达到这个范围的边界的值,以及刚刚超越这个范围边界的值作为测试输入数据
原则2:如果输入条件规定了值的个数,则用最大个数、最小个数、比最小个数少1、比最大个数多1的数作为测试数据
原则3:根据规格说明的每个输出条件,使用前面的原则1。
原则4:根据规格说明的每个输出条件,使用前面的原则2。
原则5:如果程序的规格说明给出的输入域或输出域是有序集合,则应选取集合的第一个元素和最后一个元素作为测试用例。
原则6:如果程序中使用了一个内部数据结构,则应该选择这个内部数据结构边界上的值作为测试用例。
原则7:分析规格说明,找出其他可能的边界条件。
三、错误推测法
1、错误推测法概述
错误推测法就是人们可以靠经验和直觉推测程序中可能存在的各种错误,从而有针对性地编写检查这些错误的例子。
2、错误推测法基本思想
(1)列举出程序中所有可能有的错误和容易发生错误的特殊情况(比如,程序只能输入数字,测试时可以输入字母进行测试)。 (2)根据它们选择测试用例。
四、因果图设计法
1、因果图设计法概述
如果在测试时必须考虑输入条件的各种组合以及各种输出情况,那么可以使用一种适用于描述对于多种条件的组合,相应产生多个动作的形式来设计测试用例,这就需要利用因果图。
2、因果图表示
因果图使用一些简单的逻辑符号和直线将程序的因(输入)与果(输出)连接起来,一般原因用ci表示,结果用ei表示,各结点表示状态,可以取值“0”或“1”,其中“0”表示状态不出现,“1”表示状态出现。
如下图所示:
ci与ei之间有恒等、非(~)、或(∨)、与(∧)4种关系,分别为:
恒等:在恒等关系中,要求程序有一个输入和一个输出,输出与输入保持一致。若c1为1,则e1也为1,若c1为0,则e1也为0。
非:非使用符号“~”表示,在这种关系中,要求程序有一个输入和一个输出,输出是输入的取反。若c1为1,则e1为0,若c1为0,则e1为1。
或:使用符号“∨”表示,或关系可以有任意个输入,只要这些输入中有一个为1,则输出为1,否则输出为0。
与:使用符号“∧”表示,与关系也可以有任意个输入,但只有这些输入全部为1,输出才能为1,否则输出为0。
以下用一张图展示这4种关系:
总结:
- 在软件测试中,如果程序有多个输入,那么除了输入与输出之间的作用关系之外,这些输入之间往往也会存在某些依赖关系,某些输入条件本身不能同时出现,某一种输入可能会影响其他输入。
- 例如,某一软件用于统计体检信息,在输入个人信息时,性别只能输入男或女,这两种输入不能同时存在,而且如果输入性别为女,那么体检项就会受到限制。
3、约束条件
为了表示原因与原因之间,原因与结果之间可能存在的约束条件,在因果图中可以附加一些表示约束条件的符号。
(1)输入条件的约束类别可分为四种:
E(Exclusive,这些依赖关系在软件测试中称为“约束”,异)、I(at least one,或)、O(one and only one,唯一)、R(Requires,要求),在因果图中,用特定的符号表明这些约束关系。
- E(异):a和b中最多只能有一个为1,即a和b不能同时为1。
- I(或):a、b和c中至少有一个必须是1,即a、b、c不能同时为0。
- O(唯一):a和b有且仅有一个为1。
- R(要求):a和b必须保持一致,即a为1时,b也必须为1,a为0时,b也必须为0。
(2)输出条件的约束类别只有一种:
- 除了输入条件,输出条件也会相互约束,输出条件的约束只有一种M(Mask,强制),强制约束关系。若结果a是1,那么结果b强制为0。
4、设计测试用例
(1)因果图设计测试用例思想:
- 从程序规格说明书的描述中,找出因(输入条件)和果(输出结果或者程序状态的改变);
- 通过因果图转换为判定表;
- 为判定表中的每一列设计一个测试用例;
(2)使用因果图设计测试用例的步骤:
- 分析程序规格说明书描述内容,确定程序的输入与输出,即确定“原因”和“结果” 。
- 分析得出输入与输入之间、输入与输出之间的对应关系,将这些输入与输出之间的关系使用因果图表示出来。
- 由于语法与环境的限制,有些输入与输入之间、输入与输出之间的组合情况是不可能出现的,对于这种情况,使用符号标记它们之间的限制或约束关系。
- 将因果图转换为决策表,根据决策表设计测试用例。(决策表将在标题五判定表驱动法中提到)
5、优点
因果图法的优点:
- 考虑到了输入情况的各种组合以及各个输入情况之间的相互制约关系。
- 因果图的约束关系可以有效简化决策表,帮助测试人员高效率的开发测试用例。
- 因果图法是将自然语言规格说明转化成形式语言规格说明的一种严格的方法,可以指出规格说明存在的不完整性和二义性。
6、思考题
程序的规格说明要求:输入的第一个字符必须是#或*,第二个字符必须是一个数字,在此情况下进行文件的修改;如果第一个字符不是#或*,则给出信息N,如果第二个字符不是数字,则给出信息M。采用因果图法设计该软件的测试用例。
具体解析如下:
(1)分析程序规格说明中的原因和结果:
原因 | 结果 |
C1:第一个字符是# | e1:给出信息N |
C2:第一个字符是* | e2:修改文件 |
C3:第二个字符是一个数字 | e3:给出信息M |
(2)画出因果图:
注:10为导出结果的中间原因
(3)将因果图转换成判定表,3个条件一般可以有2³种组合
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ||
原因 | c1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
c2 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | |
c3 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | |
结果 | e1 | ✔ | ✔ | ||||||
e2 | ✔ | ✔ | |||||||
e3 | ✔ | ✔ |
(4)简化判定表,第7列和第8列合并
1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
原因 | c1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
c2 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | |
c3 | 1 | 0 | 1 | 0 | 1 | 0 | - | |
结果 | e1 | ✔ | ||||||
e2 | ✔ | ✔ | ||||||
e3 | ✔ | ✔ |
(5)根据判定表生成测试用例
测试用例ID | 输入数据 | 输出结果 |
1 | #3 | 修改文件 |
2 | #M | 给出信息M |
3 | *5 | 修改文件 |
4 | *A | 给出信息M |
5 | MM | 给出信息N |