1
 软件工程
1.7.2.3 5.2.3 黑盒测试

5.2.3 黑盒测试

黑盒测试,又称为功能测试、数据驱动测试或基于规格说明的测试,是一种从用户观点出发的测试。用这种方法进行测试时,把被测程序当做一个黑盒,在不考虑程序内部结构和内部特性,测试者只知道该程序输入和输出之间的关系或程序的功能的情况下,依靠能够反映这一关系和程序功能需求说明书,来确定测试用例并推断测试结果的正确性。软件的黑盒测试被用于证实软件功能的正确性和可操作性。

使用白盒测试设计测试用例时,只需选择一个覆盖标准,而使用黑盒测试进行测试,则应该同时使用多种黑盒测试方法,才能得到较好的测试效果。

黑盒测试注重于测试软件的功能需求,主要试图发现下列几类错误:功能错误或遗漏、性能错误、初始化和终止错误、界面错误、数据结构或外部数据库访问错误。

黑盒测试常用的测试方法包括等价划分法、边界值分析法、错误推测法和因果图法。但是没有一种方法能提供一组完整的测试用例,以检查程序的全部功能,因而在实际测试中需要把各种方法结合起来使用。

1.等价划分法

等价划分法是黑盒测试的一种方法。穷尽的黑盒测试需要使用所有有效的和无效的输入数据来测试程序,这通常是不现实的。因此,只能选取少量有代表性的输入数据,以期用较小的代价暴露出较多的程序错误。

这种方法是把被测试的程序的所有可能的输入数据(有效的和无效的)划分成若干个等价类,把无限的随机测试变成有针对性的等价类测试。按这种方法可以合理地做出下列假定:每个类中的一个典型值在测试中的作用与这一类中所有其他值的作用相同。因此,可以从每个等价类中只取一组数据作为测试数据。这样可选取少量有“代表性”的测试数据,来代替大量相类似的测试,从而大大减少总的测试次数。

设计等价类的测试用例一般分为两步进行:第一步,划分等价类并给出定义;第二步,选择测试用例。

选择的原则:有效等价类的测试用例尽量公用,以期进一步减少测试的次数;无效等价类必须每类一个用例,以防漏掉本来可能发现的错误。

划分等价类时,需要研究程序的功能说明,以确定输入数据的有效等价类和无效等价类。在确定输入数据的等价类时常常还需要分析输出数据的等价类,以便根据输出数据的等价类导出对应输入数据的等价类。

1)启发式规则

划分等价类需要经验,下述几条启发式规则可能有助于等价类的划分。

(1)如果规定了输入值的范围,则可划分出一个有效的等价类(输入值在此范围内)、两个无效的等价类(输入值小于最小值和大于最大值)。

(2)如果规定了输入数据的个数,则可以类似地划分出一个有效的等价类和两个无效的等价类。

(3)如果规定了输入数据的一组值,而且程序对不同输入值做不同处理,则每个允许的输入值是一个有效的等价类,此外还有一个无效的等价类(任意一个不允许的输入值)。

(4)如果规定了输入数据必须遵循的规则,则可以划分出一个有效的等价类(符合规则)和若干个无效的等价类(从不同角度违反规则)。

(5)如果规定了输入数据为整型,则可以划分出正整数、零和负整数3个有效类。

(6)如果程序的处理对象是表格,则应该使用空表,以及一项或多项的表。

以上列出的启发式规则只是测试时可能遇到的情况中很小的一部分,实际情况千变万化,根本无法一一列出。为了正确划分等价类,一要注意积累经验,二要正确分析被测程序的功能。此外,在划分无效等价类时,还必须考虑编译程序的检错功能,一般说来,不需要专门设计测试数据去测试那些编译程序肯定能发现的错误。最后说明一点,上面列出的启发式规则虽然都是针对输入数据而言的,但是其中绝大部分也同样适用于输出数据。

2)根据等价类设计测试用例的步骤

(1)设计一个新的测试用例以尽可能多地覆盖尚未覆盖的有效等价类,重复这一步骤直到所有有效等价类都被覆盖为止;

(2)设计一个新的测试用例,使它覆盖一个而且只覆盖一个尚未覆盖的无效等价类,重复这一步骤直到所有无效等价类都被覆盖为止。

注意:通常程序发现一类错误后就不再检查是否还有其他错误,因此,应该使每个测试用例只覆盖一个无效等价类。下面举例说明。

