一章软件测试.ppt
软件工程,第11章 软件测试,复旦大学计算机科学与工程系 软件工程课程,2/161,内容摘要,软件测试基础白盒测试黑盒测试测试策略面向对象测试测试完成标准调试,复旦大学计算机科学与工程系 软件工程课程,3/161,内容摘要,软件测试基础白盒测试黑盒测试测试策略面向对象测试测试完成标准调试,复旦大学计算机科学与工程系 软件工程课程,4/161,软件测试基础,软件测试的目的软件测试的基本原则白盒测试和黑盒测试,复旦大学计算机科学与工程系 软件工程课程,5/161,有关软件测试的错误观点,“软件测试是为了证明程序是正确的,即测试能发现程序中所有的错误”。事实上这是不可能的。要通过测试发现程序中的所有错误,就要穷举所有可能的输入数据。对于一个输入三个16位字长的整型数据的程序,输入数据的所有组合情况有248 3*1014,如果测试一个数据需1ms,则即使一年365天一天24小时不停地测试,也需要约1万年。,复旦大学计算机科学与工程系 软件工程课程,6/161,对一个具有多重选择和循环嵌套的程序,不同的路径数目可能是天文数字。例如一个小程序的流程图,它包括了一个执行20次的循环,其循环体有五个分支。这个循环的不同执行路径数达520条,如果对每一条路径进行测试需要1毫秒,那么即使一年工作365 24小时,要想把所有路径测试完,大约需3170年。,复旦大学计算机科学与工程系 软件工程课程,7/161,复旦大学计算机科学与工程系 软件工程课程,8/161,“程序测试是证明程序正确地执行了预期的功能”。实际上,一个程序不仅要完成它所需完成的功能,而且不应完成它不该做的事。如不能把边长为0、0、0的三条边判断为等边三角形。,复旦大学计算机科学与工程系 软件工程课程,9/161,软件测试的目的,Glen Myers给出的软件测试目的:测试是一个为了发现错误而执行程序的过程一个好的测试用例是指很可能找到迄今为至尚未发现的错误的测试用例一个成功的测试是指揭示了迄今为至尚未发现的错误的测试 根据这个测试目的,我们应该排除对测试的错误观点,设计合适的测试用例,用尽可能少的测试用例,来发现尽可能多的软件错误。,复旦大学计算机科学与工程系 软件工程课程,10/161,软件测试的原则,Davis提出了一组指导软件测试的基本原则:1.所有的测试都应可追溯到客户需求2.应该在测试工作真正开始前的较长时间就进行测试计划3.Pareto原则:测试中发现的80%的错误可能来自于20%的程序代码4.测试应从“小规模”开始,逐步转向“大规模”5.穷举测试是不可能的6.为了达到最有效的测试,应由独立的第三方来承担测试,复旦大学计算机科学与工程系 软件工程课程,11/161,其他的测试原则:1.在设计测试用例时,应包括合理的输入条件和不合理的输入条件2.严格执行测试计划,排除测试的随意性3.应当对每一个测试结果做全面检查4.妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护提供方便5.检查程序是否做了应做的事仅是成功的一半,另一半是检查程序是否做了不该做的事6.在规划测试时不要设想程序中不会查出错误,复旦大学计算机科学与工程系 软件工程课程,12/161,白盒测试与黑盒测试,测试用例的设计是软件测试的关键所在设计尽可能少的测试用例来发现尽可能多的错误设计最有可能发现软件错误的测试用例,同时避免使用发现错误效果相同的测试用例测试用例的设计方法大体可分为两类:白盒测试和黑盒测试,也称白箱测试和黑箱测试,复旦大学计算机科学与工程系 软件工程课程,13/161,白盒测试(又称为结构测试)把测试对象看作一个透明的盒子,测试人员根据程序内部的逻辑结构及有关信息设计测试用例,检查程序中所有逻辑路径是否都按预定的要求正确地工作。白盒测试主要用于对模块的测试,包括:程序模块中的所有独立路径至少执行一次对所有逻辑判定的取值(“真”与“假”)都至少测试一次在上下边界及可操作范围内运行所有循环测试内部数据结构的有效性等,复旦大学计算机科学与工程系 软件工程课程,14/161,黑盒测试(又称行为测试)把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能需求。黑盒测试可用于各种测试,它试图发现以下类型的错误:不正确或遗漏的功能接口错误,如输入/输出参数的个数、类型等数据结构错误或外部信息(如外部数据库)访问错误性能错误初始化和终止错误,复旦大学计算机科学与工程系 软件工程课程,15/161,内容摘要,软件测试基础白盒测试黑盒测试测试策略面向对象测试测试完成标准调试,复旦大学计算机科学与工程系 软件工程课程,16/161,白盒测试,常用的白盒测试方法有:逻辑覆盖测试基本路径覆盖测试数据流测试循环测试,复旦大学计算机科学与工程系 软件工程课程,17/161,逻辑覆盖测试,语句覆盖 判定覆盖 条件覆盖,判定条件覆盖 条件组合覆盖 路径覆盖,逻辑覆盖主要考察使用测试数据运行被测程序时对程序逻辑的覆盖程度。通常希望选择最少的测试用例来满足所需的覆盖标准。主要的覆盖标准有:,复旦大学计算机科学与工程系 软件工程课程,18/161,例:对下列子程序进行测试procedure example(y,z:real;var x:real);begin if(y1)and(z=0)then x:=x/y;if(y=2)or(x1)then x:=x+1;end;该子程序接受x、y、z的值,并将计算结果x的值返回给调用程序。与该子程序对应的流程图如下:,复旦大学计算机科学与工程系 软件工程课程,19/161,复旦大学计算机科学与工程系 软件工程课程,20/161,该子程序有两个判定:a:(y1)and(z=0)c:(y=2)or(x1)判定a中有两个判定条件:y1、z=0判定c中有两个判定条件:y=2、“x1”根据程序的执行流程不同,判定c中的“x1”的含义也不同。当判定a为“真”时,“x1”实际是“x/y1”,即“xy”;当判定a为“假”时,“x1”仍是“x1”。,复旦大学计算机科学与工程系 软件工程课程,21/161,该子程序有四条可执行路径:路径1 sabcde,其执行条件(L1)是a为“t”且c为“t”L1=(y1)and(z=0)and(y=2)or(x/y1)=(y1)and(z=0)and(y=2)or(y1)and(z=0)and(x y)=(y=2)and(z=0)or(y1)and(z=0)and(x y),复旦大学计算机科学与工程系 软件工程课程,22/161,路径2 sace,其执行条件(L2)是a为“f”且c为“f”)L2=not(y1)and(z=0)and not(y=2)or(x1)=not(y1)or not(z=0)and not(y=2)and not(x1)=not(y1)and not(y=2)and not(x1)or not(z=0)and not(y=2)and not(x1)=(y1)and(y2)and(x 1)or(z 0)and(y 2)and(x 1),复旦大学计算机科学与工程系 软件工程课程,23/161,路径3 sacde,其执行条件(L3)是a为“f”且c为“t”)L3=not(y1)and(z=0)and(y=2)or(x1)=not(y1)or not(z=0)and(y=2)or(x1)=not(y1)and(y=2)or not(y1)and(x1)or not(z=0)and(y=2)or not(z=0)and(x1)=(y 1)and(y=2)or(y 1)and(x1)or(z 0)and(y=2)or(z 0)and(x1),复旦大学计算机科学与工程系 软件工程课程,24/161,路径4 sabce,其执行条件(L4)是a为“t”且c为“f”)L4=(y1)and(z=0)and not(y=2)or(x/y1)=(y1)and(z=0)and not(y=2)and not(x y)=(y1)and(z=0)and(y 2)and(x y),复旦大学计算机科学与工程系 软件工程课程,25/161,语句覆盖,语句覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个可执行语句都至少执行一次 欲使每个语句都执行一次,只需执行路径L1(sabcde)即可。L1=(y=2)and(z=0)or(y1)and(z=0)and(x y)测试用例如下:,复旦大学计算机科学与工程系 软件工程课程,26/161,判定覆盖,判定覆盖(也称分支覆盖)是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个判定的所有可能结果都至少执行一次(即判定的每个分支至少经过一次),复旦大学计算机科学与工程系 软件工程课程,27/161,欲使每个分支都执行一次,只需执行路径L3(sacde,a为“f”且c为“t”)和L4(sabce,a为“t”且c为“f”)即可。或者,执行路径L1(sabcde,a为“t”且c为“t”)和L2(sace,a为“f”且c为“f”).,复旦大学计算机科学与工程系 软件工程课程,28/161,L3(sacde,a为“f”且c为“t”):(y 1)and(y=2)or(y 1)and(x1)or(z 0)and(y=2)or(z 0)and(x1)L4(sabce,a为“t”且c为“f”):(y1)and(z=0)and(y 2)and(x y),a:(y1)and(z=0)c:(y=2)or(x1),复旦大学计算机科学与工程系 软件工程课程,29/161,判定覆盖将每个判定的所有可能结果都至少执行一次,所以,程序中的所有语句也必定都至少执行一次。因此,满足判定覆盖标准的测试用例也一定满足语句覆盖标准。,复旦大学计算机科学与工程系 软件工程课程,30/161,条件覆盖,条件覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个判定中的每个条件的所有可能结果都至少出现一次,复旦大学计算机科学与工程系 软件工程课程,31/161,判定a中各种条件的所有可能结果:y1,y 1,z=0,z 0。判定c中各种条件的所有可能结果:y=2,y 2,x1(或xy),x 1(或x y)。,a:(y1)and(z=0)c:(y=2)or(x1),复旦大学计算机科学与工程系 软件工程课程,32/161,条件覆盖通常比判定覆盖强,但有时虽然每个条件的所有可能结果都出现过,但判定表达式的某些可能结果并未出现。上面的二个测试用例满足了条件覆盖标准,但判定c为“假”的结果并未出现。,复旦大学计算机科学与工程系 软件工程课程,33/161,判定/条件覆盖,判定/条件覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个判定的所有可能结果都至少执行一次,并且,每个判定中的每个条件的所有可能结果都至少出现一次 显然,满足判定/条件覆盖标准的测试用例一定也满足判定覆盖、条件覆盖、语句覆盖标准。,复旦大学计算机科学与工程系 软件工程课程,34/161,a:(y1)and(z=0)c:(y=2)or(x1),复旦大学计算机科学与工程系 软件工程课程,35/161,条件组合覆盖,条件组合覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每个判定中条件结果的所有可能组合都至少出现一次 显然,满足条件组合覆盖标准的测试用例一定也满足判定覆盖、条件覆盖、判定/条件覆盖、语句覆盖标准。,复旦大学计算机科学与工程系 软件工程课程,36/161,判定a中条件结果的所有可能组合:y1,z=0;y1,z 0;y 1,z=0;y 1,z 0 判定c中条件结果的所有可能组合:y=2,x1;y=2,x 1;y 2,x1;y 2,x 1,a:(y1)and(z=0)c:(y=2)or(x1),复旦大学计算机科学与工程系 软件工程课程,37/161,a:(y1)and(z=0)c:(y=2)or(x1),复旦大学计算机科学与工程系 软件工程课程,38/161,条件组合覆盖是上述五种覆盖标准中最强的一种,然而,条件组合覆盖仍不能保证程序中所有可能的路径都被覆盖。本例中,满足条件组合覆盖标准的测试用例就没有经过sabce路径。,复旦大学计算机科学与工程系 软件工程课程,39/161,路径覆盖,路径覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每条可能执行到的路径都至少经过一次(如果程序中包含环路,则要求每条环路至少经过一次),复旦大学计算机科学与工程系 软件工程课程,40/161,本例中所有可能执行的路径有:L1(sabcde,a为“t”且c为“t”)=(y=2)and(z=0)or(y1)and(z=0)and(x y)L2(sace,a为“f”且c为“f”)=(y1)and(y2)and(x 1)or(z 0)and(y 2)and(x 1)L3(sacde,a为“f”且c为“t”)=(y 1)and(y=2)or(y 1)and(x1)or(z 0)and(y=2)or(z 0)and(x1)L4(sabce,a为“t”且c为“f”)=(y1)and(z=0)and(y 2)and(x y),a:(y1)and(z=0)c:(y=2)or(x1),复旦大学计算机科学与工程系 软件工程课程,41/161,a:(y1)and(z=0)c:(y=2)or(x1),复旦大学计算机科学与工程系 软件工程课程,42/161,路径覆盖实际上考虑了程序中各种判定结果的所有可能组合,但它未必能覆盖判定中条件结果的各种可能情况。因此,它是一种比较强的覆盖标准,但不能替代条件覆盖和条件组合覆盖标准。,复旦大学计算机科学与工程系 软件工程课程,43/161,复旦大学计算机科学与工程系 软件工程课程,44/161,逻辑表达式错误敏感的测试,逻辑覆盖测试依赖于程序中的逻辑条件,这些逻辑条件由逻辑表达式组成。对于一个含有n个逻辑变量,或n个关系表达式的逻辑表达式,通常需要2n个测试用例来覆盖其所有可能的条件组合。当n较大时,我们可以选择对发现逻辑表达式错误比较敏感的组合条件进行测试,以较少的测试用例来发现逻辑表达式中的绝大多数错误。,复旦大学计算机科学与工程系 软件工程课程,45/161,Tai提出的分支与关系运算符(branch and relational operator,BRO)测试技术能用较少的测试用例发现条件中分支与关系运算符的大多数错误。采用BRO方法的前提条件:条件中的每个布尔变量和关系运算符至多出现一次,并且无公共变量。BRO方法引入条件约束的概念,含有n个简单条件Ci的复合条件C的约束D表示为(D1,D2,Dn),Di(0in)表示在Ci的输出(outcome)上的约束,它一般是某种符号。,复旦大学计算机科学与工程系 软件工程课程,46/161,对布尔表达式,约束为t或f(真、假);对关系表达式,约束为、=。符合条件C的一次执行覆盖条件约束D是指,C中出现的每个简单条件Ci在这次执行中都满足D中对应的约束Di。下面分三种情况讨论:若条件为C1:B1&B2 其中B1、B2为布尔变量,C1的约束具有形式(D1,D2),D1和D2为t或f。则C1可能的三种约束为(t,t),(f,t),(t,f)。对其中的每一组设计一组测试用例。而(f,f)对条件C1是不敏感的。,复旦大学计算机科学与工程系 软件工程课程,47/161,若条件为C2:B1&(E3=E4)其中B1为布尔表达式,E3和E4为算术表达式。C2的约束形式为(D1,D2),D1为t或f;当E3=E4时D2为=;当E3E4时D2为 或。则C2可能的约束集合为(t,=),(f,=),(t,),(t,)。,复旦大学计算机科学与工程系 软件工程课程,48/161,若条件为C3:(E1 E2)&(E3=E4)其中E1、E2、E3、E4均为算术表达式。则C2可能的约束集合为(,=),(=,=),(,=),(,),(,)。,复旦大学计算机科学与工程系 软件工程课程,49/161,基本路径测试,在实际问题中,一个不太复杂的程序,特别是包含循环的程序,其路径数可能非常大。因此测试常常难以做到覆盖程序中的所有路径,为此,我们希望把测试的程序路径数压缩到一定的范围内。基本路径测试是Tom McCabe提出的一种白盒测试技术,这种方法首先根据程序或设计图画出控制流图,并计算其区域数,然后确定一组独立的程序执行路径(称为基本路径),最后为每一条基本路径设计一个测试用例。,复旦大学计算机科学与工程系 软件工程课程,50/161,程序的控制流图(也称程序图),流图由结点和边组成,分别用圆和箭头表示。设计图中一个连续的处理框(对应于程序中的顺序语句)序列和一个判定框(对应于程序中的条件控制语句)映射成流图中的一个结点,设计图中的箭头(对应于程序中的控制转向)映射成流图中的一条边。对于设计图中多个箭头的交汇点可以映射成流图中的一个结点(空结点)。,复旦大学计算机科学与工程系 软件工程课程,51/161,上述映射的前提是设计图的判定中不包含复合条件。如果设计图的判定中包含了复合条件,那么必须先将其转换成等价的简单条件设计图。,复旦大学计算机科学与工程系 软件工程课程,52/161,我们把流图中由结点和边组成的闭合部分称为一个区域(region),在计算区域数时,图的外部部分也作为一个区域。例如,右图所示的流图的区域数为3。独立路径是指程序中至少引进一个新的处理语句序列或一个新条件的任一路径,在流图中,独立路径至少包含一条在定义该路径之前未曾用到过的边。在基本路径测试时,独立路径的数目就是流图的区域数。,复旦大学计算机科学与工程系 软件工程课程,53/161,例如,对一个PDL程序进行基本路径测试,该程序的功能是:最多输入N个值(以-999为输入结束标志),计算位于给定范围内的那些值(称为有效输入值)的平均值,以及输入值的个数和有效值的个数。,复旦大学计算机科学与工程系 软件工程课程,54/161,复旦大学计算机科学与工程系 软件工程课程,55/161,其区域数为6,我们选取独立路径如下:路径1:1-2-10-11-13路径2:1-2-10-12-13路径3:1-2-3-10-11-13路径4:1-2-3-4-5-8-9-2-10-12-13路径5:1-2-3-4-5-6-8-9-2-10-12-13路径6:1-2-3-4-5-6-7-8-9-2-10-11-13为每一条独立路径设计测试用例。假设:n=5;minimum=0;maximum=100。,复旦大学计算机科学与工程系 软件工程课程,56/161,路径1:1-2-10-11-13测试数据:value=90,-999,0,0,0预期结果:Average=90,total.input=1,total.valid=1路径2:1-2-10-12-13测试数据:value=-999,0,0,0,0预期结果:Average=-999,total.input=0,total.valid=0路径3:1-2-3-10-11-13测试数据:value=-1,90,70,-1,80预期结果:Average=80,total.input=5,total.valid=3,复旦大学计算机科学与工程系 软件工程课程,57/161,路径4:1-2-3-4-5-8-9-2-10-12-13测试数据:value=-1,-2,-3,-4,-999预期结果:Average=-999,total.input=4,total.valid=0路径5:1-2-3-4-5-6-8-9-2-10-12-13测试数据:value=120,110,101,-999,0预期结果:Average=-999,total.input=3,total.valid=0路径6:1-2-3-4-5-6-7-8-9-2-10-11-13测试数据:value=95,90,70,65,-999预期结果:Average=80,total.input=4,total.valid=4,复旦大学计算机科学与工程系 软件工程课程,58/161,值得注意的是,某些独立路径(如例中的路径1和路径3)不能以独立的方式进行测试,此时,这些路径必须在其他的独立路径测试中被覆盖。,复旦大学计算机科学与工程系 软件工程课程,59/161,数据流测试,数据流测试是根据程序中变量的定义(赋值)和引用位置来选择测试用例假定s为语句的标号(每个语句有唯一的标号),x为变量名。定义:DEF(s)=x|语句s中含有对x的定义 USE(s)=x|语句s中含有对x的引用 当s为分支或循环语句时,DEF(s)=设变量x在语句s中被定义,如果存在一条从语句s到语句s 的路径,并且在这条路径上不存在对x的其它定义,则称变量x在s处定义在s处仍有效。,复旦大学计算机科学与工程系 软件工程课程,60/161,定义:定义-引用链DU 变量x的定义-引用链为x,s,s 其中s,s为语句标号,x DEF(s)USE(s)且s处定义的x 在s处仍有效数据流测试就是设计测试用例使得每个DU链至少被覆盖一次数据流测试适用于嵌套IF和多重循环程序的测试,复旦大学计算机科学与工程系 软件工程课程,61/161,循环测试,循环分为4种不同类型:简单循环、嵌套循环、串接循环和非结构循环。(1)简单循环 按照下列规则设计测试用例:零次循环:从循环入口到出口 一次循环:检查循环初始值 二次循环:检查多次循环 m次循环:检查多次循环 最大次数循环 比最大次数多一次的循环 比最大次数少一次的循环,复旦大学计算机科学与工程系 软件工程课程,62/161,复旦大学计算机科学与工程系 软件工程课程,63/161,按照下列规则设计测试用例:先测试最内层循环:所有外层的循环变量置为最小值,最内层按简单循环测试;由里向外,测试上一层循环:测试时此层以外的所有外层循环的循环变量取最小值,此层以内的所有嵌套内层循环的循环变量取“典型”值,该层按简单循环测试;重复上一条规则,直到所有各层循环测试完毕;对全部各层循环同时取最小循环次数,或者同时取最大循环次数,(2)嵌套循环,复旦大学计算机科学与工程系 软件工程课程,64/161,(3)串接循环如果串接的各个循环互相独立,则可以分别用简单循环的方法进行测试;但如果第一个循环的循环变量与第二个循环控制相关,则两个循环不独立,此时,把第一个循环看作外循环,第二个循环看作内循环,然后用测试嵌套循环的办法来处理。(4)非结构循环这一类循环应该先将其结构化,然后再测试。,复旦大学计算机科学与工程系 软件工程课程,65/161,内容摘要,软件测试基础白盒测试黑盒测试测试策略面向对象测试测试完成标准调试,复旦大学计算机科学与工程系 软件工程课程,66/161,黑盒测试,黑盒测试是依据软件的需求规约,检查程序的功能是否符合需求规约的要求。主要的黑盒测试方法有:等价类划分边界值分析比较测试错误猜测因果图,复旦大学计算机科学与工程系 软件工程课程,67/161,等价类划分,由于不能穷举所有可能的输入数据来进行测试,所以只能选择少量有代表性的输入数据,来揭露尽可能多的程序错误等价类划分方法将所有可能的输入数据划分成若干个等价类,然后在每个等价类中选取一个代表性的数据作为测试用例等价类是指输入域的某个子集,该子集中的每个输入数据对揭露软件中的错误都是等效的,测试等价类的某个代表值就等价于对这一类其他值的测试。也就是说,如果该子集中的某个输入数据能检测出某个错误,那么该子集中的其他输入数据也能检测出同样的错误;反之,如果该子集中的某个输入数据不能检测出错误,那么该子集中的其他输入数据也不能检测出错误。,复旦大学计算机科学与工程系 软件工程课程,68/161,等价类划分方法把输入数据分为有效输入数据和无效输入数据有效输入数据指符合规格说明要求的合理的输入数据,主要用来检验程序是否实现了规格说明中的功能无效输入数据指不符合规格说明要求的不合理或非法的输入数据,主要用来检验程序是否做了规格说明以外的事在确定输入数据等价类时,常常还要分析输出数据的等价类,以便根据输出数据等价类导出输入数据等价类。,复旦大学计算机科学与工程系 软件工程课程,69/161,等价类划分设计测试用例的步骤,确定等价类根据软件的规格说明,对每一个输入条件(通常是规格说明中的一句话或一个短语)确定若干个有效等价类和若干个无效等价类。可使用如下表格,复旦大学计算机科学与工程系 软件工程课程,70/161,确定等价类的规则:(1)如果输入条件规定了取值范围,则可以确定一个有效等价类(输入值在此范围内)和两个无效等价类(输入值小于最小值及大于最大值)例如,规定输入的考试成绩在0.100之间,则有效等价类是“0 成绩 100”,无效等价类是“成绩 0”和“成绩 100”。,复旦大学计算机科学与工程系 软件工程课程,71/161,(2)如果输入条件规定了值的个数,则可以确定一个有效等价类(输入值的个数等于规定的个数)和两个无效等价类(输入值的个数小于规定的个数和大于规定的个数)例如,规定输入构成三角形的3条边,则有效等价类是“输入边数=3”,无效等价类是“输入边数 3”和“输入边数 3”。,复旦大学计算机科学与工程系 软件工程课程,72/161,(3)如果输入条件规定了输入值的集合(即离散值),而且程序对不同的输入值做不同的处理,那么每个允许的值都确定为一个有效等价类,另外还有一个无效等价类(任意一个不允许的值)。例如,规定输入的考试成绩为优、良、中、及格、不及格,则可确定5个有效等价类和一个无效等价类。,复旦大学计算机科学与工程系 软件工程课程,73/161,(4)如果输入条件规定了输入值必须遵循的规则,那么可确定一个有效等价类(符合此规则)和若干个无效等价类(从各个不同的角度违反此规则)。例如,在Pascal语言中对变量标识符规定为“以字母开头的串”。那么有效等价类是“以字母开头的串”,而无效等价类有“以数字开头的串”、“以标点符号开头的串”等。,复旦大学计算机科学与工程系 软件工程课程,74/161,(5)如果输入条件规定输入数据是整型,那么可以确定三个有效等价类(正整数、零、负整数)和一个无效等价类(非整数)。(6)如果输入条件规定处理的对象是表格,那么可以确定一个有效等价类(表有一项或多项)和一个无效等价类(空表)。以上只是列举了一些规则,实际情况往往是千变万化的,在遇到具体问题时,可参照上述规则的思想来划分等价类。,复旦大学计算机科学与工程系 软件工程课程,75/161,设计测试用例在确定了等价类之后,建立等价类表,列出所有划分出的等价类。并为每个有效等价类和无效等价类编号。,复旦大学计算机科学与工程系 软件工程课程,76/161,利用等价类设计测试用例的步骤:(1)设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止;(2)为每个无效等价类设计一个新的测试用例。,复旦大学计算机科学与工程系 软件工程课程,77/161,用等价类划分法设计测试用例的实例:某编译程序的规格说明中关于标识符的规定如下:标识符是由字母开头,后跟字母或数字的任意组合构成;标识符的字符数为18个;标识符必须先说明后使用;一个说明语句中至少有一个标识符;保留字不能用作变量标识符。,复旦大学计算机科学与工程系 软件工程课程,78/161,用等价类划分方法,建立输入等价类表:,复旦大学计算机科学与工程系 软件工程课程,79/161,下面选取9个测试用例,它们覆盖了所有的等价类。,复旦大学计算机科学与工程系 软件工程课程,80/161,复旦大学计算机科学与工程系 软件工程课程,81/161,边界值分析,边界值分析也是一种黑盒测试方法,是对等价类划分方法的补充。人们从长期的测试工作经验得知,大量的错误是发生在输入或输出范围的边界上,而不是在输入范围的内部。因此针对各种边界情况设计测试用例,其揭露程序中错误的可能性就更大。,复旦大学计算机科学与工程系 软件工程课程,82/161,这里所说的边界是指,相对于输入等价类和输出等价类而言,直接在其边界上、或稍高于其边界值、或稍低于其边界值的一些特定情况。使用等价类分析方法设计测试用例时,原则上,等价类中的任一输入数据都可作为该等价类的代表用作测试用例。而边值分析则是专门挑选那些位于边界附近的值(即正好等于、或刚刚大于、或刚刚小于边界的值)作为测试用例。,复旦大学计算机科学与工程系 软件工程课程,83/161,边界值分析方法选择测试用例的规则如下:1如果输入条件规定了值的范围,则选择刚刚达到这个范围的边界的值以及刚刚超出这个范围的边界的值作为测试输入数据。例如,规定输入的考试成绩在0100之间,则取0,100,1,101作为测试输入数据。2如果输入条件规定了值的个数,则分别选择最大个数、最小个数、比最大个数多1、比最小个数少1的数据作为测试输入数据。例如,规定一个运动员的参赛项目至少1项,最多3项,那么,可选择参赛项目分别是1项、3项、0项、4项的测试输入数据。,复旦大学计算机科学与工程系 软件工程课程,84/161,3对每个输出条件使用第1条。例如,输出的金额值大于等于0且小于104,则选择使得输出金额分别为0、9999、1、10000的输入数据作为测试数据。4对每个输出条件使用第2条。例如,规定输出的一张发票上,至少有1行内容,至多有5行内容,则选择使得输出发票分别有1行、5行、0行、6行内容的输入数据作为测试数据。5如果程序的输入或输出是个有序集合,例如,顺序文件、表格,则应把注意力集中在有序集的第1个元素和最后一个元素上。,复旦大学计算机科学与工程系 软件工程课程,85/161,6如果程序中定义的内部数据结构有预定义的边界,例如,数组的上界和下界、栈的大小,则应选择使得正好达到该数据结构边界以及刚好超出该数据结构边界的输入数据作为测试数据。例如,程序中数组A的下界是10,上界是20,则可选择使得A的下标为10、20、9、21的输入数据作为测试数据。7发挥你的智慧,找出其他可能的边界条件。,复旦大学计算机科学与工程系 软件工程课程,86/161,由于边值分析方法所设计的测试用例更有可能发现程序中的错误,因此经常把边值分析方法与其它设计测试用例方法结合起来使用。,复旦大学计算机科学与工程系 软件工程课程,87/161,比较测试(back to back),在现实中,有些软件有很高的可靠性要求,特别是那些可能危及人的生命安全的软件系统,如航空航天控制软件、核电厂控制软件等,其软件可靠性绝对重要。此时,需要冗余的硬件和软件来减少错误发生的可能性。通常,可由二支软件开发队伍,根据相同的需求规格说明分别开发二个软件版本,然后,用相同的测试用例对二个版本的软件分别进行测试,比较二个版本软件的测试结果,如果测试结果相同,则可认为二个版本的软件都是正确的,如果测试结果不同,则要分析各个版本,以发现错误的所在。这种测试称为比较测试或称为背靠背测试(backtoback testing)。大多数情况下,可用自动化工具来进行比较测试。,复旦大学计算机科学与工程系 软件工程课程,88/161,值得注意的是,比较测试并不能保证软件没有错误,如果规格说明本身有错,那么所有的版本都可能反映这种错误。另外,如果各个版本产生相同的但都不正确的结果,那么比较测试也无法发现这种错误。,复旦大学计算机科学与工程系 软件工程课程,89/161,错误推测法,错误猜测是一种凭直觉和经验推测某些可能存在的错误,从而针对这些可能存在的错误设计测试用例的方法。这种方法没有机械的执行步骤,主要依靠直觉和经验。错误猜测法的基本思想是:列举出程序中所有可能的错误和容易发生错误的特殊情况,然后根据这些猜测设计测试用例。,复旦大学计算机科学与工程系 软件工程课程,90/161,例如,测试一个排序子程序,可考虑如下情况:输入表为空;输入表只有一个元素;输入表的所有元素都相同;输入表已排序。又如,测试二分法检索子程序,可考虑如下情况:表中只有一个元素;表长为2n;表长为2n-1;表长为2n+1,复旦大学计算机科学与工程系 软件工程课程,91/161,因果图,在等价类划分方法和边界值方法中未考虑输入条件的各种组合,当输入条件比较多时,输入条件组合的数目会相当大因果图方法是一种帮助人们系统地选择一组高效测试用例的方法,它既考虑了输入条件的组合关系,又考虑了输出条件对输入条件的依赖关系,即因果关系,其测试用例发现错误的效率比较高。,复旦大学计算机科学与工程系 软件工程课程,92/161,因果图方法的特点是:考虑输入条件的组合关系;考虑输出条件对输入条件的依赖关系,即因果关系;测试用例发现错误的效率高;能检查出功能说明中的某些不一致或遗漏。,复旦大学计算机科学与工程系 软件工程课程,93/161,用因果图设计测试用例的步骤:(1)分割功能说明书 将输入条件分成若干组,然后分别对每个组使用因果图,这样可减少输入条件组合的数目。如测试编译程序时,可以将每个语句作为一组。,复旦大学计算机科学与工程系 软件工程课程,94/161,(2)识别“原因”和“结果”,并加以编号“原因”是指输入条件或输入条件的等价类;“结果”是指输出条件或系统变换。如,更新主文件就是一种系统变换。每个原因和结果都对应于因果图中的一个结点,当原因或结果成立(或出现)时,相应的结点的值为1,否则为0。,复旦大学计算机科学与工程系 软件工程课程,95/161,(3)根据功能说明中规定的原因与结果之间的关系画出因果图 因果图的基本符号如下:,复旦大学计算机科学与工程系 软件工程课程,96/161,图中左边的结点表示原因,右边的结点表示结果原因和结果之间的关系有:恒等:若a=1,则b=1;若a=0,则b=0非:若a=1,则b=0;若a=0,则b=1或:若a=1或b=1 或c=1,则d=1;否则d=0与:若a=b=c=1,则d=1;否则d=0画因果图时原因在左,结果在右,由上向下排列,并根据功能说明中规定的原因和结果之间的关系,用上述符号连接起来。必要时还可以引入一些中间结点。,复旦大学计算机科学与工程系 软件工程课程,97/161,(4)根据功能说明在因果图中加上约束条件 因果图的约束条件如下图所示:,要求,复旦大学计算机科学与工程系 软件工程课程,98/161,图中互斥、包含、唯一、要求是对原因的约束,屏蔽是对结果的约束互斥:表示a、b、c中至多只有一个为1,即不同时为1包含:表示a、b、c中至少有一个为1,即不同时为0唯一:表示a、b、c中有且仅有一个1要求:表示若a=1,则要求b必须为1,即不可出现a=1 且b=0屏蔽:表示若a=1,则b必须为0,即不可出现a=1 且b=1,复旦大学计算机科学与工程系 软件工程课程,99/161,(5)根据因果图画出判定表 列出满足约束条件的所有原因组合,写出每种原因组合下的结果(如有的话),(6)为判定表的每一列设计一个测试用例,复旦大学计算机科学与工程系 软件工程课程,100/161,例如,有一个处理单价为5角钱的饮料自动售货机软件,其规格说明如下:饮料自动售货机允许投入5角或1元的硬币,用户可通过“橙汁”和“啤酒”按钮选择饮料,售货机还装有一个表示“零钱找完”的指示灯,当售货机中有零钱找时指示灯暗,当售货机中无零钱找时指示灯亮。当用户投入5角硬币并押下“橙汁”或“啤酒”按钮后,售货机送出“橙汁”或“啤酒”。当用户投入1元硬币并押下“橙汁”或“啤酒”按钮后,如果售货机有零钱找,则送出相应的饮料,并退还5角硬币;如果售货机没有零钱找,则饮料不送出,并且退还1元硬币。,复旦大学计算机科学与工程系 软件工程课程,101/161,分析规格说明,列出原因和结果规格说明中的红色部分是输入条件(原因),蓝色部分是输出条件(结果)。由于“售货机有零钱找”是在投入1元硬币时判断是否能找零钱的依据,所以也可把它看作是一个输入条件,即原因。与之对应的结果是售货机指示灯亮(或暗)。原因 结果(1)售货机有零钱找(21)售货机“零钱找完”灯亮(2)投入1元硬币(22)退还1元硬币(3)投入5角硬币(23)退还5角硬币(