2.1 黑盒测试
2.1.1 概念
黑盒测试的概念
黑盒测试也称“功能测试”“数据测试”或“基于规格说明书的测试”,它通过测试来检测每个功能是否都能正常使用。在测试中把软件看作一个不能打开的黑盒子,在基本不考虑其内部结构和内部实现方法的情况下,在软件接口进行测试,如图2-1所示。
图2-1 黑盒测试
黑盒测试只检查软件功能是否按照需求规格说明书的规定正常完成,以及是否能正确地接收输入数据而产生正确的输出信息,并保持外部信息(如数据库或文件)的完整性。
黑盒测试不关注软件的内部结构,而是着眼于外部结构,即关注软件的输入和输出,以及用户的需求。从用户的角度验证软件功能,实现端对端的测试。黑盒测试的主要依据是需求规格说明书和用户手册,按照需求规格说明书中对软件各功能的描述内容来检验软件在测试中的表现,这类测试又称为“软件验证”,而以用户手册等对外公布的文件为依据进行的测试又称为“软件审核”。
在软件测试过程中黑盒测试常用于发现以下几类软件缺陷。
(1)是否有不正确或遗漏的功能。
(2)能否正确地接收输入数据,并且产生正确的输出结果。
(3)功能操作逻辑是否合理。
(4)界面是否出错、是否合理、是否美观。
(5)安装过程中是否出现问题,安装步骤是否清晰、方便。
(6)系统初始化是否存在问题。
黑盒测试常用的方法有等价类划分法、边界值分析法、决策表法、因果图法等,借助这些方法可以简化测试数据的数据量,设计更有效的测试用例。
2.1.2 基本方法
2.1.2.1 等价类划分测试法
等价类划分测试法
1.概念
软件测试常见的致命性错误,就是测试的不彻底性和不完全性。由于穷举测试的方法工作量过大,所以在实际中无法完成。为此,需要在大量的可能数据中选择一部分作为测试用例,并且既要考虑测试的效果,又要考虑软件测试实际的经济性,这样如何选取合适的测试用例就成为关键问题。由此引入了等价类的思想,主要目的在于,在有限的测试资源的情况下用少量有代表性的数据得到比较好的测试结果。
等价类划分测试法(简称等价类划分)解决如何选择适当的数据子集来代表整个数据集的问题,通过降低测试的数目实现“合理的”覆盖,覆盖更多的可能数据以发现更多的软件缺陷。
2.原理
(1)等价类划分。
等价类划分的思想就是把全部输入数据合理划分为若干等价类,在每一个等价类中取一个具有代表性的数据作为测试的输入条件,这样可以用少量的测试数据取得较好的测试效果。
等价类可以划分为有效等价类和无效等价类两种。前者是指对于需求规格说明书来说合理且有效的输入数据构成的集合。有效等价类可以是一个,也可以是多个,根据系统的输入域划分为若干部分,然后从每个部分中选取少数有代表性数据当作数据测试的测试用例,等价类是输入域的集合。后者是指对于需求规格说明书而言,没有意义且不合理的输入数据集合。利用它可以找出软件异常,并检查软件的功能和性能是否有不符合需求规格说明书要求的地方。
(2)等价类划分的标准。
此测试中划分等价类是非常关键的,如果划分合理,则可以大大减少测试用例,并且能够保证达到要求的测试覆盖率。一般来讲,首先要分析软件所有可能的输入情况,然后按照下列规则对其进行划分。
1)按照区间划分:如果输入数据属于一个取值范围或值的个数范围,则可以确立一个有效等价类和两个无效等价类。例如,软件的输入是学生考试成绩并要求成绩的范围是0~100,则输入条件的等价类如图2-2所示。
图2-2 输入条件的等价类
有效等价类为0≤成绩≤100,无效等价类为成绩<0和成绩>100。
2)按数值划分:如果规定了输入数据的一组值并且软件要对每一个输入值分别进行处理,则可为每一个输入值确立一个有效等价类。并针对这组值确立一个无效等价类,它是所有不允许的输入值的集合。
例如,软件中省份的输入数据可以是河北、河南、广东、江苏四省份之一,则可以分别取这4个省份作为4个有效等价类,把4个省份之外的任何省份作为无效等价类。
再如,输入整数x取值于一个固定的集合{1,3,5,7,12}。并且软件中对这5个数值分别进行了处理,则有效等价类为x=1、x=3、x=5、x=7、x=12;无效等价类为1、3、5、7、12以外的值构成的集合。
3)按照数值集合划分:如果规定了输入数据属于一个值的集合(假定n个)并且软件要对每一个输入值分别处理,则可确立n个有效等价类和一个无效等价类。
例如,软件输入条件为字符a开头、长度为8的字符串并且字符串不包含a~z之外的其他字符,则有效等价类为满足上述所有条件的字符串;无效等价类为不以a开头、长度不为8的字符串,并且包含a~z之外的其他字符的字符串。
4)按限制条件划分:如果输入条件是一个布尔值,则可确立一个有效等价类和一个无效等价类。
例如,输入条件是x=true,则有效等价类为x=true;无效等价类为x=false。
5)按照限制规则划分:如果规定了输入数据必须遵守的规则,则可确立一个有效等价类(符合规则)和若干无效等价类(从不同角度违反规则)。
例如,在Java语言中对变量标识符规定为“以字母开头的……”,则有效等价类是以“以字母开头”;无效等价类有“以数字开头”“以标点符号开头”“以空格开头”等。
6)按处理方式划分:在确认已划分的等价类中各元素在软件处理中的方式不同的情况下,则应再将该等价类进一步划分为更小的等价类。
例如,软件用于判断几何图形的形状,则可以首先根据图形的边数划分出三角形、四边形、五边形、六边形等。然后对于每一种类型可以做进一步的划分,如三角形可以进一步分为等边三角形、等腰三角形和一般三角形。
(3)等价类划分设计测试用例的步骤。
在确立等价类后,可以建立等价类表列出所有划分的等价类。然后从划分出的等价类中设计测试用例,具体步骤如下。
1)确定等价类形成等价类表,如表2-1所示,列出所有划分出的等价类。
表2-1 等价类表
2)为每一个等价类规定一个唯一的编号。
3)设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步直到所有的有效等价类都被覆盖为止。
4)设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步直到所有的无效等价类都被覆盖为止。
3.测试用例案例
【案例1】电话号码。
某城市电话号码由两部分组成,其名称和内容如下。
(1)地区码:以0开头的3位或4位数字(包括0)。
(2)电话号码:以非0、非1开头的7位或8位数字组成。
假定被测试的软件能接受一切符合上述规定的电话号码,并拒绝所有不符合规定的号码,就可以使用等价划分法来设计其测试用例。
Step 01 确定等价类,形成等价类表并为每一个等级类编号,如表2-2所示。
表2-2 电话号码的等价类表
Step 02 为每一个有效等价类设计测试用例,如表2-3所示。
表2-3 有效等价类的测试用例
Step 03 为每一个无效等价类设计测试用例,如表2-4所示。
表2-4 无效等价类的测试用例
【案例2】三角形问题。
软件规定:“输入3个正整数a、b、c,分别作为三角形的3条边长。通过软件判定是否能构成三角形。如果能构成三角形,进一步判断三角形的类型。当此三角形为一般三角形、等腰三角形及等边三角形时,分别执行不同的操作。”用等价类划分方法为该软件进行测试用例设计。
Step 01 分析题目中给出和隐含的对输入条件的要求为3个正整数、构成一般三角形、构成等腰三角形、构成等边三角形,以及不能构成三角形。
Step 02 确定等价类,形成三角形等价类表并为每一个等级类编号,如表2-5所示。
表2-5 三角形的等价类表
Step 03 设计测试用例,覆盖上表中的有效等价类和无效等价类,如表2-6所示。
表2-6 测试用例
(续表)
2.1.2.2 边界值分析法
边界值分析法
1.概念
任何一个软件都可以看成是一个函数,软件的输入构成函数的定义域,软件的输出构成函数的值域。人们从长期的测试工作经验得知,大量的错误是发生在定义域或值域的边界上,而不是在其内部。对于软件缺陷,有句谚语形容得很恰当,即“缺陷遗漏在角落里,聚集在边界上”。
例如,在做三角形计算时要输入三角形的3个边长a、b和c,这3个数值应当满足a>0、b>0、c>0、a+b>c、a+c>b、b+c>a才能构成三角形。但如果把6个不等式中的任何一个大于号“>”错写成大于等于号“≥”,则不能构成三角形,问题常常出现在容易被疏忽的边界附近。类似的例子还有很多,如计数器常常“少记一次”、循环条件应该是“≤”时错误地写成了“<”,以及数组下标越界(在C语言中数组下标从0开始,可能错误地认为是从1开始,从而使最后一个元素的下标越界)等。
边界值分析关注的是输入空间的边界,并从中标识测试用例。边界值测试的基本原理是错误更可能出现在输入变量的极值附近,因此针对各种边界情况设计测试用例可以查出更多的错误。
2.原理
边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法,为了用其设计测试用例,首先要确定边界情况,通常输入或输出等价类的边界就应该是着重测试的边界值情况;其次选取正好等于、稍大于或稍小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值作为测试数据。
相关概念如下。
(1)边界条件。
边界条件就是一些特殊情况。一般在条件C下软件执行一种操作。而对任意小的值σ,条件C+σ或C-σ会执行另外的操作,则C就是一个边界。
在多数情况下,边界条件是基于应用软件的功能设计而需要考虑的因素,可以从软件的需求规格说明书或常识中得到。例如,软件要对学生成绩进行处理,要求输入数据的范围是[0,100],则很明显输入条件的边界是0和100。
在设计测试用例过程中某些边界条件不需要呈现给用户或者说用户很难注意到,但其确实属于检验范畴内的边界条件,称为“内部边界条件”或“次边界条件”。
内部边界条件主要有下面几种。
1)数值的边界值:计算机基于二进制工作,因此软件的任何数值运算都有一定的范围限制。例如,一个字节由8位组成,所能表达的数值范围是[0,255]。表2-7列出了计算机中常用数值的范围。
表2-7 计算机中常用数值的范围
2)字符的边界值:在软件中字符也是很重要的表示元素,其中ASCII和Unicode是常见的编码方式。表2-8中列出了一些常用字符对应的ASCII码值。
表2-8 常用字符对应的ASCII码值
如果要测试文本输入或文本转换的软件在定义数据区间包含哪些值时,则可以参考ASCII码表找出隐含的边界条件。
3)其他边界条件:有一些边界条件容易被人忽略,如在文本框中不是没有输入正确的信息,而是根本就没有输入任何内容。然后单击“确认”按钮,这种情况常常被遗忘或忽视。但在实际使用中却时常发生,因此在测试时还需要考虑软件对默认值、空白、空值、零值、无输入等情况的反应。
在进行边界值测试时,一般情况下确定边界值应遵循以下几个原则。
1)如果输入条件规定了值的范围,则应取刚达到这个范围边界的值,以及刚刚超越这个范围边界的值作为测试输入数据。例如,如果软件的需求规格说明书中规定:“重量在10公斤至50公斤范围内的邮件,其邮费计算公式为……”。作为测试用例,我们应取10及50,还应取10.01、49.99、9.99及50.01等。
2)如果输入条件规定了值的个数,则用最大个数、最小个数、比最小个数少1、比最大个数多1的数作为测试数据。例如,一个输入文件应包括1~255个记录,则测试用例可取1和255,还应取0及256等。
3)将上述两个规则应用于输出条件,即设计测试用例使输出值达到边界值及其左右的值。例如,一个软件属于情报检索系统,要求每次“最少显示1条、最多显示4条情报摘要”。这时应考虑的测试用例包括1和4,还应包括0和5等。再如,一个学生成绩管理系统规定,只能查询2015~2018届大学生的各科成绩。可以设计测试用例使得查询范围内的某一届或4届学生的学生成绩,还需设计查询2014届、2019届学生成绩的测试用例(不合理输出等价类)。
4)如果软件的需求规格说明书中给出的输入域或输出域是有序集合(如顺序文件、线性表等),则应选取集合的第1个元素和最后一个元素作为测试用例。
5)如果软件中使用了一个内部数据结构,则应当选择该结构边界上的值作为测试用例。例如,如果软件中定义了一个数组,其元素下标的下界是0,上界是100,那么应选择达到这个数组下标边界的值,如0与100作为测试用例。
6)分析需求规格说明书找出其他可能的边界条件。
(2)边界值分析测试。
为便于理解,以下讨论涉及两个输入变量x1和x2的函数f(x1,x2)。假设x1和x2的取值范围为a≤x1≤b和c≤x2≤d。
函数F的输入域如图2-3所示。
图2-3 函数f(x1,x2)的输入域
矩形阴影中的任何一点都是该函数f(x1,x2)的有效输入。
边界值分析的基本思想是使用输入变量的最小值、略大于最小值、正常值、略小于最大值和最大值设计测试用例,通常我们用min、min+、nom、max-和max来表示。
当一个函数或程序有两个及两个以上的输入变量时,需要考虑如何组合各变量的取值,可以根据可靠性理论中的单缺陷假设和多缺陷假设来考虑。
1)单缺陷假设:即被测对象只要在某个输入条件的某个边界出错,则在任何包含该输入条件的某个边界的情况下一定会出错,那么测试时仅覆盖输入条件的单个边界点即可,无需测试多个输入条件取边界测试数据的情况。因此单缺陷假设假设的策略是在任何一个测试用例中有且只能有一个输入条件的取值为边界邻域内的测试数据,其他输入条件应取正常值(一般为相邻边界点之间的中值)。
单缺陷假设是指“失效极少是由两个或两个以上的缺陷同时发生引起的”,依据该假设来设计测试用例只让一个变量取边界值,而其余变量取正常值。
2)多缺陷假设:指“失效是由两个或两个以上缺陷同时作用引起的”,因此依据该假设来设计测试用例要求在选取测试用例时让多个变量取边界值。
在边界值分析中用到了单缺陷假设,即选取测试用例时仅仅使一个变量取极值,其他变量均取正常值。对于有两个输入变量的软件P,其边界值分析的测试用例为{<x1nom,x2min>,<x1nom,x2min+>,<x1nom,x2nom>,<x1nom,x2max->,<x1nom,x2max>,<x1min,x2nom>,<x1min+,x2nom>,<x1max-,x2nom>,<x1max,x2nom>},如图2-4所示。
图2-4 有两个输入变量的软件P的边界值分析测试用例
例如,有一个二元函数f(x,y)要求输入变量x和y分别满足x∈[1,12],y∈[1,31]。采用边界值分析法设计测试用例,可以选择的一组测试数据为{<1,15>,<2,15>,<11,15>,<12,15>,<6,15>,<6,1>,<6,2>,<6,30>,<6,31>}。
对于一个含有n个输入变量的软件,除一个变量外的所有变量取正常值。而剩余的一个变量依次取最小值、略大于最小值、正常值、略小于最大值和最大值,并对每个变量重复进行。因此对于有n个输入变量的程序,边界值分析会产生4n+1个测试用例。
例如,有一个三元函数f(x,y,z),其中x∈[0,100],y∈[1,12],z∈[1,31]。对该函数采用边界值分析法设计的测试用例将会得到13个测试用例,根据边界分析的原理,可得到的测试数据为{<50,6,1>,<50,6,2>,<50,6,30>,<50,6,31>,<50,1,15>,<50,2,15>,<50,11,15>,<50,12,15>,<0,6,15>,<1,6,15>,<99,6,15>,<100,6,15>,<50,6,15>}。
(3)健壮性边界值测试。
健壮性是指在异常情况下软件还能正常运行的能力,用其可衡量软件对于规范要求以外的输入情况的处理能力。所谓健壮的软件,是指对于规范要求以外的输入能够判断出这个输入不符合规范要求,并有合理处理方式的软件。软件设计的健壮与否直接反映了分析设计和编码人员的水平。
健壮性边界测试是边界值分析的一种简单扩展,在使用该方法设计测试用例时既要考虑有效输入,又要考虑无效输入。除了按照边界值分析方法选取的5个取值(min、min+、nom、max-、max)外,还要选取略小于最小值(min-)和略大于最大值(max+)的取值,以观察输入变量超过边界时软件的表现。对于有两个变量的软件P,其健壮性测试的测试用例如图2-5所示。
图2-5 有两个变量的软件的健壮性测试用例
一个含有n个输入变量的软件进行健壮性边界测试时,除一个变量外的所有变量取正常值。剩余的变量依次取略小于最小值、最小值、略大于最小值、正常值、略小于最大值、最大值和略大于最大值并对每个变量重复进行,因此其健壮性测试会产生6n+1个测试用例。
例如,有一个二元函数f(x,y)要求输入变量x,y分别满足x∈[0,100],y∈[1 000,3000]。对其进行健壮性测试,则需要设计13个测试用例。根据健壮性测试的原理,可以得到的一组测试数据为{<-1,1 500>,<0,1500>,<1,1 500>,<50,1 500>,<99,1 500>,<100,1 500>,<101,1 500>,<50,999>,<50,1 000>,<50,1 001>,<50,2 999>,<50,3 000>,<50,3 001>}。
健壮性测试最关心的是预期的输出,而不是输入。其最大价值在于观察并处理异常情况,是检测软件容错性的重要手段。
(4)最坏情况测试。
最坏情况测试拒绝“单缺陷”假设,它关心的是当多个变量取极值时会出现的情况。在这种测试中对每一个输入变量首先获得包括最小值、略大于最小值、正常值、略小于最大值和最大值5个元素的集合,然后对这些集合进行笛卡儿积计算以生成最坏情况测试用例。
有两个变量的软件P1的最坏情况测试用例如图2-6所示。
图2-6 有两个变量的软件P1的最坏情况测试用例
显然最坏情况测试将更加彻底,因为边界值分析测试是最坏情况测试用例的子集。进行最坏情况测试意味着更多的测试工作量,n个变量的函数会产生5n个测试用例,而边界值分析只产生4n+1个测试用例。
由此可以推知,健壮性最坏情况测试是对最坏情况测试的扩展,这种测试采用健壮性测试的7元素集合的笛卡儿积作为测试用例,即产生7n个测试用例。图2-7所示为有两个变量的函数的健壮性测试最坏情况的测试用例。
图2-7 有两个变量的函数的健壮性最坏情况测试用例
3.边界值分析法的测试用例案例
【案例1】三角形问题的边界值分析测试用例。
输入3个整数a、b、c分别作为三角形的3条边,通过软件判断这3条边是否能构成三角形。如果能构成三角形,则判断三角形的类型(等边三角形、等腰三角形、一般三角形)。要求输入的3个整数a、b、c必须满足条件1≤a≤100、1≤b≤100和1≤c≤100,请用边界值分析法设计测试用例。
Step 01 分析各变量取值。
边界值分析的基本思想是使用输入变量的最小值、略大于最小值、正常值、略小于最大值和最大值设计测试用例,因此a、b、c的边界取值是1、2、50、99、100。
Step 02 确定测试用例数。
有n个变量的软件的边界值分析会产生4n+1个测试用例,该案例有3个变量,因此会产生13个测试用例。
Step 03 设计测试用例。
用边界值分析法设计测试用例就是使一个变量取边界值(分别取最小值、略大于最小值、正常值、略小于最大值和最大值),其余变量取正常值,然后对每个变量重复进行。本例用边界值分析法设计的测试用例如表2-9所示。
表2-9 用边界值分析法设计的测试用例
【案例2】NextDate函数的边界值分析测试用例。
软件的3个输入变量month、day、year(均为整数值,并且满足条件1≤month≤12、1≤day≤31、1900≤year≤2050)分别作为输入日期的月份、日、年份,通过软件可以输出该输入日期在日历上下一天的日期。例如,输入为2005年11月29日,则输出为2005年11月30日,请用健壮性测试法设计测试用例。
Step 01 分析各变量的取值。
健壮性测试时,各变量分别取略小于最小值、最小值、略大于最小值、正常值、略小于最大值、最大值和略大于最大值。
month取-1、1、2、6、11、12、13,day取-1、1、2、15、30、31、32,year取1899、1900、1901、1975、2049、2050、2051。
Step 02 确定测试用例数。
有n个变量的程序,其边界值分析会产生6n+1个测试用例。本案例有3个变量,因此会产生19个测试用例。
Step 03 设计测试用例。
本案例用边界值分析法设计的测试用例如表2-10所示。
表2-10 用边界值分析法设计的测试用例
不难看出,有大量测试用例涉及简单日期计算和无效日期处理,冗余较为严重。其闰月的情况(2月月末的日期)完全没有测试到,肯定存在漏洞。然而边界值测试关注的是边界,只能以最少的测试用例保证覆盖所有可能的边界。因此不应视作冗余和漏洞,而从特殊值的角度所观察到的冗余和漏洞在等价类测试和基于决策表的测试中将通过等价划分及相似用例的合并策略来予以避免。
NextDate函数的复杂性来源于两个方面,一是输入域的复杂性(即输入变量之间逻辑关系的复杂性);二是确定闰年的规则。但是在进行健壮性测试时没有考虑输入变量之间的逻辑关系,也没有考虑和闰年相关的问题,因此在设计测试用例时存在遗漏问题。例如,判断闰年相关的日期2020.2.29和2019.2.28等。
2.1.2.3 决策表法
1.概念
决策表又称为“判定表”,是分析和表达多逻辑条件下执行不同操作情况的工具。在一些数据处理问题中某些操作的实施依赖于多个逻辑条件的组合,即针对不同逻辑条件的组合值分别执行不同的操作,决策表很适合处理这类问题。
决策表法
决策表能够将复杂问题按照各种可能的情况全部列举出来,简明并避免遗漏,因此用其能够设计出完整的测试用例集合。
运用决策表设计测试用例可以将条件理解为输入,将动作理解为输出。
2.原理
在所有的黑盒测试方法中基于决策表的测试是最严格且最具逻辑性的测试方法,在实际的软件测试中决策表并不是作为因果图的一个辅助工具而应用的,它特别适合应用于有很多输入输出并且输入和输出之间互相制约条件比较多的情况。
(1)决策表的组成。
决策表一般由4个部分构成,即条件桩、条件项、动作桩和动作项,如图2-8所示。
图2-8 决策表的组成
条件桩列出了问题的所有条件,通常认为列出的条件的次序无关紧要;动作桩列出了可能采取的操作,这些操作的排列顺序没有约束;条件项列出针对其左列条件的取值,以及在所有可能情况下的真假值;动作项列出在条件项的各种取值情况下应该采取的动作。
其中动作项和条件项紧密相关,指出条件项的各组取值情况下应采取的动作。将任何一个条件组合的特定取值及相应要执行的动作称为“一条规则”,在决策表中贯穿条件项和动作项的一列就是一条规则。
根据规则说明可以得到对应的决策表,如表2-11所示。
表2-11 根据规则说明得到的决策表
其中1表示是或者取该值,0表示否或者不取该值,-表示该值取什么均可。
在实际中可以看到决策表的运用,如“阅读指南”决策表如图2-9所示。
图2-9 “阅读指南”决策表
从表2-11中看出规则贯穿于条件项和动作项的一列,表中能列出多少组条件的取值就会有多少条规则。
(2)决策表的构造和进一步简化。
一般来说,构造决策表有如下5个步骤。
1)列出所有的条件桩和动作桩。
2)确定规则的个数,有n个条件的决策表有2n个规则(每个条件取真、假值)。
3)填入条件项。
4)填入动作项,得到初始决策表。
5)简化决策表,合并相似规则。若表中有两条以上规则具有相同的动作并且在条件项之间存在极为相似的关系,则可以合并。合并后的条件项用符号“-”表示,说明执行的动作与该条件的取值无关,称为“无关条件”。例如,两规则的动作项一样,条件项类似。在1、2条件项分别取Y、N时,无论条件3取何值都执行同一操作。即要执行的动作与条件3无关,于是可合并,“-”表示与取值无关,如图2-10所示。
图2-10 合并规则
与图(a)类似,在图(b)中无关条件项“-”可包含其他条件项取值,具有相同动作规则者合并。
例如,化简后的“阅读指南”决策表如表2-12所示。
表2-12 化简后的“阅读指南”决策表
(3)根据决策表设计测试用例。
在进一步简化的决策表构造完成后,只需选择恰当的输入值使得每一列的输入条件值得到满足即可生成相应的测试用例,一条规则一个测试用例。
决策表测试法适用于具有一定特征的应用程序,即if-else或switch case逻辑突出的程序、输入变量之间存在逻辑关系的程序、涉及输入变量子集的计算的程序,以及输入与输出之间存在因果关系的程序。
适用于使用决策表设计测试用例的条件一是需求规格说明书以决策表形式给出或较容易转换为决策表;二是条件的排列顺序不会也不应影响执行的操作;三是规则的排列顺序不会也不应影响执行的操作;四是当某一规则的条件已经满足,并确定要执行的操作后不必检验其他规则;五是如果某一规则的条件要执行多个操作任务,这些操作的执行顺序无关紧要。
3.决策表的测试用例案例
【案例1】三角形问题的决策表测试用例。
软件规定:“输入3个正整数a、b、c,分别作为三角形的三条边长。通过软件判断由这3条边构成的三角形类型为等边三角形、等腰三角形、一般三角形及不构成三角形。”用决策表测试方法为该软件进行测试用例设计。
Step 01 列出所有的条件桩和动作桩。
通过分析三角形问题的处理过程(即业务逻辑)得到当判断a=b=c时,输出“等边三角形”;当判断a=b或b=c或a=c时,输出“等腰三角形”;当a!=b且b!=c且c!=a时,输出“一般三角形”。可以看出输出由a、b、c之间是否相等的关系决定,这样可以把“a=b?”“a=c?”“b=c?”当作条件桩,把输出当作动作桩。
条件桩:C1:a,b,c构成三角形?
C2:a=b?
C3:a=c?
C4:b=c?
动作桩:A1:非三角形
A2:一般三角形
A3:等腰三角形
A4:d等边三角形
A5:不可能
Step 02 确定规则的个数,这里有4个条件且每个条件有两个取值,故应有24=16种规则。
Step 03 填入条件项。
Step 04 填入动作项,得到初始决策表,如表2-13所示。
表2-13 初始决策表
Step 05 合并相似规则后得到简化后的决策表,如表2-14所示。
表2-14 简化后的决策表
Step 06 根据决策表设计测试用例。
为每一条规则设计一个测试用例,如表2-15所示。
表2-15 为每一条规则设计一个测试用例
去掉不存在的情况后得到测试用例,如表2-16所示。
表2-16 去掉不存在的情况后的测试用例
【案例2】商场购物打折问题测试用例。
某付款软件实现的功能为:普通顾客一次购物累计少于100元不打折,一次购物累计多于或等于100元打9折;会员顾客按会员价格一次购物累计少于1 000元打8折,一次购物累计等于或多于1 000元打7折。用决策表法设计其测试用例。
Step 01 列出所有的条件桩和动作桩。
通过分析可以看出软件的输出,即顾客的应付款由顾客的身份和其购物金额决定,这样可以把顾客的身份及其购物金额当作条件桩,把软件的输出当作动作桩。
条件桩:C1:会员顾客?
C2:普通顾客?
C3:购物金额<100?
C4:购物金额≥100?
C5:购物金额<1 000?
C6:购物金额≥1 000?
动作桩:A1:打7折
A2:打8折
A3:打9折
A4:不打折
A5:不可能
Step 02 确定规则的个数,根据上述分析有6个条件且每个条件有两个取值,故应有26=64种规则。
修改条件桩使用有限条目决策表形成扩展条目决策表。
条件桩:C1:顾客为会员或普通顾客
C2:购物金额为(0,100)或[100,1 000)或[1 000,∞)
动作桩:A1:打7折
A2:打8折
A3:打9折
A4:不打折
修改后的规则数为2×3=6种规则。
Step 03 填入条件项。
Step 04 填入动作项,得到修改规则后的决策表,如表2-17所示。
表2-17 修改规则后的决策表
Step 05 根据决策表设计测试用例,为每一条规则设计一个测试用例,如表2-18所示。
表2-18 测试用例
2.1.2.4 因果图法
因果图法
1.概念
等价类划分法和边界值分析法都是着重考虑输入条件,但没有考虑输入条件的各种组合及其之间的相互制约关系。这样虽然各种输入条件可能出错的情况已经测试,但多个输入条件组合可能出错的情况却被忽视。
因果图法是一种挑选高效测试用例以检查组合输入条件的系统方法,其基本思路是从用自然语言书写的软件规格说明书的描述中找出因(输入条件)和果(输出或软件状态的改变),然后通过因果图转换为决策表。
使用因果图法的优势如下。
(1)考虑了输入的各种组合及其之间的相互制约关系。
(2)能够帮助测试人员按照一定的步骤高效率地开发测试用例。
(3)作为将自然语言规格说明转化成形式语言规格说明的一种严格方法,可以指出需求规格说明书存在的不完整性和二义性。
2.原理
(1)因果图中的关系。
因果图中使用了简单的逻辑符号,以直线连接左右节点。左节点表示输入状态(或称“原因”),右节点表示输出状态(或称“结果”)。通常用ci表示原因,一般置于图的左部;ei表示结果,通常在图的右部。ci和ei均可取值0或1,其中0表示某状态不出现;1表示某状态出现。
因果图中包含以下4种关系。
1)恒等:若c1为1,则e1也为1;若c1为0,则e1也为0。
2)非:若c1为1,则e1为0;若c1为0,则e1为1。
3)或:若c1或c2或c3为1,则e1为1;若c1、c2和c3都为0,则e1为0。“或”可有任意多个输入。
4)与:若c1和c2都为1,则e1为1;否则e1为0。“与”也可有任意多个输入。
因果图的4种关系如图2-11所示。
图2-11 因果图的4种关系
(2)因果图中的约束。
在实际问题中输入状态相互之间、输出状态相互之间可能存在某些依赖关系,称为“约束”。为了表示原因与原因之间,结果与结果之间可能存在的约束条件,在因果图中可以附加一些表示约束条件的符号。输入条件的约束有E、I、O、R,输出条件只有M约束。输入输出的约束图形符号如图2-12所示。
图2-12 输入输出的约束图形符号
为便于理解,这里设c1、c2和c3表示不同的输入条件,4种约束结果说明如下。
1)E(异):表示c1、c2中至多有一个可能为1,即c1和c2不能同时为1。
2)I(或):表示c1、c2、c3中至少有一个是1,即c1、c2、c3不能同时为0。
3)O(唯一):表示c1、c2中必须有一个且仅有一个为1。
4)R(要求):表示c1为1时c2必须为1,即不可能c1为1时c2为0。
5)M(强制):表示如果结果e1为1,则结果e2强制为0。
(3)因果图法设计测试用例的步骤。
1)分析需求规格说明书描述中哪些是原因,哪些是结果,其中原因常常是输入条件或输入条件的等价类;结果常常是输出条件。然后为每个原因和结果赋予一个标识符,并且把原因和结果分别画出后放在左边和右边一列。
2)分析需求规格说明书描述中的语义,找出原因与结果之间、原因与原因之间对应的关系,根据这些关系将其表示成连接各个原因与各个结果的因果图。
3)由于语法或环境的限制,所以有些原因与原因之间、原因与结果之间的组合情况不可能出现。为表明这些特殊情况,在因果图上用一些记号标明约束或限制条件。
4)把因果图转换成判定表,首先将因果图中的各原因作为判定表的条件项,各结果作为判定表的动作项。然后为每个原因分别取“真”和“假”两种状态,一般用1和0表示。最后根据各条件项的取值和因果图中表示的原因和结果之间的逻辑关系确定相应的动作项的值,完成判定表。
5)把判定表的每一列作为依据设计测试用例。
3.因果图的测试用例案例
【案例1】需求规格说明书。
需求规格说明书要求第1列字符必须是A或B,第2列字符必须是一个数字,在此情况下修改文件。如果第1列字符错误,则给出信息L;如果第2列字符不是数字,则给出信息M。
Step 01 根据需求规格说明书分析原因和结果。
原因如下。
1:第1列字符是A。
2:第1列字符是B。
3:第2列字符是一个数字。
结果如下。
21:修改文件。
22:给出信息L。
23:给出信息M。
Step 02 把原因和结果用逻辑符号连接画出因果图,如图2-13所示。
Step 03 考虑原因1和原因2不可能同时为1,因此在因果图中施加E约束,如图2-14所示。
图2-13 根据需求规格说明书绘制的因果图
图2-14 具有约束的因果图
Step 04 根据因果图建立的判定表如表2-19所示。
表2-19 根据因果图建立的判定表
Step 05 根据判定表设计测试用例,如表2-20所示。
表2-20 测试用例
【案例2】电力收费。
某电力公司有A、B、C、D共4类收费标准,并规定:居民用电小于100度/月,按A类收费;大于等于100度/月,或者动力用电小于10 000度/月且非高峰,按B类收费;大于等于10 000度/月且非高峰,或者小于10 000度/月且高峰,按C类收费;大于等于10 000度/月且高峰,按D类收费。请用因果图法设计测试用例。
Step 01 根据收费标准规定分析出原因和结果。
原因如下。
1:居民用电。
2:动力用电。
3:<100度/月。
3:≥100度/月。
4:非高峰。
4:高峰。
5:<10 000度/月。
5:≥10 000度/月。
结果如下。
A:按A类收费。
B:按B类收费。
C:按C类收费。
D:按D类收费。
Step 02 根据原因和结果绘制因果图,把原因和结果用逻辑符号连接。考虑到条件中居民用点和动力用电之间存在必须二选一的情况,因此在因果图中施加O约束,具有约束的因果图如图2-15所示。
图2-15 具有约束的因果图
Step 03 根据因果图建立的判定表如表2-21所示。
表2-21 根据因果图建立的判定表
Step 04 根据判定表设计测试用例,如表2-22所示。
表2-22 测试用例
2.1.2.5 状态转换法
1.概念
很多情况下,测试对象的输出和行为方式不仅受到当前输入数据的影响,还与测试对象之前的执行情况或之前的事件或输入数据有关。如果任何一个系统对同一个输入,根据不同的状态可以得到不同的输出,就是一个有限状态系统。系统可以从测试对象的初始状态开始转换到不同的状态,即事件驱动状态的转换。这里的有限状态机是表示有限个状态,以及在这些状态之间的转移和动作等行为的数学模型,可以通过状态图、状态表或状态树表示,如图2-16所示。
图2-16 有限状态机
这些表示形式并不重要,关键是能够看明白各个状态。
状态转换测试是一种基于产品规格分析状态转换的测试,即一种基于产品规格分析的黑盒测试技术。它对系统的每个状态及与状态相关的函数进行测试,通过不同的状态验证软件的逻辑流程。在状态转换测试中测试对象可以是一个具有不同系统状态的完整系统,也可以是一个在面向对象系统中具有不同状态的类,状态图是状态转换测试设计的基础。
2.原理
(1)状态图。
状态图通过描绘软件的“状态”及引发软件“系统转换”的“事件”来表示软件的行为,并且指明了作为特定事件的结果软件将做哪些“动作”。因此状态转换图提供了行为建模机制,相关概念如下。
1)状态是指对象在其生命周期中的一种状况,处于某一个特定状态中的对象必然满足某些条件而执行某些动作或者某些事件。例如,MP4有播放、暂停、快进、停止等状态。
2)事件是指在事件和空间上占有一定位置,并且对状态机来讲是有意义的那些事件。它通常会引起状态的变迁,促使状态机从一种状态转换到另外一种状态。
3)转换是指两种状态之间的一种关系,表明对象将在第1个状态中执行一定的动作并将在某个事件发生;同时某个特定条件满足时进入第2个状态。
4)动作是指状态转换之后一种结果或者输出。
(2)使用状态图转换法设计测试用例的步骤。
状态转换法的目的是设计足够的用例达到对软件状态、状态与动作组合及状态转换路径的覆盖,使用状态转换法测试设计测试用例的步骤如下。
1)根据需求提取全部状态。
2)绘制状态图。
3)根据状态图推导测试路径(状态树)。
4)选取测试数据,构造测试用例。
3.使用状态转换法设计测试用例案例
【案例】路人甲打电话预订飞机票到某地的测试用例。
Step 01 根据需求提取全部状态。
测试需求分析如下。
(1)客户向航空公司打电话预订机票,此时机票信息处于“完成预订”状态。
(2)顾客支付了机票款项后,机票信息变为“已支付”状态。
(3)客户当天到达机场并使用身份证换领登机牌后机票信息变为“已出票”状态。
(4)检票登机后机票信息变为“已使用”状态。
(5)在登机前可以取消订票信息,若已支付机票费用,则可以退回票款。
(6)取消后订票信息处于“已取消”状态。
由以上分析得出客户预订机票时订单的全部状态,即完成预定、已支付、已出票、已使用、已取消。
Step 02 绘制状态图,根据客户预订机票时订单的全部状态绘制状态图,如图2-17所示。
图2-17 预订机票状态图
Step 03 根据预订机票状态图得出测试路径包括如下几种。
(1)完成预订→。
(2)完成预订→已支付→已取消。
(3)完成预订→已支付→已出票→已取消。
(4)完成预订→已支付→已出票→已使用。
Step 04 根据测试路径编写测试用例,每一条路径就是一个测试用例。
2.1.2.6 错误推测法
错误推测法是指人们基于经验和直觉推测软件中可能存在的各种错误,并且针对这些错误设计相应的测试用例,它常常作为一种补充测试用例的设计方法。
错误推测法的基本思想是,列举出软件所有可能的错误和容易发生错误的特殊情况,并根据它们选择测试用例,举例如下。
(1)输入数据和输出数据为0的情况;输入表格为空格或表格只有一行,这些都是容易发生错误的情况,可选择这些情况下的例子作为测试用例。
(2)时间性测试,提交操作时限;未到达的日期是否可以选择、前后时间限制问题和系统时间调整等这些都是时间测试的注意点,可选择这些特殊时间作为测试用例。
(3)测试一个对线性表(如数组)进行排序的软件,输入的线性表为空表:表中只含有一个元素、表中所有元素已排序,以及表中部分或全部元素相同等,可推测这几项是需要特别测试的情况并设计测试用例。
从上述可以看出需要完成的前提条件如下。
(1)深入熟悉被测试软件的业务和需求。
(2)对被测试软件或类似之前的缺陷分布情况进行过系统分析,包括功能缺陷、数据缺陷、接口缺陷和界面缺陷等。
通过错误推测法可以充分发挥个人的经验和潜能、测试的命中率高,可以集思广益,并且快速切入。但是测试覆盖率难以保证,可能丢失大量未知的区域;另外,错误推测法带有主观性且难以复制。该方法过多地依赖于个人的经验,因此应根据实际的测试需要进行选择。
2.1.3 选择策略
黑盒测试法的共同特点是,都把软件看作是一个打不开的盒子,只知道输入和输出的映射关系,根据需求规格说明书设计测试用例。以下是各种黑盒测试方法的选择策略,可在实际应用过程中参考。
(1)等价类划分法包括输入条件和输出条件的等价划分,将无限测试变成有限测试。
(2)在任何情况下都必须使用边界值分析方法,经验表明用这种方法设计的测试用例发现软件缺陷的能力最强。
(3)在因果图测试和决策表测试方法中通过分析被测程序的逻辑依赖关系构造决策表,进而设计测试用例。
等价划分类、边界分析值、判定表、因果图、状态转换法都是比较常用的黑盒测试方法,每种方法都有其优点不足及使用的场合,测试的时候要根据实际情况灵活选择。