例5-1 某城市的电话号码由3部分组成,这3部分的名称和内容分别如下:

地区码,空白或三位数字;

前缀,非“0”或“1”开头的三位数;

后缀,四位数字。

假定被测试的程序能接收一切符合上述规定的电话号码,拒绝所有不符合规定的电话号码,就可用等价分类法来设计它的测试用例。

解 第一步:划分等价类,包括44个有效等价类、11个无效等价类。表5-1列出了划分的结果。在每个等价类之后加有编号,以便识别。

表5-1 电话号码程序的等价类

img56

续表

img57

第二步:确定测试用例,见表5-2。

表5-2 电话号码程序的测试用例

img58

2.边界值分析

在软件的设计和程序编写中,常常对规格说明中的输入域边界或输出域边界不够注意,以致形成一些差错。实践表明,在设计测试用例时,对边界处的处理应给予足够的重视,为检验边界附近的处理专门设计测试用例,常常取得良好的测试效果。

例如,在作三角形计算时,要输入三角形的3个边长:A、B和C。我们应注意到这3个数值应当满足A+B>C、A+C>B及B+C>A时才能构成三角形。但如果把3个不等式的任何一个大于号“>”错写成大于等于号“≥”,那就不能构成三角形。问题恰恰出现在容易被疏忽的边界附近。这里所说的边界是指,对于输入等价类和输出等价类,稍高于其边界值及稍低于其边界值的一些特定情况。

针对边界值设计测试用例时,应注意遵循以下几条原则。

(1)如果输入条件规定了取值范围,或是规定了值的个数,则应以该范围的边界内及刚刚超出范围的边界外的值,或是分别对最大个数、最小个数及稍小于最小个数、稍大于最大个数作为测试用例。例如,如果程序的规格说明中规定:“重量在10kg至50kg范围内的邮件,其邮费计算公式为……”。作为测试用例,我们应取10及50,还应取10.01、49.99、9.99及50.01等。如果另一问题的规格说明规定:“某输入文件可包含1~255个记录”,则测试用例可取1和255,还应取0和256等。

(2)针对规格说明的每个输出条件使用前面的第(1)条原则。例如,某程序的规格说明要求计算出“每日保险金扣除额为0~1165.25元”,其测试用例可取0.00及1165.25,还应取-0.01及1165.26等。如果另一程序属于情报检索系统,要求每次“最多显示四条情报摘要”,这时我们应考虑的测试用例包括1和4,还应该包括0和5等。

(3)如果程序规格说明中提到的输入域或输出域是个有序集(如顺序文件、表格等),就应注意选取有序集的第一个和最后一个元素作为测试用例。

(4)分析规格说明,找出其他的可能边界条件。

以下给出实例,说明在具体问题中,边界值是怎样考虑的。

例5-2 一个为学生考试试卷评分和成绩统计的程序,其规格说明指出了对程序的下列要求。

“程序的输入文件由80个字符的一些记录组成,这些记录分为三组。

第一组记录为标题。这一组只有一个记录,其内容为输出报告的名字。

第二组记录为试卷各题的标准答案。每个记录均在第80个字符处标以数字“2”。该组的第一个记录的第1~3个字符为题目编号(取值1~999),第10~59个字符给出第1~50题的答案(每个合法字符表示一个答案)。该组的第2,第3,…条对应的记录为第51~100,第101~150,…题的答案。

第三组记录描述了每个学生的答卷。该组中每个记录的第80个字符均为数字“3”。每个学生的答卷在若干个记录中给出。如甲的首记录第1~9字符给出学生姓名及学号,第10~59字字符列出的是甲所做的第1~50题的解答;若试题数超过50,则其第2,第3,…条记录分别给出他的第51~100,第101~150,…题的解答。然后是学生乙的答卷记录。”

若学生最多为200人。该程序的输出报告有4个:按学生学号排序,每个学生的成绩(答题正确百分比)和等级报告;按学生得分排序,每个学生的成绩;按平均分数排序,取最高分与最低分之差;按题号排序,每题学生答对百分比。

解 以下将分别针对输入条件和输出条件,考虑其边界值设置测试用例,如表5-3所示。

表5-3 成绩统计程序边界测试用例表

img59

续表

img60

续表

img61

以上共计44个测试用例,其中有些如果不采用边界值分析方法很难考虑到,然而这些确是很容易发生的问题,可见边界值分析是很有效的方法。

3.错误推测法

