1、第四章 黑盒测试,黑盒测试是从软件的外部对软件实施测试,也常形容为闭着眼睛测试。在实践中,应针对软件开发项目的具体特点,选择适当的测试方法,有效地解决软件开发中的测试问题。,本章重点: 等价类划分测试、 边界值分析、 决策表测试。 因果图,4.1 三个被测程序,在第四章和第五章,将采用三个例子说明各种测试方法。 这三个例子是:一个是三角形问题;一个是逻辑比较复杂的NextDate函数;一个是有代表性的雇佣金问题。,4.1.1 三角形问题,三角形问题是软件测试文献中使用最广泛的一个例 子。三角形问题:输入三个整数a、b和c分别作为三角 形的三条边,程序判断由这三条边构成的三角形类 型是:等边三角
2、形、等腰三角形、一般三角形或非 三角形(不能构成一个三角)。,三角形问题之所以复杂, 是因为输入与输出之间的关系比较复杂。,三角形问题可以更详细地描述为: 三角形问题:输入三个整数a、b和c分别作为三角形 的三条边,要求a、b和c必须满足以下条件: Con 11a100 Con 4ab+c Con 21b100 Con 5ba+c Con 31c100 Con 6ca+b,如果a、b和c满足Con1、Con2和Con3,则输出为四种情况之一: 1)如果不满足条件Con 4、Con 5和Con 6中有一个,则程序 输出为“非三角形”。 2)如果三条边相等,则程序输出为“等边三角形”。 3)如果恰
3、好有两条边相等,则程序输出为“等腰三角形”。 4)如果三条边都不相等,则程序输出为“一般三角形”。,4.1.2 NextDate函数,NextDate函数是一个有三个变量month(月份)、 day(日期)和year(年)的函数。输出为输入日期后一天 的日期。例如,如果输入为:2003年10月29日,则NextDate函数的输出为:2003年10月30日。,要求输入变量month、day和year都是整数值, 并且满足以下条件:Con1 1month12Con2 1day31Con3 1912year2050,NextDate函数规格说明可以更具体一些: 包括对day、month和year的无
4、效输入值的响应定义, 对无效逻辑组合进行定义等。,例如对任意年的2月31日的响应。 如果Con1,Con2或Con3中任何一个条件失效,则NextDate都会 产生一个输出,指明相应的变量超出了取值范围。 例如,“month值不在112范围内”。 存在大量的无效day-month-year的组合。,NextDate函数中复杂性来源: 一是所讨论输人域的复杂性, 一是确定闰年的规则。 一年有365.2422天,因此,闰年被用来解决“额外天”的问题。,4.1.3 雇佣金问题,第三个例子是一个典型的商务计算例子,包含了计算和决策,因此引出了许多有意思的测试问题。,前亚利桑那州境内的一位步枪销售商销售
5、密苏里州制造的步枪 机(lock)、枪托(stock)和枪管(barrel)。枪机卖45美圆、枪托卖30美 圆,枪管25美圆。销售商每月至少要售出一支完整的步枪,制造商 的生产限额可提供大多数销售商一个月内销售70个枪机、80个枪托 和90个枪管。销售商每访问一个镇之后,都给密苏里州步枪制造商 发封电报,说明那个镇出售的枪机、枪托和枪管数量。月末,销售 商发出-1个枪机被售出,表明一个月结束,这样步枪制造商就知道 当月的销售情况,并计算销售商的雇佣金。,销售商的雇佣金计算如下: 销售额不到(含)1000美元的部分为10, 1000(不含)1800(含)美元的部分为15, 超过1800美元的部分
6、为20。 雇佣金程序生成按月份的销售报告,汇总售出的枪机、 枪托和枪管总数,销售商的总销售额以及雇佣金。,这个问题可以分为三个不同的部分: 1)输人数据部分,用来处理输入数据有效性; 2)销售额计算部分; 3)雇佣金计算部分。,4.1.3 雇佣金问题,4.2 等价类划分测试,等价类划分是一种典型的黑盒测试方法,该方法完全不考虑程序的内部结构,只根据对软件的要求和说明,即需求规格说明书,把程序输入域划分成若干部分,然后从每个部分中选取少数代表性数据为作测试输入。,使用等价类划分方法设计测试用例, 必须在分析需求规格说明的基础上划分等价类。,4.2.1 等价类划分,等价类划分把程序的输入域划分成若
7、干个互不相交的子集等价类。所谓等价类是指输入域的某个集合,等价类的并便是整个输入域。,这对于测试有两个非常重要的意义: 表示整个输入域提供了一种形式的完备性, 而互不相交则可保证一种形式的无冗余性。,4.2.1 等价类划分,等价类由等价关系决定。因此等价类中的元素有 一些共同的特点:如果用等价类中的一个元素作为测试数据进行测 试不能发现程序中的故障,那么使用集合中的其它 元素进行测试也不可能发现程序故障。,对揭露程序中的故障来说, 等价类中的每个元素是等效的。,等价类划分测试的实现分二步进行, 一是确定等价类, 二是确定测试用例。,一、划分等价类,软件不能都只接收有效的、合理的数据, 还要经受
8、意外的考验,即接受无效的或不合理的数据, 这样获得的软件才能具有较高的可靠性。,确定等价类, 是使用等价类测试方法 的一个重要问题。,4.2.1 等价类划分,有效等价类:有效等价类是指对程序规格说明,是有意义的,合理的输人数据所构成的集合。利用有效等价类,可以检验程序是否实现了规格说明预先规定的功能和性能。在具体问题中,有效等价类可以是一个,也可以是多个。,在考虑等价类时,应注意区别有效等价类和无效等价类。,4.2.1 等价类划分, 无效等价类:无效等价类是指对程序规格说明,是不合理或无意义的输入数据所构成的集合。利用无效等价类,可以检查程序功能和性能的实现是 否有不符合规格说明要求的地方。对
9、于具体的问题,无效等价类至少应有一个,也可能有多个。,4.2.1 等价类划分,(1)按区间划分如果规格说明规定了输入条件的取值范围或值的数量,则可确定一个有效等价类和两个无效等价类。 (2)按数值划分如果规格说明规定了输入数据的一组值,而且软件要对输入值分别进行处理,则可为每个输入值确立一个有效等价类,此外针对这组值确立一个无效等价类。 (3)按数值集合划分如果规格说明规定了输入值的集合,则可确定一个有效等价类和一个无效等价类。,4.2.1 等价类划分,(4)按限制条件和规则划分如果规格说明规定了输入数据必须遵守的规则和限制条件,则可确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度
10、违反规则)。 (5)细分等价类等价类的各个元素在程序中的处理可能不同,可以将此等价类进一步划分成更小的等价类。,4.2.1 等价类划分,二、设计测试用例,在设计测试用例时, 应同时考虑有效等价类和 无效等价类测试用例的设计。,希望用仅可能少的测试用例,覆盖所有的有效等价类。,但对每一个无效等价类,设计一个测试用例来覆盖它。,4.2.1 等价类划分,根据已列出的等价类表,按以下步骤确定测试用例:1)为每个等价类规定一个唯一的编号。2) 设计一个新的测试用例,尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步,直到测试用例覆盖了所有的有效等价类。3) 设计一个新的测试用例,使其覆盖并且只覆盖一个还没
11、有被覆盖的无效等价类。重复这一步,直至测试用例覆盖了所有的无效等价类。,4.2.1 等价类划分,若用一个测试用例检测多个无效等价类,某些无效 等价类可能永远不会被检测到。,因为第一个测试可能会 屏蔽或终止其他无效等价类的测试执行。,4.2.1 等价类划分,等价类测试也遵循边界值测试的两个决定因素:健壮性和单/多故障假设。,弱健壮等价类测试传统等价类测试形式, 关注无效数据值。,弱/强 等价类测试,健壮/标准 等价类测试,4.2.2 常见的等价类测试形式,为便于理解,我们也以一个有两个输入变量x1和x2的程序F为例,说明一般等价类测试和健壮等价类测试。,因此,变量x1和x2,的无效值分别为:x1
12、d和 x2g,4.2.2 常见的等价类测试形式,假设:输入变量x1和x2在下列范围内取值: ax1d, 区间a,b,(b,c),c,d ex2g, 区间e, f,f, g 其中方括号和圆括号分别表示闭区间和开区间的端点,1.标准等价类测试 标准等价类测试不考虑无效数据值。测试用例使用每个等价类中的一个值。,4.2.2 常见的等价类测试形式,x1有效等价类 a,b,(b,c),c,d x2有效等价类 e, f,f, g,测试用例的数量 和含最大子集数目 的等价类中的数目相同。,4.2.2 常见的等价类测试形式,2.健壮等价类测试健壮源于这种等价类测试考虑了无效等价类。 对有效输入来说,测试用例从
13、每个有效等价 类中只取一个值(和标准等价类测试一样)。 注意这些测试用例里的每个输入都是有效的。 2. 对无效输入来说,一个测试用例有一个无效 值,其它值都取有效值。,4.2.2 常见的等价类测试形式,x1有效等价类 a,b,(b,c),c,d x2有效等价类 e,f,f,gx1无效等价类x1d x2无效等价类x2g,测试用例的数量 3+2*2=7。,4.2.2 常见的等价类测试形式,健壮等价类测试有两个问题:1)规格说明常常没有定义无效测试用例所预期的输出是什么? 2) 强类型语言没有必要考虑无效输入。,测试人员需要花大量时间 来定义这些测试用例的输出。,弱健壮等价类测试是FORTRAN和C
14、OBOL这样的语言占统治地位的产物。,事实上, 正是由于经常出现输入无效值这样的错误, 才导致了强类型语言的出现。,4.2.2 常见的等价类测试形式,1. 三角形问题的等价类测试用例 (1)传统等价类划分测试用例设计在三角形问题中,输入条件要求:,4.2.3 等价类划分测试举例, 整数; 三个数; 取值在1到100之间,4.2.3 等价类划分测试举例,仔细分析三角形问题,可得出其等价类表。 表4-2 三角形问题的等价类,1,4.2.3 等价类划分测试举例,有效等价类覆盖(3,4,5) 覆盖无效等价类的测试用例见表4-3所示。 表4-3 三角形问题的无效等价类测试用例,(2)标准和健壮等价类划分
15、测试用例设计 三角形问题有四种可能输出:非三角形,一般三角形,等腰三角形和等边三角形。利用这些信息来确定输出(值域)等价类。,R1=:边为a,b,c的等边三角形 R2=:边为a,b,c的等腰三角形 R3=:边为a,b,c的一般三角形 R4=:边a,b,c不能形成三角形,4.2.3 等价类划分测试举例,四个标准等价类测试用例是:,4.2.3 等价类划分测试举例,第二种划分等价类方法,4.2.3 等价类划分测试举例,2. NextDate 函数的等价类测试用例设计,NextDate是一个含三个变量month,day,year的函数。有效值区间定义如下:M1=month: 1month12D1=da
16、y: 1day31Y1=year: 1912year2050,无效等价类是: M2=month: month12 D2=day: day31 Y2=year: year2050,NextDate函数可以很好地 说明选择等价关系的技巧。,2. NextDate 函数的等价类测试用例设计,只有一个标准等价类测试用例:,2. NextDate 函数的等价类测试用例设计,健壮等价类测试用例:,2. NextDate 函数的等价类测试用例设计,如果更仔细地选择等价关系,可以得到更有用的等价类。,假设下面的等价类: M1=month: month has 30 days M2=month: month h
17、as 31 days M3=month: month is February D1=day: 1day28 D2=day: day=29 D3=day: day=30 D4=day: day=31 Y1=year: year=2000 Y2=year: year is a leap year Y3=year: year is a common year,简化month的处理,2. NextDate 函数的等价类测试用例设计,标准等价类测试用例:,机械地选择输入值而不考虑定义域, 因此没有考虑两个不可能出现的日期。,2. NextDate 函数的等价类测试用例设计,健壮等价类测试用例:,3.雇佣
18、金问题的等价类测试用例设计,佣金问题的输入定义域很“自然地”受枪机,枪托和枪管的限制而被划分为3类。,有效等价类是: L1=locks: 1locks70 L2=locks=-1 S1=stocks: 1stocks80 B1=barrels: 1barrels90,无效等价类是: L3=locks: locks=0 OR locks70 S2=stocks: stocks80 B2=barrels: barrels90,3.雇佣金问题的等价类测试用例设计,除了变量名称和区间端点以外,其它和第一个版本的NextDate函数一样。因此,可以设计一个标准等价类测试用例。Test1: 枪机=4, 枪
19、托=5, 枪管=9 有7个健壮性等价类测试用例如表4-8所示。,3.雇佣金问题的等价类测试用例设计,3.雇佣金问题的等价类测试用例设计,输入域等价类不能产生令人满意的测试用例集合。,考虑在输出域上定义等价类。 销售额是已售枪机,枪托和枪管的函数: 销售额=45*枪机+30*枪托+25*枪管,可以在佣金域定义三个变量的等价类: S1=: sales1000 S2=: 1000: sales1800,3.雇佣金问题的等价类测试用例设计,输出域等价类测试用例:,4.2.4 等价类测试的指导方针,使用等价类测试时,应注意如下几点: 如果执行语言是强类型的,则没有必要使用健壮等价类测试。 如果错误输入检
20、查非常重要,则应进行健壮等价类测试。 如果输入数据以离散值区间或集合的形式定义,则等价类测试是合适的。 在发现“合适”的等价关系之前,可能需要进行多次尝试。,4.3 边界值分析,使用边界值分析方法设计测试用例,首先应确定边界情况。输入等价类与输出等价类的边界,就是应着重测试的边界情况。边界值分析方法的基本思想是,选取正好等于,刚刚大于,或刚刚小于边界的值做为测试数据,而不是选取等价类中的典型值或任意值做为测试数据。,人们从长期的测试工作经验得知,大量的故障发生在输入或输出范围的边界上,而不是在输入范围的内部。实践表明,在设计测试用例时,对边界附近的处理必须给予足够的重视,为检验边界附近的处理专
21、门设计测试用例,常常可以取得良好的测试效果。,4.3.1 边界条件,边界条件是一些特殊情况。程序在处理大量中间数值时都是正确,但是在边界处可能出现错误。 比如,在作三角形计算时,要输入三角形的三个边长:a、b和c。当满足a+bc、a+cb及b+ca才能构成三角形。但如果把三个不等式的任何一个大于号“”错写成大于等于号“”,那就无法构成三角形了。,4.3.1 边界条件,再如:下面是一个极简单的程序。/* Create a 10 element integer array */* Initiatize each element to 1 */main ()int data 10;int i;For
22、 (i=1;i=10;i+ )data(i)=-1;这段代码的意图是创建包含10个元素的数组,并为数组中的每一个元素赋初值-1 ,即数组中从第1个元素到第10个元素被赋予数值-1。,4.3.1 边界条件,但程序执行完毕,数组值如下:data(0)=0; data(1)=-1; data(2)=-1; data(3)=-1; data(4)=-1; data(5)=-1; data(6)=-1; data(7)=-1; data(8) =-1; data(9) =-1; data(10)=-1,此时data(0)的值是0,而不是-1。如果程序员以后忘记了,或者其他程序员不知道这个数组只对data
23、(1)到data(10)进行了初始化,那么他就可能会用到数组的第1个元素data(0),以为它的值是-1。,4.3.1 边界条件,刚开始时,可能意识不到一组给定数据包含了 多少边界。但是仔细分析总可以找到一些不明显 的、有趣的和可能产生软件故障的边界。实际上,边界条件就是软件操作界限所在的边缘 条件。一些可能与边界有关的数据类型有:数值,速度, 字符,地址,位置,尺寸,数量,等等。同时,考虑这些类型的下述特征:第一个/最后一个,最小值最大值,开始完 成,超过/在内,空满,最短最长,最慢/最快, 最早/最迟,最高最低,相邻最远,等等。,4.3.2 次边界条件,有些边界在软件内部,用户几乎看不到,
24、但是软件测试仍有必要对这些边界条件进行检查。这样的边界条件称为次边界条件或者内部边界条件。,寻找次边界条件比较困难,虽然不要求软件测试员成为程序员或者具有阅读源代码的能力,但是要求软件测试员能大体了解软件的工作方式。,4.3.2 次边界条件,1、2的幂次方 表4-10 2的幂次方所表示的,4.3.2 次边界条件,例如,假设某种通讯协议支持256条命令,为了提高数据传输效率,通讯软件总是将常用的信息压缩到一个很小的单元中,必要时再扩展为大一些的单元。比如将常用的15条命令压缩为一个半字节数据,在遇到第16到256之间的命令时,软件转而发送一个一字节的命令。用户只知道可以执行256条命令,并不知道
25、软件根据半字节/字节边界执行了不同的计算和操作。为了覆盖所有可能的2的幂次方次边界,还要考虑临近半字节边界的14,15和16,以及临近字节边界的254,255和256。,4.3.2 次边界条件,2、ASCII表 表4-11 部分ASCII值表,4.3.2 次边界条件,表4-11中,09的ASCII值是4857。斜杠字符(/)在数字0的前面,而冒号字符(:)在数字9的后面。大写字母AZ对应6590。小写字母对应97-122。这些情况都代表次边界条件。如果对文本输入或文本转换软件进行测试,在考虑数据区间包含哪些值时,参考一下ASCII表是相当明智的。例如,如果测试的文本框只接受用户输入字符AZ和a
26、z,就应该在非法区间中,检测ASCII表中位于这些字符前后的值,和。,4.3.2 边界值分析测试,这里讨论一个有两个变量x1,x2的程序F,输入变量x1和x2在下列范围内取值:ax1bcx2d区间a,b和c,d是x1和x2的值域,强类型语言(例如Ada)允许显式地定义这种变量值域。事实上,边界值测试更适于采用非强类型语言编码的程序。,程序F的输入空间(定义域)如图4-3所示。 带阴影矩形中的任何点都是程序F的有效输入。,4.3.2 边界值分析测试,边界值分析的基本思想是利用输入变量值的 最小值,稍大于最小值,正常值,稍小于最大值和最 大值。,边界值分析测试用例的获得,通过使所有变量取正常值,只
27、使一个变量分别取最小值、略高于最小值、略低于最大值和最大值。,4.3.2 边界值分析测试,, , , , ,N个变量,边界值分析 产生4n+1个测试用例。,4.3.4 健壮性测试,健壮性测试是边界值分析的一种扩展。变量除了取min,min+,nom,max-,max五个边界值外,还要考虑采用一个略超过最大值(max+)以及一个略小于最小值(min-)的取值,看看超过极限值时系统会出现什么情况。,健壮性测试最有意义的部分不是输入,而是预期的输出,观察例外情况如何处理。,N个变量,健壮边界值分析 产生6n+1个测试用例。,最坏边界条件法(5n),健壮最坏边界条件法(7n),4.3.3 边界值分析举
28、例,边界值分析测试用例的获得,通过使所有变量取正常值,只使一个变量分别取最小值、略高于最小值、略低于最大值和最大值。,一、三角形问题的边界值分析测试用例,边长下界为1,边长上界可取为100。,二、NextDate函数的测试用例,NextDate函数是一个有三个变量month(月份)、 day(日期)和year(年)的函数。 输出为输入日期后一天的日期。,要求输入变量month、day和year都是整数值,并且满足 下条件:Con1 1month12Con2 1day31Con3 1912year2050,二、NextDate函数的测试用例,二、NextDate函数的测试用例,雇佣金问题的测试用
29、例生成步枪销售商销售密苏里州制造的步枪机(lock)、枪托(stock)和枪管(barrel)。枪机卖45美圆、枪托卖30美圆,枪管25美圆。销售商每月至少要售出一支完整的步枪,制造商的生产限额可提供大多数销售商一个月内销售70个枪机、80个枪托和90个枪管。销售商每访问一个镇之后,都给密苏里州步枪制造商发封电报,说明那个镇出售的枪机、枪托和枪管数量。月末,销售商发出-1个枪机被售出,表明一个月结束,这样步枪制造商就知道当月的销售情况,并计算销售商的雇佣金。,三、佣金问题的测试用例,雇佣金问题的测试用例生成销售商的雇佣金计算如下: 销售额不到(含)1000美元的部分为10, 1000(不含)1
30、800(含)美元的部分为15, 超过1800美元的部分为20。,三、佣金问题的测试用例,4.3.3 边界值分析的局限性,基于函数(程序)输入定义域的测试方法,是所有测试方法中最基本的。这类测试方法都有一种假设,即输入变量是真正独立的。如果不能保证这种假设,则这类方法不能产生令人满意的测试用例。,在所有的黑盒测试方法中,基于决策表的测试是最严格,最具有逻辑严格性的测试方法。 决策表最突出的优点是,它能把复杂的问题按各种可能的情况一一列举出来,简明而易于理解,也可避免遗漏。,因此利用决策表可以设计出完整的测试用例集合。,4.4 决策表测试,在一些数据处理问题中,某些操作的实施 依赖于多个逻辑条件的
31、取值,也即针对不同逻辑 条件组合值,分别执行不同的操作。,描述不同条件集合下采取行动的若干组合情况。,4.4 决策表测试,4.4.1 决策表,决策表通常由4个部分组成:,条件桩部分列出了问题的所有条件 , 动作桩则给出了问题规定的可能采取的操作。,动作项和条件项紧密相关, 指出了在条件项的各组取值情况下应采取的动作。,4.4 决策表测试,基于决策表的测试,在实际使用判定表时,常常先将它简化。简化是以合并相似规则为目标的。,如果两个或多个条件项产生的动作项是相同的, 且其条件项对应的每一行的值只有一个是不同的, 则可以将其合并。 合并的项除了不同值变成无关项外, 其余的保持不变。,4.4 决策表
32、测试,合并规则的办法 :,4.4 决策表测试,1)列出所有的条件桩和动作桩。2)确定规则的个数。每个条件可取两个取值, 故应有2n种规则。3)填入条件项。4)填入动作项,这样便可得到初始决策表。5)化简,合并相似规则后得到决策表。,结合三角形问题给出构造决策表的5个步骤:,4.4 决策表测试,4.4 决策表测试,合并相似规则后三角形问题的决策表如下:,如果条件引用了等价类,则决策表会有一种典型的外观。,M1=month: month has 30 days M2=month: month has 31 days M3=month: month is February,4.4 决策表测试,c1:
33、 ab+c? c2: ba+c? c3: ca+b? c4: a=b? c5: a=c? c6: b=c?,a1: 非三角形 a2: 一般三角形 a3: 等腰三角形 a4: 等边三角形 a5: 不可能,F ,T F ,表420 扩展的三角问题的决策表,T T F ,T T T T T T,T T T T T F,T T T T F T,T T T T F F,T T T F T T,T T T F T F,T T T F F T,T T T F F F,根据决策表, 可开发出11个 测试用例。,4.4 决策表测试,4.4.2 决策表在黑盒测试中的应用,表421 三角形问题的决策表测试用例,选择
34、NextDate函数是因为它可以说明输入域的 相关性问题。决策表可以突出这种依赖关系。,等价类测试局限性之一是机械地选择等价类中的 输入值,这可能会产生“奇怪的”测试用例。例如,找出2051年6月31日的下一天。,问题由变量相互独立这个假设引起。,4.4.2 决策表在黑盒测试中的应用,如果变量确实是相互独立的,那么使用等价类的 笛卡儿积有意义。如果变量间存在逻辑依赖关系,那么这些依赖关 系在机械地选取输入值时可能丢失。,决策表方法通过使用 “不可能动作”概念表示条件的 不可能组合,来强调这种依赖关系。,4.4.2 决策表在黑盒测试中的应用,NextDate函数能够使用的操作只有5种:Day变量
35、1Month 变量1Day变量复位Mongth变量复位Year变量1,4.4.2 决策表在黑盒测试中的应用,M1:month: month有30天M2:month : month有31天,12月除外M3:month : month是12月)M4:month : month是2月)D1:day:1 day 27)D2:day : day :28)D3:day : day :29)D4:day : day :30D5:day : day :31)Y1:year: year是闰年Y2:year : year不是闰年,4.4.2 决策表在黑盒测试中的应用,建立决策表,将注意力集中到NextDate函数
36、的日、月问题上,并仔细研 究动作桩,可以在以下等价类集合上建立决策表。,决策表分类,所有条件都是二叉条件的决策表叫做有限条目决策表。 如果条件可以有多个值,则对应的决策表叫做扩展条目决策表。,NextDate函数的测试用例,有30天的月份,有31天的月份 (非12月),12月份,不可能规则,可以简化,关注2月和闰年,使用决策表代数进一步简化这22个测试用例。,4.4.2 决策表在黑盒测试中的应用,使用决策表代数进一步简化这22个测试用例。,4.4.2 决策表在黑盒测试中的应用,Test: month day year 预期输出 Test1-3: 8 16 2001 17/08/2001 Tes
37、t4: 8 30 2001 1/09/2001 Test5: 8 31 2001 不可能,Test: Test1-3: Test4: Test5:,4.4.2 决策表在黑盒测试中的应用,Test: month day year 预期输出 Test6-9: 1 16 2001 17/01/2001 Test10: 1 31 2001 1/02/2001 Test11-14: 12 16 2001 17/12/2001,Test: Test6-9: Test10: Test11-14:,4.4.2 决策表在黑盒测试中的应用,Test: month day year 预期输出 Test15: 12
38、31 2001 1/01/2002 Test16: 2 16 2001 17/02/2001 Test17: 2 28 2004 29/02/2004,Test: Test15: Test16: Test17:,4.4.2 决策表在黑盒测试中的应用,Test: month day year 预期输出 Test18: 2 28 2001 1/03/2002 Test19: 2 29 2004 1/03/2004 Test20: 2 29 2001 不可能 Test21-22: 2 30 2001 不可能,Test: Test18: Test19: Test20: Test21-22,4.4.2
39、决策表在黑盒测试中的应用,使用决策表设计测试用例, 可以把条件解释为输入,把行动解释为输出。 设计出完整的测试用例集合。,4.4.2 决策表在黑盒测试中的应用,佣金问题的测试用例,决策表分析不太适合佣金问题。因为在佣金问题中只有很少的决策逻辑。由于等价类中的变量是真正独立的,在条件对应等价类的决策表中没有不可能规则。因此,我们得到的测试用例与等价类测试用例一样。,4.4.2 决策表在黑盒测试中的应用,4.4.3 基于决策表测试的指导方针,与其他测试方法一样,基于决策表的测试对于某些应用程序(例如NextDate函数)很有效,但是对另一些应用程序(例如佣金问题)就不值得费这么大精力。基于决策表测
40、试适用于要发生大量决策的情况(例如三角形问题),或在输入变量之间存在重要的逻辑关系的情况(例如NextDate函数)。,1决策表方法适用于具有以下特征的应用 程序if-else逻辑突出。输入变量之间存在逻辑关系。涉及输入变量子集的计算。输入与输出之间存在因果关系。,4.4.3 基于决策表测试的指导方针,2.适合于使用决策表设计测试用例的情况有: 规格说明以决策表形式给出,或是很容易转换成决策表。 条件的排列顺序不会也不应影响执行的操作。 规则的排列顺序不会也不应影响执行的操作。 每当某一规则的条件已经满足,并确定要执行的操作后,不必检验别的规则。 如果某一规则得到满足要执行多个操作,这些操作的
41、执行顺序无关紧要。,4.4.3 基于决策表测试的指导方针,4.4.3 基于决策表测试的指导方针,3决策表规模较大,有n个条件的有限条目决策表有2n规则。4与其他方法一样,迭代会有所帮助。,因果图方法适合于描述对于多种条件的组合,产生多个相应动作的测试方法,能够帮助测试人员按照一定的步骤,高效率地开发测试用例,以检测程序输入条件的各种组合情况。,因果图方法最终生成的是决策表。 1分析程序规格说明的描述中,哪些是原因,哪些是结果。 原因常常是输入条件或是输入条件的等价类,而结果则是输出条件。 2找出原因与结果之间,原因与原因之间的对应关系, 并将其表示成连接各个原因与各个结果的“因果图”。 3把因
42、果图转换成判定表。,4.5因果图方法,图48 因果图的基本符号,图49 约束符号,最多有一个可能为1 至少有一个必须是1 必须有一个1且仅有一个1,a是1时,b必须是1 输出条件约束:结果a是1,则结果b强制为0,因果图产生测试用例的步骤,把程序的规格划分解成可以工作的片断; 确定规格中的原因和结果; 分析规格以确定原因和结果之间的逻辑关系,并且使用因果图表示出来; 确定句法或环境的约束,这些约束使得某些组合不能产生; 把因果图转化成有限入口决策表; 从决策表的每一列选取一个测试用例。,因果图案例,第一列字符必须或,第二列字符必须是数字,在此情况下文件被更新。但如果第一个字符不正确,那么信息被
43、产生;如果第二个字符不是数字,则信息产生。,案例分析,原因:第一个字符是“”第一个字符是“” 第二个字符是一个数字 结果:进行更新产生信息 产生信息,简单的因果图,带有约束的因果图,决策表,练习,有一个处理单价为1元5角钱的盒装饮料的自动售货机软件。若投入1元5角硬币,按下“可乐”、“雪碧”和 “红茶”按钮,相应的饮料就送出来。若投入的是两元硬币,在送出饮料的同时退还角硬币。 练习:做出因果图,编制出决策表,练习因果图,练习决策表,因果图小结,根据需求规格说明书,分析因果关系; 有助于用一个系统的方法选择出高效的测试用例集; 额外的好处,就是可以指出规格说明的不完整性和不明确之处。 因果图是一
44、种形式语言,实际上是一种数字逻辑电路,但没有使用标准的电子学符号,而是使用了稍微简单点的符号。,正交测试法,正交测试源于正交试验设计方法,是从大量的数据中挑选适量的、有代表性的点,从而合理地安排测试的一种科学的试验设计方法。 正交测试法就是使用已经造好了的正交表格来安排试验并进行数据分析的一种方法。 它简单易行并且计算表格化,应用性较好。,正交表,正交表的表示形式: L次数(水平数因素数) LRuns(LevelsFactors) 例如:()、其中,为此表列的数目(最多可安排的因子数);2为因子的水平数;8为此表的数目(试验次数)。,正交表行的个数,对应到正交表测试法设计成的测试的个数。,因素
45、数是正交表中列的个数,对应到这种技术设计测试用例时的变量的最大个数。,水平数是任何单个因素能够取得的值的最大个数。,正交表,特点:(1)每一列中,不同的数字出现的次数相等。如在三水平正交表中,任何一列都有“1”、“2”、“3”,且在任一列的出现数均相等。,(2)任意两列中数字的排列方式齐全而且均衡。例如在三水平情况下,任何两列(同一横行内)有序对共有9种,1.1、1.2、1.3、2.1、2.2、2.3、3.1、3.2、3.3,且每对出现数也均相等。,正交测试用例设计步骤,(1)确定交互测试中有多少个相互独立的变量,这映射到表中的因素数(Factors)。 (2)确定每个变量可以取值的个数的最大
46、数,这映射到表中的水平数(Levels)。 (3)选择一个次数(Run)数最少的最适合的正交表。一个最合适的正交表是至少满足第一步说明的因素数和第二步说明的水平数。 (4)把因素和值映射到表中。 (5)为剩下的水平数选取值。 (6)把次数中所描述的组合转化成测试用例,再增加一些没有生成的但可疑的测试用例。,练习一,假设一个网页有3个不同的部分(Top、Middle、Bottom),并且可以把其中的一个单独部分显示及隐藏。要测试这三个不同部分的交互。按照前面给出的正交表测试用例设计步骤,设计该系统的正交表测试用例。,用例设计步骤,(1)确定有3个独立的变量(网页的3个部分)。 (2)每个变量能够
47、取两个值(Hidden或Visible)。 (3)选择正交表变量为三因素,值为二水平。,正交用例表,因素映射之后,(4)把变量的值映射到表中,其中Hidden=0,Visible=1。,用例设计步骤,(5)此种情况没有剩余的水平数,也就是说,表中的每一个水平都有一个值被映射过来。 (6)把表中每一行转换成测试用例,可以得到4个测试用例。这是测试3个变量成对交互时需要测试的内容。,测试用例描述,A隐藏这3部分。 B显示除Top部分外的其它部分。 C显示除Middle部分外的其它部分。 D显示除Bottom部分外的其它部分。,一个与可用的正交表不完全相配的例子,一个面向对象系统包含一个client类(C1)和它的两个子类(C2和C3)。这些client类又与一个server类S1交互,这个server类有两个子类S2和S3。这个server类包括一个方法foo(),它把M1的一个实例做为参数。M1又有两个子类,M2和M3。,选择L9(34)正交表,把值映射到正交表中 A对Client,C10;C21;C32。 B对Server,S10;S21;S32。 C对Message,M10;M21;M32。,