第3章黑盒测试 黑盒测试是软件测试的核心测试方法之一,是学习本书的重点内容。在黑盒测试期 间,把被测程序视为一个黑盒子,测试人员并不清楚被测程序的源代码或者该程序的具体 结构,不需要对软件的结构有深层的了解,而是只知道该程序输入和输出之间的关系,依 靠能够反映这一关系的功能规格说明书,来确定测试用例和推断测试结果的正确性。 本章介绍黑盒测试的基本概念与基本方法,常用的黑盒测试方法有等价类划分、边界 值分析、决策表法、因果图、正交实验法、故障猜测法、状态图法、随机数据法等。每种黑盒 测试方法各有所长,应针对软件开发项目的具体特点,选择适当的测试方法,设计高效的 测试用例,有效地将软件中隐藏的故障揭露出来。一个好的测试策略和测试方法必将给 整个测试工作带来事半功倍的效果。本章的实践性较强,希望能举一反三,将这些测试技 术和软件开发结合起来学习。 3.黑盒测试概述 1 黑盒测试(BlackBoxTesting)也称功能测试,它是通过测试来检测每个功能是否都 能正常使用。在黑盒测试中,在完全不考虑程序内部结构和内部特性的情况下,在程序接 口进行测试,它只检查程序功能是否按照需求规格说明书 的规定正常使用,程序是否能适当地接收输入数据而产生 正确的输出信息。黑盒测试着眼于程序外部结构,不考虑 内部逻辑结构,主要针对软件界面和软件功能进行测试, 图3黑盒测试示意图 黑盒测试示意图如图3-1所示。黑盒测试是一种基于用户 - 1 观点出发的测试。 软件黑盒测试是以用户的角度,从输入数据与输出数据的对应关系出发进行测试的。 很明显,如果外部特性本身有问题或规格说明的规定有误,用黑盒测试方法是发现不 了的。 软件黑盒测试法注重于测试软件的功能需求,主要试图发现下列几类错误:功能错 误或遗漏、界面错误、数据结构或外部数据库访问错误、性能错误、初始化和终止错误等。 黑盒测试从理论上讲只有采用穷举输入测试,把所有可能的输入都作为测试情况考 虑,才能查出程序中所有的错误。实际上,测试情况有无穷多个,人们不仅要测试所有合 法的输入,而且还要对那些不合法但可能的输入进行测试。这样看来,完全测试是不可能 的,所以要进行有针对性的测试,通过制定测试案例指导测试的实施,保证软件测试有组 织、按步骤,以及有计划地进行。软件黑盒测试行为必须能够加以量化,才能真正保证软 件质量,而测试用例就是将测试行为具体量化的方法之一。 例如,对Windows中文件名的测试。Windows文件名可以包括除了“、”“/”“:”“.” “?”“<”“>”和“\”之外的任意字符。文件名长度是1~255 个字符。如果为文件名创建 测试用例,等价类分为合法字符、非法字符、合法长度的名称、超过长度的名称等。使用穷 举设计输入测试用例,其工作量是人们无法承受的。Windows附件中“写字板”软件的 “保存为”对话框如图3-2所示。 图3- 2 “保存为”对话框 黑盒测试用例设计方法包括等价类划分法、边界值分析法、错误推测法、因果图法、判 定表、正交实验设计法、功能图法、场景法等。 3.等价类划分法 2 等价类划分法是一种最常用的黑盒测试方法之一。等价类划分法(Equivalence Partitioning)是把程序的输入域划分成若干部分(子集), 然后从每个部分中选取少数代 表性数据作为测试用例。每一类的代表性数据在测试中的作用等价于这一类中的其 他值。 3.1 划分等价类 2. 等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的 错误都是等效的,并合理地假定:测试某等价类的代表值就等于对这一类其他值的测试。 因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测 试的输入条件,就可以用少量代表性的测试数据,取得较好的测试结果,等价类划分可有 两种不同的情况:有效等价类和无效等价类。 有效等价类:是指对于程序的规格说明来说是合理的、有意义的输入数据构成的集 合,利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。 46 无效等价类:与有效等价类的定义恰巧相反。 例如,输入值是学生成绩,范围是0~100,其有效等价类和无效等价类划分,可以确 定一个有效等价类和两个无效等价类。小于60 分和大于100 分为无效等价类,大于或等 于60 分且小于或等于100 分为有效等价类。 设计测试用例时,要同时考虑这两种等价类。因为软件不仅要能接收合理的数据,也 要能经受意外的考验,这样的测试才能确保软件具有更高的可靠性。 下面给出六条确定等价类的原则。 (1)在输入条件规定了取值范围或值的个数的情况下,可以确立一个有效等价类和 两个无效等价类。 (2)在输入条件规定了输入值的集合或者规定了“必须如何”的条件的情况下,可确 立一个有效等价类和一个无效等价类。 (3)在输入条件是一个布尔量的情况下,可确定一个有效等价类和一个无效等价类。 (4)在规定了输入数据的一组值(假定 n 个), 并且程序要对每一个输入值分别处理 的情况下,可确立 n 个有效等价类和一个无效等价类。 (5)在规定了输入数据必须遵守的规则的情况下,可确立一个有效等价类(符合规 则)和若干个无效等价类(从不同角度违反规则)。 (6)在确知已划分的等价类中各元素在程序处理中的方式不同的情况下,则应再将 该等价类进一步划分为更小的等价类。 2.设计测试用例 3.2 在确立了等价类后,可建立等价类表,列出所有划分出的等价类,如表3-1所示。 表3- 1 等价类表 输入条件有效等价类无效等价类 . . . 然后从划分出的等价类中按以下三个原则设计测试用例。 (1)为每一个等价类规定一个唯一的编号。 (2)设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖的有效等价类,重复这 一步,直到所有的有效等价类都被覆盖为止。 (3)设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一 步,直到所有的无效等价类都被覆盖为止。 3.3 等价类划分法举例 2. 1. 登录窗口 以某“学生成绩信息管理系统”为例,登录窗口的界面如图3-3所示。 47 在登录窗口中不考虑身份选择情况,只验证 “用户名”“请输入密码”和“请确认密码”的正确 性。用户名和密码的输入条件均要求为不超过 16 位,可以使用汉字、英文字母和数字及各种组 合,输入密码和确认密码相同。 图3- 3 登录窗口首先,等价类划分法对用户名和密码进行等 价类划分,建立等价类表,如表3-2所示。在某网 站申请免费信箱时,要求用户必须输入用户名、密码及确认密码,对每一项输入条件的要 求如下。 (1)用户名要求为4~16 位,可使用英文字母、数字、-、_, 并且首字符必须为字母或 数字。 (2)密码要求为6~16 位,只能使用英文字母、数字或-、_, 并且区分大小写。 其次,根据等价类表生成测试用例,如表3-3所示。 表3- 2 等价类表 输入条件有效等价类编号无效等价类编号 4~16 位1 少于4位9 2 多于16 位10 用户名首字符为字母3 首字符为除字母、数字之外的其他字符11 首字符为数字4 组合中含有除英文字母、数字、-、_之外的其 他特殊字符12 英文字母、数字、-、5 少于6位13 请输入密码 _组合 6 多于16 位14 英文字母、数字、-、_组合7 组合中含有除英文字母、数字、-、_之外的其 他特殊字符15 请确认密码内容与密码相同8 内容与输入密码相同,但确认密码字母大小 写不同16 表3- 3 测试用例 测试用例用户名密码确认密码预期输出覆盖的等价类 TC1 ABC_2000 ABC_123 ABC_123 注册成功1,2,4,5,6,7,8 TC2 2000-ABC 123-ABC 123-ABC 注册成功1,3,4,5,6,7,8 TC3 ABC 12345678 12345678 提示用户名错误9 TC4 ABC1234567 89012345 12345678 12345678 提示用户名错误10 TC5 _ABC123 12345678 12345678 提示用户名错误11 TC6 ABC&123 12345678 12345678 提示用户名错误12 48 续表 49 测试用例用 户 名密 码确认密码预期输出覆盖的等价类 TC7 ABC_123 12345 12345 提示密码错误13 TC8 ABC_123 ABC123456 ABCDEFGHIJK123456 提示密码错误14 TC9 ABC_123 ABC&123 ABC&123 提示密码错误15 TC10 ABC_123 ABC_123 ABC_123 提示密码错误16 2.DIMENSION 语句 FORTRAN 编译系统的设计和程序编写工作已经完成,现需对DIMENSION 语句 的实现设计测试用例。已知DIMENSION 语句的语法规则是:DIMENSION 语句用以 规定数组的维数。形式为: DIMENSION AD[;AD]… 其中,AD是数组描述符,其形式为: n(d [,d] …) 其中,n是数组名,由1~6个字母或数字组成。为首的必须是字母;d是维数说明符,数组 维数最大为7,最小为1,它的形式为[lb:]ub。 lb和ub分别表示数组下界和上界,均为-65534~65535的整数,也可以是整型变 量名(但不可以是数组元素名)。若未规定lb,则认为其值为1,且ub≥lb。若已规定了 lb,则它可为负数、零或正数。DIMENSION 语句也和其他语句一样,可连续写多行。 注释:以上规则中,[]内为任选项,小写字母代表语法单位,…表示它前面的项可重 复出现多次。 首先,确定输入条件,并确定等价类,如表3-4所示(注:括号中数字为等价类编号)。 表3-4 等价类表 输入条件有效等价类无效等价类 数组描述符个数1(1),>1(2) 无数组描述符(3) 数组名称符个数1~6(4) 0(5),>6(6) 数组名有字母(7),有数字(8) 有其他字符(9) 数组名以字母开头是(10) 否(11) 数组维数1~7(12) 0(13),>7(14) 上界取值常数(15),整型变量(16) 数组元素名(17),其他(18) 数组变量名有字母(19),有数字(20) 其他(21) 整型变量名以字母开头是(22) 否(23) 续表 输入条件有效等价类无效等价类 上下界取值-65534~65535(24) <-65534(25),>65535(26) 是否定义下界是(27), 否(28) 上界对下界关系>(29),=(30) <(31) 下界定义负数(32),0(33), 正数(34) 下界取值常数(35), 整型变量(36) 数组元素名(37), 其他(38) 语句多于一行是(39), 否(40) 其次,确定覆盖有效等价类的测试用例。每一个测试用例覆盖一个或多个有效等 价类。测 试用例编号(1):DIMENSIONA(2)。 覆盖有效等价类:1,4,7,10,12,15,24,28,29,40 。 测试用例编号(2):DIMENSIONA12345(1,9,J4YYY,65535,H,JKL,100), BB(-65534:100,0:1000,10:10,1:65535 )。 覆盖其余有效等价类:2,8,16,19,20,22,27,30,32,33,34,35,36,39 。 第三,确定覆盖无效等价类的测试用例。每一个测试用例覆盖一个无效等价类,如表 3-5所示。 表3- 5 覆盖无效等价类的测试用例 编号输入条件输入数据覆盖无效等价类 3 数组描述符个数———无数组描述符DIMENSION 3 4 数组名称符个数———0 DIMENSION(10) 5 5 数组名称符个数———>6 DIMENSIONA12345678(2) 6 6 数组名———有其他字符DIMENSIONA.1(2) 9 7 数组名以字母开头———否DIMENSION1A(10) 11 8 数组维数———0 DIMENSIONB 13 9 数组维数———>7 DIMENSIONB(8,8,8,8,8,8,8,8,8) 14 10 上界取值———数组元素名DIMENSIONB(4,A(2)) 17 11 上界取值———其他DIMENSIONB(4,7) 18 12 数组变量名———其他DIMENSIONC(R*S,10) 21 13 整型变量名以字母开头———否DIMENSIONC(10,3L) 23 14 上下界取值——— <-65534 DIMENSIOND(-65535:1) 25 15 上下界取值——— >65535 DIMENSIOND(65536) 26 16 上界对下界关系——— < DIMENSIOND(4:3) 31 17 下界取值———数组元素名DIMENSIOND(A(2):4) 37 18 下界取值———其他DIMENSIOND(:4) 38 50 3. 三角形问题 输入三个整数a、 b 和 c 分别作为三角形的三条边,通过程序判断由这三条边构成的 三角形类型是:等边三角形、等腰三角形、一般三角形或非三角形(不能构成一个三角 形)。另外,假定三个输入a、 b 和 c 在1~100 中取值(整数)。 下面对题目进行更详细的分析。 输入三个整数a、 b 和 c 分别作为三角形的三条边,要求a、 b 和 c 必须满足以下条件。 (1)整数。 (2)三个数。 (3)边长大于或等于1且小于或等于100 。 (4)任意两边之和大于第三边 。 输出为以下5种情况之一 。 (1)如果不满足条件1、2、3,则程序输出为“输入错误”。 (2)如果不满足条件4,则程序输出为“非三角形”。 (3)如果三条边相等,则程序输出为“等边三角形”。 (4)如果恰好有两条边相等,则程序输出为“等腰三角形”。 (5)如果三条边都不相等,则程序输出为“一般三角形” 。 输入域等价类划分和输出域等价类划分如表3-6所示 。 表3- 6 输入域等价类划分和输出域等价类划分 有效等价类编号无效等价类编号 a 为整数1 a 非整数13 b 为整数2 b 非整数14 c 为整数3 c 非整数15 三个数4 大于3 16 小于3 17 1≤a≤100 5 小于1 18 大于100 19 1≤b≤100 6 小于1 20 大于100 21 1≤c≤100 7 小于1 22 大于100 23 a+b< c 24 两边之和大于第三边8 a+c< b 25 b+c< a 26 非三角形9 等边三角形10 等腰三角形11 一般三角形12 51 覆盖有效等价类的测试用例如表3-7所示,覆盖无效等价类的测试用例如表3-8 所示。 表3- 7 覆盖有效等价类的测试用例 测试用例编号输入数据输出结果覆盖的有效等价类 TC1 30,30,30 等边三角形1,2,3,4,5,6,7,8,10 TC2 30,30,20 等腰三角形1,2,3,4,5,6,7,8,11 TC3 30,40,50 一般三角形1,2,3,4,5,6,7,8,12 TC4 30,40,90 非三角形1,2,3,4,5,6,7,9 表3- 8 覆盖无效等价类的测试用例 测试用例编号输入数据输出结果覆盖的无效等价类 TC5 11.1,10,10 输入错误13 TC6 10,5.5,10 输入错误14 TC7 9,10,3.3 输入错误15 TC8 10,10,10,4 输入错误16 TC9 10,10 输入错误17 TC10 0,10,10 输入错误18 TC11 101,50,50 输入错误19 TC12 10,-1,10 输入错误20 TC13 50,110,50 输入错误21 TC14 10,10,0 输入错误22 TC15 50,50,110 输入错误23 TC16 10,10,50 输入错误24 TC17 10,60,10 输入错误25 TC18 110,10,30 输入错误26 3.边界值分析法 3 边界值分析法是用于对输入或输出的边界值进行测试的一种黑盒测试方法。在测试 过程中,边界值分析法是作为对等价类划分法的补充,专注于每个等价类的边界值,两者 的区别在于前者在等价类中随机选取一个测试点。边界值分析法采用一到多个测试用例 来测试一个边界,不仅重视输入条件边界值,而且重视输出域。边界值分析法比较简单, 仅用于考察正处于等价划分边界或边界附近的状态,考虑输出域边界产生的测试情况,针 对各种边界情况设计测试用例,发现更多的错误。边界值分析法的测试用例是由等价类 52 的边界值产生的,根据输入/输出等价类,选取稍高于边界值或稍低于边界值等特定情况 作为测试用例。 3.边界值分析法的含义 在等价类划分基础上进行边界值分析测试的基本思想是,选取正好等于、刚刚大于或 刚刚小于等价类边界的值作为测试数据,而不是选取等价类中的典型值或任意值为测试 数据。 边界值分析法(BoundaryValueAnalysis)是一种补充等价类划分法的测试用例设计 技术,它不注重选择等价类的任意元素,而是注重选择等价类边界的测试用例。在测试过 程中,可能会忽略边界值的条件,大量的错误是发生在输入或输出范围的边界上,而不是 发生在输入/输出范围的内部。因此针对各种边界情况设计测试用例,可以查出更多的 错误。 边界值测试主要考虑以下几条原则。 (1)如果输入条件规定了值的范围,则应取刚达到这个范围边界的值,以及刚刚超过 这个范围边界的值作为测试输入数据。 例如,一个单位对身高的要求是1.69 、71 、89 、 则测试用例为1.70 、 91,80 。 1.1 1.90 、1.以及典型值1.70~90m, 1.1.. (2)如果输入条件规定了值的个数,则用最大个数、最小个数、比最小个数小1的数、 比最大个数大1的数作为测试数据。 例如,一个系统规定可以存储文件1~128 个,则测试用例为0、1、128 、129 。 (3)如果程序的规格说明给出的输入域或输出域是有序集合,则应选取集合的第一 个元素和最后一个元素作为测试用例。 例如,假设C语言中数组长度为n,则测试用例是数组下标为0和数组下标为n-1。 (4)如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构的边界上 的值作为测试用例。 (5)分析程序规格说明,找出其他可能的边界条件。 边界值和等价类密切相关,输入等价类和输出等价类的边界是要着重测试的边界情 况。在等价类的划分过程中产生了许多等价类边界。边界是最容易出错的地方,所以,从 等价类中选取测试数据时应该关注边界值。 边界值分析法的必要性体现在,软件测试常用的一个方法是把测试工作按同样的形 式划分。对数据进行软件测试,就是检查用户输入的信息、返回结果以及中间计算结果是 否正确。实践表明,输入域的边界值比中间的值更加容易发现错误。 3.2 边界值分析法原理 3. 1. 边界值分析测试 这里讨论有两个变量X1 和X2 的程序P。假设输入变量X1 和X2 在下列范围内 53 取值: a ≤X1≤b, c ≤X2≤ d 边界值分析利用输入变量的最小值(min)、稍大于最小值(min+ )、域内任意值 (nom )、稍小于最大值(max-)和最大值(max)来设计测试用例。即通过使所有变量取 正常值,只使一个变量分别取最小值、略高于最小值、略低于最大值和最大值,如图3-4 所示。 图3- 4 边界值分析法测试用例 对于一个 n 个变量的程序,边界值分析测试会产生4n+1 个测试用例。 2. 健壮性边界值测试 健壮性测试是边界值分析的一种扩展。变量除了取min、min+ 、nom 、max-和max 五个边界值外,还要考虑采用一个略超过最大值(max+)以及一个略小于最小值(min-) 的取值,看看超过极限值时系统会出现什么情况,如图3-5所示。 图3- 5 健壮性边界值分析法测试用例 健壮性测试最有意义的部分不是输入,而是预期的输出,观察例外情况如何处理。 健壮性边界值测试将产生6n+1 个测试用例。 3. 最坏情况边界值分析法 对每一个变量首先进行包含最小值、略高于最小值、正常值、略低于最大值、最大值五 个元素集合的测试,然后对这些集合进行笛卡儿积计算,以生成测试用例。最坏情况测试 显然更彻底,但测试工作量较大。 54 一个变量个数为 n 的最坏情况测试会产生5n 个测试用例,如图3-6所示。 图3- 6 最坏情况边界值分析法测试用例 4. 健壮最坏情况测试 对每一个变量,首先进行包含最小值、略高于最小值、正常值、略低于最大值、最大值 五个元素集合的测试,还要采用一个略超过最大值的取值,以及一个略小于最小值的取 值。然后对这些集合进行笛卡儿积计算,以生成测试用例。 n 个变量的函数的健壮最坏情况测试会产生7n 个测试用例,如图3-7所示。 图3- 7 健壮最坏情况边界值分析法测试用例 3.3 边界值分析法举例 3. 1.NextDate() 函数 NextDate() 是一个有三个变量(月份、日期和年)的函数。函数返回输入日期后面的 那个日期。变量月份、日期和年都为整数,且NextDate() 函数规定了Month、Day、Year 相应的取值范围,即1≤Mont1≤Dy≤31,aNetDte() 函数的 h≤12,a1912≤Yer≤2050,xa 边界值分析法测试用例如表3-9所示。 2. 三角形问题 GlenfordMyers的经典著作TheArtofSoftwareTesting 中描述了三角形的问题。 55 表3- 9 NextDate() 函数的边界值分析法测试用例 测试用例编号Month Day Year 预期输出 TC1 6 15 1911 Year超出[1912,2050] TC2 6 15 1912 1912,6,16 TC3 6 15 1913 1913,6,16 TC4 6 15 1975 1975,6,16 TC5 6 15 1949 1949,6,16 TC6 6 15 1950 1950,6,16 TC7 6 15 1951 Year超出[1912,2050] TC8 6 -1 2001 Day超出[1,31] TC9 6 1 2001 2001,6,2 TC10 6 2 2001 2001,6,3 TC11 6 30 2001 2001,7,1 TC12 6 31 2001 输入日期超过范围 TC13 6 32 2001 Day超出[1,31] TC14 -1 15 2001 Month超出[1,12] TC15 1 15 2001 2001,1,16 TC16 2 15 2001 2001,2,16 TC17 11 15 2001 2001,11,16 TC18 12 15 2001 2001,12,16 TC19 13 15 2001 Month超出[1,12] 输入三个整数a、 b 和c,分别作为三角形的三条边,通过程序判断由这三条边构成的三角 形类型:等边三角形、等腰三角形、一般三角形或非三角形(不能构成一个三角形)。 另外,假定三个输入a、 b 和 c 在1~100 中取值(整数), 覆盖有效等价类的测试用例 如表3-10 所示。 表3-10 覆盖有效等价类的测试用例 测试用例编号 a b c TC1 50 50 1 TC2 50 50 2 TC3 50 50 50 TC4 50 50 99 TC5 50 50 100 56 续表 测试用例编号 a b c TC6 50 1 50 TC7 50 2 50 TC8 50 99 50 TC9 50 100 50 TC10 1 50 50 TC11 2 50 50 TC12 99 50 50 TC13 100 50 50 在进行等价类分析时,往往先要确定边界。如果不能确定边界,就很难定义等价类所 在的区域。只有边界值确定下来,才能划分出有效等价类和无效等价类。边界确定清楚 了,等价类就自然产生了。边界值分析方法是对等价类划分法的补充。在测试中,会将两 个方法结合起来共同使用。 3.决策表法 4 决策表法是把作为条件的所有输入的各种组合值以及对应输出值都罗列出来而形成 的表格。它能够将复杂的问题按照各种可能的情况全部列举出来,简明并避免遗漏。因 此,利用决策表能够设计出完整的测试用例集合。在所有的黑盒测试方法中,基于决策表 的测试是最严格、最具有逻辑性的测试方法。 3.1 决策表的含义 4. 决策表(DecisionTable)又称判定表,是一种呈表格状的图形工具,适用于描述处理 判断条件较多,各条件又相互组合、有多种决策方案的情况。精确而简洁描述复杂逻辑的 方式,将多个条件与这些条件满足后要执行的动作相对应。但不同于传统程序语言中的 控制语句,决策表能将多个独立的条件和多个动作直接的联系清晰地表示出来。 决策表由条件桩、条件项、动作桩和动作项组成,如图3-8所示。 条件桩:列出所有的问题,即条件。 条件项:针对条件桩中的条件列出所有的取值。 动作桩:列出针对问题可能采取的操作。 动作项:针对条件项中的各组取值列出所要采取的动作。 规则:条件项和动作项中的一列称为一条规则。 决策表法测试适用于具有以下特征的应用程序。 (1)if-then-else结构。图3- 8 决策表组成 57 (2)输入变量之间存在逻辑关系。 (3)涉及输入变量子集的计算。 (4)输入和输出之间存在因果关系 。 适用于使用决策表设计测试用例的情况 。 (1)规格说明以决策表形式给出,或者较容易转换为决策表。 (2)条件的排列顺序不会也不应该影响执行的操作 。 有 n 个条件的决策表,对应的规则将有2n 条 。 3.2 决策表法举例 4. 创建决策表有5个步骤: (1)列出所有的条件桩和动作桩。 (2)确定规则的个数。 (3)填入输入项。 (4)填入动作项,得到初始的决策表。 (5)对初始的决策表化简。 1. 三角形问题 输入三条边a、b、c,判断是否是三角形;如果是三角形,继续判断是等腰三角形还是 等边三角形。试画出决策表,并设计测试用例。 第一步,列出所有的条件桩和行动桩。 三角形问题的条件桩: (1)a