使用边界分析法和等价划分技术,可以帮助开发者设计具有代表性的,容易暴露程序错误的测试用例。但是,不同类型、不同特点的程序通常又有一些特殊的容易出错的情况。此外,有时分别使用每组测试数据时程序都能正常工作,这些输入数据的组合却可能检测出程序的错误。一般来说,即使是一个比较小的程序,可能的输入组合数也往往十分巨大,因此必须依靠测试人员的经验和直觉,从各种可能的测试用例中选出一些最可能引起程序出错的方案。对于程序中可能存在哪类错误的推测,是挑选测试用例时的一个重要因素。

错误推测法在很大程度上靠直觉和经验进行。它的基本想法是根据它们选择测试用例列举出程序中可能有的错误和容易发生错误的特殊情况。对于程序中容易出错的情况也有一些经验总结,如果输入数据为零或输出数据为零,则往往容易发生错误;如果输入或输出的数目允许变化(如被检索的或生成的表的项数),则输入或输出的数目为0和1的情况(如表为空或只有一项)是容易出错的情况。还应该仔细分析程序规格说明书,注意找出其中遗漏或省略的部分,以便设计相应的测试用例,检测程序员对这部分的处理是否正确。

例如,当对一个排序程序进行测试时,可先用边界值分析法设计测试用例,即

输入表为空表;

输入表中仅有一个数据;

输入表为满表;

再用错误推测法补充一些例子:

输入表已经排好了序;

输入表的排序恰与所要求的顺序相反(如程序功能为由小到大排序,输入表则为由大到小排序);

输入表中的所有数据全部相同。

此外,经验表明,在一段程序中已经发现的错误数目往往和尚未发现的错误数目成正比。因此,在进一步测试时要着重测试那些已发现较多错误的程序段。

4.因果图法

前面介绍的等价分类法和边界值分析法都只是孤立地考虑各个输入数据的测试功能,而都没有考虑到输入数据的各种组合,以及输入条件之间的相互制约关系。而因果图法正好解决了这个问题。

因果图是一种形式化语言,是一种组合逻辑网络图。它是把输入条件视为“因”,把输出或程序状态的改变视为“果”,将黑盒看成是从因到果的网络图,采用逻辑图的形式来表达功能说明书中输入条件的各种组合与输出的关系。

因果图法的基本原理是通过因果图,把用自然语言描述的功能说明转换为判定表,然后为判定表的每一列设计一个测试用例,其步骤如下。

(1)分析规范。规范是指规格的说明描述,如输入/输出的条件及功能、限制等。分析程序规格说明的描述中哪些是原因,哪些是结果。原因常常是输入条件或是输入条件的等价类,而结果是输出条件。

(2)标识规范。标识出规范中的原因与结果,并对每个原因、结果赋予一个标识。

(3)画出因果图。分析规范语义、内容,找出原因与结果之间、原因与原因之间的对应关系,画出因果图。此外,由于语法或环境的限制,有些原因和结果的组合情况是不可能出现的,所以在因果图上需要使用若干个特殊的符号来标明约束条件。

因果图的基本符号和限制符号分别如图5-4和图5-5所示。

img62

图5-4 因果图的基本符号

(4)转换为判断表。将因果图转换为有限项判断表。

(5)设计测试用例。为判定表中每一列表示的情况,设计一个测试用例。

由于因果图法最终生成的是判断表,所以它适合于设计检查程序输入条件的各种组合情况的测试用例。

下面举例说明因果图的使用。

例5-3 某个软件的规格说明书中规定:第一个字符必须是A或B,第二个字符必须是一个数字字符,在此情况下进行文件的修改,但如果第一个字符不正确,则给出信息L;如果第二个字符不正确,则给出信息M。

解 (1)根据软件规格说明书,列出原因和结果。

原因:

C1,第一个字符是A;

img63

图5-5 因果图限制符号

C2,第一个字符是B;

C3,第二个字符是一个数字字符;

10,中间结果,表示第一个字符符合要求。

结果:

E1,给出信息L;

E2,修改文件;

E3,给出信息M。

(2)找出原因和结果之间的关系、原因和原因之间的约束关系,画出因果图,如图5-6和图5-7所示。

img64

图5-6 实例的因果图

img65

图5-7 带约束的因果图

(3)将因果图转化为判定表,见表5-4。

表5-4 实例的判定表

img66

(4)设计测试用例,见表5-5。

表5-5 实例的测试用例

img67