当前位置:课程学习>>第六章>>知识讲解>>文本学习>>知识点七

第六章  文本学习内容七



6.7 黑盒测试技术



黑盒测试着重测试软件功能。黑盒测试并不能取代白盒测试,它是与白盒测试互补的测试方法,它很可能发现白盒测试不易发现的其他类型错误。

黑盒测试力图发现下述类型的错误:

(1)功能不正确或遗漏的错误。

(2)界面错误。

(3)数据结构错误或外部数据库访问错误。

(4)性能错误。

(5)初始值和终止错误。

白盒测试在测试过程的早期阶段进行,而黑盒测试主要用于测试过程的后期。设计黑盒测试方案时,应该考虑下述问题。

(1)怎样测试功能的有效性?

(2)哪些类型的输入可构成好测试用例?

(3)系统是否对特定的输入值特别敏感?

(4)怎样划定数据类的边界?

(5)系统能够承受什么样的数据率和数据量?

(6)数据的特定组合将对系统运行产生什么影响?

应用黑盒测试技术能够设计出满足下述标准的测试用例集。

(1)所设计出的测试用例能够减少为达到合理测试所需要设计的测试用例的总数。

(2)所设计出的测试用例能够告诉人们,是否存在某些类型的错误,而不是仅仅指出与特定测试相关的错误是否存在。


6.7.1 等价划分

等价划分是一种黑盒测试技术,这种技术把程序的输入域划分成若干个数据类。据此导出测试用例。一个理想的测试用例能独自发现一类错误(例如,对所有负整数的处理都不正确)。

以前曾经讲过,穷尽的黑盒测试(即用所有有效的和无效的输入数据来测试程序)通常是不现实的。因此,只能选取少量最有代表性的输入数据作为测试数据,以期用较小的代价暴露出较多的程序错误。等价划分法力图设计出能发现若干类程序错误的测试用例,从而减少必须设计的测试用例的数目。

如果把所有可能的输入数据(有效的和无效的)划分成若干个等价类,则可以合理地做出下述假定:每类中的一个典型值在测试中的作用与这一类中所有其他值的作用相同。因此,可以从每个等价类中只取一组数据作为测试数据。这样选取的测试数据最有代表性,最可能发现程序中的错误。

使用等价划分法设计测试方案首先需要划分输入数据的等价类,为此需要研究程序的功能说明,从而确定输入数据的有效等价类和无效等价类。在确定输入数据的等价类时常常还需要分析输出数据的等价类,以便根据输出数据的等价类导出对应的输入数据等价类。

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

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

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

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

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

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

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

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

  

划分出等价类以后,根据等价类设计测试方案时主要使用下面两个步骤。

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

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

注意,通常程序发现一类错误后就不再检查是否还有其他错误,因此,应该使每个测试方案只覆盖一个无效的等价类。

下面用等价划分法设计一个简单程序的测试方案。

假设有一个把数字串转变成整数的函数。运行程序的计算机字长16位,用二进制补码表示整数。这个函数是用Pascal语言编写的,它的说明如下:

Function strtoint(dstr:shortstr):integer;

函数的参数类型是shortstr,它的说明是:

Type shortstr=array[1..6] of char;

被处理的数字串是右对齐的,也就是说,如果数字串比6个字符短,则在它的左边补空格。如果数字串是负的,则负号和最高位数字紧相邻(负号在最高位数字左边一位)。

考虑到Pascal编译程序固有的检错功能,测试时不需要使用长度不等于6的数组做实在参数,更不需要使用任何非字符数组类型的实在参数。

分析这个程序的规格说明,可以划分出如下等价类。

  有效输入的等价类有

(1)1-6个数字字符组成的数字串(最高位数字不是零)。

(2)最高位数字是零的数字串。

(3)最高位数字左邻是负号的数字串。

无效输入的等价类有

(1)空字符串(全是空格)。

(2)左部填充的字符既不是零也不是空格。

(3)最高位数字右面由数字和空格混合组成。

(4)最高位数字右面由数字和其他字符混合组成。

(5)负号与最高位数字之间有空格。

合法输出的等价类有

(1)在计算机能表示的最小负整数和零之间的负整数。

(2)零。

(3)在零和计算机能表示的最大正整数之间的正整数。

非法输出的等价类有

(1)比计算机能表示的最小负整数还小的负整数。

(2)比计算机能表示的最大正整数还大的正整数。

因为所用的计算机字长16位,用二进制补码表示整数,所以能表示的最小负整数是-32768,能表示的最大正整数是32767。

根据上面划分出的等价类,可以设计出下述测试方案(注意,每个测试方案由3部分内容组成)。

(1)1-6个数字组成的数字串,输出是合法的正整数。

输入:‘ 1’

预期的输出:1

(2)最高位数字是零的数字串,输出是合法的正整数。

输入:‘000001’

预期的输出:1

(3)负号与最高位数字紧相邻,输出合法的负整数。

输入:‘-00001’

预期的输出:-1

(4)最高位数字是零,输出也是零。

输入:‘000000’

预期的输出:0

(5)太小的负整数。

输入:‘-47561’

预期的输出:“错误——无效输入”

(6)太大的正整数。

输入:‘132767’

预期的输出:“错误——无效输入”

(7)空字符串

输入:‘’

预期的输出:“错误——没有数字”

(8)字符串左部字符既不是零也不是空格

输入:‘#####1’

预期的输出:“错误——填充错”

(9)最高位数字后面有空格

输入:‘ 1 2’

预期的输出:“错误——无效输入”

(10)最高位数字后面有其他字符。

输入:‘ 1##2’

预期的输出:“错误——无效输入”

(11)负号和最高位数字之间有空格。

输入:‘ - 12’

预期的输出:“错误——符号位置错”

6.7.2 边界值分析

经验表明,处理边界情况时程序址容易发生错误。例如,许多程序错误出现在下标、纯量、数据结构和循环等等的边界附近。因此,设计使程序运行在边界情况附近的测试方案,暴露出程序错误的可能性更大一些。

使用边界值分析方法设计测试方案首先应该确定边界情况,这需要经验和创造性,通常输入等价类和输出等价类的边界,就是应该着重测试的程序边界情况。选取的测试数据应该刚好等于、刚刚小于和刚刚大于边界值。也就是说,按照边界值分析法,应该选取刚好等于、稍小于和稍大于等价类边界值的数据作为测试数据,而不是选取每个等价类内的典型值或任意值作为测试数据。

通常设计测试方案时总是联合使用等价划分和边界值分析两种技术。例如,为了测试前述的把数字串转变成整数的程序,除了上一小节已经用等价划分法设计出的测试方案外,还应该用边界值分析法再补充下述测试方案。

(1)使输出刚好等于最小的负整数。

输入:‘-32768’

预期的输出:32767

(2)使输出刚好等于最大的正整数。

输入:‘ 32767’

预期的输出:32767

原来用等价划分法设计出来的测试方案5最好改为:

(3)使输出刚刚小于最小的负整数。

输入:‘-32769’

预期的输出:“错误——无效输入”

原来的测试方案6最好改为:

(4)使输出刚刚大于最大的正整数。

输入:‘ 32768’

预期的输出:“错误——无效输入”

此外根据边界值分析方法的要求,应该分别使用长度为0.1和6的数字串作为测试数据。上一小节中设计的测试方案1,2,3,4和7已经包含了这些边界情况。错误推测。

6.7.3 错误推测

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

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

此外,经验表明,在一段程序中己经发现的错误数目往往和尚未发现的错误数成正比。例如,在IBM OS/370操作系统中,用户发现的全部错误的47%只与该系统4%的模块有关。因此,在进一步测试时要着重测试那些已发现了较多错误的程序段。

等价划分法和边界值分析法都只孤立地考虑各个输入数据的测试功效,而没有考虑多个输入数据的组合效应,可能会遗漏了输入数据易于出错的组合情况。选择输入组合的一个有效途径是利用判定表或判定树为工具,列出输入数据各种组合与程序应作的动作(及相应的输出结果)之间的对应关系,然后为判定表的每一列至少设计一个测试用例。

选择输入组合的另一个有效途径是把计算机测试和人工检查代码结合起来。例如,通过代码检查发现程序中两个模块使用并修改某些共享的变量,如果一个模块对这些变量的修改不正确,则会引起另一个模块出错,因此这是程序发生错误的一个可能的原因。应该设计测试方案,在程序的一次运行中同时检测这两个模块,特别要着重检测一个模块修改了共享变量后,另一个模块能否像预期的那样正常使用这些变量。反之,如果两个模块相互独立,则没有必要测试它们的输入组合情况。通过代码检查也能发现模块相互依赖的关系,例如,某个算术函数的输入是数字字符串,调用6.7.1节例子中的strtoint函数,把输入的数字串转变成内部形式的整数。在这种情况下,不仅必须测试这个转换函数,还应该测试调用它的算术函数在转换函数接收到无效输入时的响应。


请同学们继续学习