1、1,第七章 软件测试,软件测试的目的和原则软件测试用例设计软件测试策略软件测试种类程序调试 可靠性分析,1,2,7.1 软件测试的目的和原则,软件测试的目的 软件测试的原则 软件测试的对象 测试信息流 测试与软件开发各阶段的关系,2,3,软件产品最大的成本是检测软件错误、修正软件错误的成本。在整个软件开发中,测试工作量一般占30%40%,甚至50%。在人命关天的软件(如飞机控制、核反应堆等)测试所花费的时间往往是其它软件工程活动时间之和的三到五倍,3,4,一、软件测试的目的,基于不同的立场,存在着两种完全不同的测试目的。 从用户的角度出发,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,以考虑
2、是否可接受该产品。 从软件开发者的角度出发,则希望测试成为表明软件产品中不存在错误的过程,验证该软件已正确地实现了用户的要求,确立人们对软件质量的信心。,4,5,Myers软件测试目的,(1) 测试是程序的执行过程,目的在于发现错误; (2) 一个好的测试用例在于能发现至今未发现的错误; (3) 一个成功的测试是发现了至今未发现的错误的测试。,5,6,换言之,测试的目的是想以最少的时间和人力,系统地找出软件中潜在的各种错误和缺陷。如果我们成功地实施了测试,我们就能够发现软件中的错误。测试的附带收获是,它能够证明软件的功能和性能与需求说明相符合。实施测试收集到的测试结果数据为可靠性分析提供了依据
3、。测试不能表明软件中不存在错误,它只能说明软件中存在错误而没有发现。,6,7,二、软件测试的原则,1. 应当把“尽早地和不断地进行软件测试”作为软件开发者的座右铭。 2. 测试用例应由测试输入数据和对应的预期输出结果这两部分组成。 3. 程序员应避免检查自己的程序。 4. 在设计测试用例时,应包括合理的输入条件和不合理的输入条件。,7,8,5. 充分注意测试中的群集现象。 经验表明,测试后程序中残存的错误数目与该程序中已发现的错误数目成正比。 6. 严格执行测试计划,排除测试的随意性。 7. 应当对每一个测试结果做全面检查。 8. 妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供
4、方便。,8,9,三、软件测试的对象,软件测试并不等于程序测试。软件测试应贯穿于软件定义与开发的整个期间。 需求分析、概要设计、详细设计以及程序编码等各阶段所得到的文档,包括需求规格说明、概要设计规格说明、详细设计规格说明以及源程序,都应成为软件测试的对象。,9,10,据美国一家公司统计,查出的软件错误中,属于需求分析和软件设计的错误约占 64%,属于程序编写的错误仅占 36%。程序编写的许多错误是“先天的”。,10,11,四、测试信息流,11,12,测试信息流,软件配置:软件需求规格说明、软件设计规格说明、源代码等; 测试配置:测试计划、测试用例、测试程序等; 测试工具:测试数据自动生成程序、
5、静态分析程序、动态分析程序、测试结果分析程序、以及驱动测试的测试数据库等等。,12,13,测试结果分析:比较实测结果与预期结果,评价错误是否发生。 排错(调试):对已经发现的错误进行错误定位和确定出错性质,并改正这些错误,同时修改相关的文档。 修正后的文档再测试:直到通过测试为止。,13,14,7.2测试用例设计,两种常用的测试方法黑盒测试白盒测试,14,15,一、黑盒测试,这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。 黑盒测试又叫做功能测试或数据驱动测试。,15,16,黑盒测试方法是在程序
6、接口上进行测试,主要是为了发现以下错误:是否有不正确或遗漏了的功能?在接口上,输入能否正确地接受? 能否输出正确的结果?是否有数据结构错误或外部信息(例如数据文件)访问错误?性能上是否能够满足要求?是否有初始化或终止性错误?,16,17,用黑盒测试发现程序中的错误,理论上必须在所有可能的输入条件和输出条件中确定测试数据,来检查程序是否都能产生正确的输出。 但这是不可能的。,17,18,假设一个程序P有输入量X和Y及输出量Z。在字长为32位的计算机上运行。若X、Y取整数,按黑盒方法进行穷举测试: 可能采用的测试数据组:232232264 如果测试一组数据需要1毫秒,一年工作365 24小时,完成
7、所有测试需5亿年。,18,19,二、白盒测试,此方法把测试对象看做一个透明的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。 通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。,19,20,软件人员使用白盒测试方法,主要想对程序模块进行如下的检查:对程序模块的所有独立的执行路径至少测试一次;对所有的逻辑判定,取“真”与取“假”的两种情况都至少测试一次;在循环的边界和运行界限内执行循环体;测试内部数据结构的有效性,等。,20,21,对一个具有多重选择和循环嵌套的程序,不同的路径数目可能是
8、天文数字。给出一个小程序的流程图,它包括了一个执行20次的循环。 包含的不同执行路径数达520条,对每一条路径进行测试需要1毫秒,假定一年工作365 24小时,要想把所有路径测试完,需3170年。,21,22,22,23,7.2.1 逻辑覆盖,语句覆盖判定覆盖条件覆盖,判定条件覆盖条件组合覆盖路径覆盖。,逻辑覆盖是以程序内部的逻辑结构为基础的设计测试用例的技术。它属白盒测试。,23,24,24,25,L1 ( a c e ) = (A1) and (B=0) and (A=2) or (X1) = (A1) and (B=0) and (A=2) or(A1) and (B=0) and (X
9、1) = (A=2) and (B=0) or(A1) and (B=0) and (X1),25,26,L2 ( a b d ) = not(A1) and (B=0) and not(A=2) or (X1) = not (A1) or not (B=0) and not (A=2) and not (X1) = not (A1) and not (A=2) and not (X1)or not (B=0) and not (A=2) and not (X1),26,27,L3 ( a b e) = not (A1) and (B=0) and(A=2) or (X1) = not (A1
10、) or not (B=0) and (A=2) or (X1) = not (A1) and (A=2) or not (A1) and (X1) ornot (B=0) and (A=2) ornot (B=0) and (X1),27,28,L4 ( a c d ) = (A1) and (B=0) andnot (A=2) or (X1) = (A1) and (B=0) and not (A=2) and not (X1),28,29,一、语句覆盖,语句覆盖就是设计若干个测试用例,运行被测程序,使得每一可执行语句至少执行一次。 在图例中,正好所有的可执行语句都在路径L1上,所以选择路
11、径 L1设计测试用例,就可以覆盖所有的可执行语句。,29,30,测试用例的设计格式如下 【输入的(A, B, X),预期输出的(A, B, X)】 为图例设计满足语句覆盖的测试用例是: 【(2, 0, 4),(2, 0, 3)】 覆盖 ace【L1】,= (A1) and (B=0) and (A=2) or (X1),30,31,语句覆盖是最弱的 逻辑覆盖Test case : A=2 , B=0 , X=4.问题:若AND错写为OR,或X1错写为X1,则错误无法由上例测出。,32,二、判定覆盖,判定覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次
12、。 判定覆盖又称为分支覆盖。 对于图例,如果选择路径L1和L2,就可得满足要求的测试用例:,32,33,【(2, 0, 4),(2, 0, 3)】覆盖 ace【L1】 【(1, 1, 1),(1, 1, 1)】覆盖 abd【L2】,= (A1) and (B=0) and (A=2) or (X1),= not(A1) and (B=0) and not(A=2) or (X1),33,34,如果选择路径L3和L4,还可得另一组可用的测试用例: 【(2, 1, 1),(2, 1, 2)】覆盖 abe【L3】 【(3, 0, 3),(3, 1, 1)】覆盖 acd【L4】,34,Test cas
13、es:A=3 , B=0 , X=3 A=2 , B=1 , X=1 问题:若X1错写为X1,仍然无法被测出,35,三条件覆盖,条件覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的每个条件的可能取值至少执行一次。 在图例中,我们事先可对所有条件的取值加以标记。例如, 对于第一个判断:条件 A1 取真为 ,取假为 条件 B0 取真为 ,取假为,35,36,对于第二个判断:条件A2 取真为 ,取假为 条件X1 取真为 ,取假为测试用例 覆盖分支 条件取值 【(2, 0, 4),(2, 0, 3)】 L1(c, e) 【(1, 0, 1),(1, 0, 1)】 L2(b, d) 【(2
14、, 1, 1),(2, 1, 2)】 L3(b, e) 或,36,37,测 试 用 例 覆盖分支 条件取值 【(1, 0, 3),(1, 0, 4)】 L3(b, e) 【(2, 1, 1),(2, 1, 2)】 L3(b, e),= (A1) and (B=0) and (A=2) or (X1),37,条件覆盖不一定包含判定覆盖判定覆盖也不一定包含条件覆盖,38,四、判定条件覆盖 判定条件覆盖就是设计足够的测试用例,使得判断中所有可能取值至少执行一次,每个判断中的每个条件的可能取值至少执行一次。,38,39,测 试 用 例 覆盖分支 条件取值 【(2, 0, 4),(2, 0, 3)】L1
15、(c, e) 【(1, 1, 1),(1, 1, 1)】L2(b, d),39,= (A1) and (B=0) and (A=2) or (X1),= not(A1) and (B=0) and not(A=2) or (X1),不足之处:判定条件可以覆盖判定覆盖和条件覆盖但不能涵盖路径覆盖,40,五、条件组合覆盖,条件组合覆盖就是设计足够的测试用例,运行被测程序,使得每个判断的所有可能的条件取值组合至少执行一次。记 A1, B0 作 A1, B0 作 A1, B0 作 A1, B0 作,40,41, A2, X1 作 A2, X1 作 A2, X1 作 A2, X1 作测 试 用 例 覆盖
16、条件 覆盖组合 【(2, 0, 4), (2, 0, 3)】(L1) , 【(2, 1, 1), (2, 1, 2)】(L3) , 【(1, 0, 3), (1, 0, 4)】(L3) , 【(1, 1, 1), (1, 1, 1)】(L2) , ,41,条件组合能涵盖判定条件覆盖吗?,42,六路径测试,路径测试就是设计足够的测试用例,覆盖程序中所有可能的路径。测 试 用 例 通过路径 覆盖条件 【(2, 0, 4), (2, 0, 3)】 ace (L1) 【(1, 1, 1), (1, 1, 1)】 abd (L2) 【(1, 1, 2), (1, 1, 3)】 abe (L3) 【(3,
17、 0, 3), (3, 0, 1)】 acd (L4),42,路径覆盖能涵盖条件组合覆盖吗?,43,7.2.2基本路径测试,基本路径测试方法把覆盖的路径数压缩到一定限度内,可以保证程序中每条语句至少执行一次,而且每个条件在执行时都将分别取真、假两种值至少一次。 它是在程序控制流图的基础上,分析控制构造的环路复杂性,导出基本可执行路径集合,设计测试用例的方法。设计出的测试用例要保证在测试中,程序的每一个可执行语句至少要执行一次。,43,44,1. 程序的控制流图,符号为控制流图的一个结点,表示一个或多个无分支的PDL语句或源程序语句。箭头为边,表示控制流的方向。,44,45,在选择或多分支结构中
18、,分支的汇聚处应有一个汇聚结点。 边和结点圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为一个区域。,45,如果判断中的条件表达式是由一个或多个逻辑运算符 (OR, AND, .) 连接的复合条件表达式,则需改为 一系列只有单个条件的嵌套的判断。,47,计算程序图G的环路复杂性V(G). McCabe 定义程序图的环路复杂性为此平面图中区域的个数。区域个数为边和结点圈定的封闭区域数加上图形的区域数1。 例如图的V(G)=4 也可按另一种方法计算,即V(G)=判定结点数+1,47,48,2. 程序环路复杂性,程序的环路复杂性给出了程序基本路径集中的独立路径条数,这是确保程序中每个可执行语
19、句至少执行一次所必需的测试用例数目的上界。 从控制流图来看,一条独立路径是至少包含有一条在其它独立路径中从未有过的边的路径。,48,49,49,50,例如,在图示的控制流图中,一组独立的路径是 path1:1 - 11 path2:1 - 2 - 3 - 4 - 5 - 10 - 1 - 11 path3:1 - 2 - 3 - 6 - 8 - 9 - 10 - 1 - 11 path4:1 - 2 - 3 - 6 - 7 - 9 - 10 - 1 - 11 路径 path1,path2,path3,path4组成了控制流图的一个基本路径集。,50,例:用基本路径测试方法对以下的程序(伪码描述
20、)设计用例。 Sort for (i=1; iaj) k=jendfor if ( k!=i ) swap(ai,ak) endfor endSort,Path1: 1-7Path2: 1-2-5-1-7Path3: 1-2-5-6-1-7Path4: 1-2-3-2-5-1-7Path5: 1-2-3-4-2-5-6-1-7 设计用例:输入 预期输出结果 通过路径n=1 排序表中只有一个数 Path1n2且输入表 已排序的输出表 Path4中已排序n2且输入表 已排序的输出表 Path5中未排序Path2和Path3无法单独测试,但已包含在Path4和Path5中测试过了。,53,3. 导出
21、测试用例,导出测试用例,确保基本路径集中的每一条路径的执行。 每个测试用例执行之后,与预期结果进行比较。如果所有测试用例都执行完毕,则可以确信程序中所有的可执行语句至少被执行了一次。,53,54,必须注意,一些独立的路径(如例中的路径1),往往不是完全孤立的,有时它是程序正常的控制流的一部分,这时,这些路径的测试可以是另一条路径测试的一部分。,54,55,7.2.3黑盒测试的测试用例设计,等价类划分边界值分析错误推测法,55,56,一、等价类划分,等价类划分是一种典型的黑盒测试方法,使用这一方法时,完全不考虑程序的内部结构,只依据程序的规格说明来设计测试用例。 等价类划分方法把所有可能的输入数
22、据,即程序的输入域划分成若干部分,然后从每一部分中选取少数有代表性的数据做为测试用例。,56,57,使用这一方法设计测试用例要经历划分等价类(列出等价类表)和选取测试用例两步。 划分等价类 等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的。测试某等价类的代表值就等价于对这一类其它值的测试。,57,58,等价类的划分有两种不同的情况: 有效等价类:是指对于程序的规格说明来说,是合理的,有意义的输入数据构成的集合。 无效等价类:是指对于程序的规格说明来说,是不合理的,无意义的输入数据构成的集合。 在设计测试用例时,要同时考虑有效等价类和无效等价类的设计。,58
23、,划分等价类的规则,(1)如果输入条件规定了取值范围,可定义一个有效等价类和两个无效等价类。 例: 输入值是学生成绩,范围是0100 有效等价类:0成绩100 无效等价类:成绩100,59,划分等价类的规则(续),(2)如果规定了输入数据的个数,则类似地可以划分出一个有效等价类和两个无效等价类。例:一个学生每学期只能选修13门课有效等价类:选修13门无效等价类:不选 或 选修超过3门,60,划分等价类的规则(续),(3)如规定了输入数据的一组值,且程序对不同输入值做不同处理,则每个允许的输入值是一个有效等价类,并有一个无效等价类(所有不允许的输入值的集合)。例:输入条件说明学历可为:专科、本科
24、、硕士、博士四种之一 有效等价类:专科、本科、硕士、博士 无效等价类:其它任何学历,61,划分等价类的规则(续),(4)如果规定了输入数据必须遵循的规则,可确定一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。 例:校内电话号码拨外线为9开头有效等价类: 9外线号码 无效等价类:非9开头外线号码 9非外线号码,,62,以上列出的启发式规则只是测试时可能遇到的情况中的很小一部分,实际情况千变万化,根本无法一一列出。为了正确划分等价类,一是要注意积累经验,二是要正确分析被测程序的功能。以上启发式规则虽然都是针对输入数据说的,但是其中绝大部分也同样适用于输出数据。,63,等价类划分
25、法测试用例设计,(1) 对每个输入或外部条件进行等价类划分,形成等价类表,为每一等价类规定一个唯一的编号; (2)设计一测试用例,使其尽可能多地覆盖尚未覆盖的有效等价类,重复这一步骤,直到所有有效等价类均被测试用例所覆盖; (3)设计一新测试用例,使其只覆盖一个无效等价类,重复这一步骤直到所有无效等价类均被覆盖;,64,例1:报表日期,设某公司要打印20012005年的报表,其中报表日期为6位数字组成,其中,前4位为年份,后两位为月份。,65,第一步:划分等价类,66,第二步:为有效等价类设计测试用例,对表中编号为的3个有效等价类用一个测试用例覆盖:,67,第三步:为每一个无效等价类至少设计一
26、个测试用例,本例的10个等价类至 少需要8个测试用例,不能出现相同的测试用例,68,例2:准考证号码,对招干考试系统“输入学生成绩”子模块设计测试用例招干考试分三个专业,准考证号第一位为专业代号,如: 1-行政专业, 2-法律专业,3-财经专业.行政专业准考证号码为:110001111215法律专业准考证号码为:210001212006财经专业准考证号码为:310001314015,69,准考证号码的等价类划分有效等价类:(1) 110001 111215(2) 210001 212006(3) 310001 314015无效等价类:(4) - 110000(5) 111216 210000(
27、6) 212007 310000(7) 314016 + ,70,例3:某市的电话号码由3部分组成,这3个部分的名称与内容分别是: 长途区号:空白或3位数字; 区码:非0开头的4位数字; 流水号:4位数字。假定被测程序能接受一切符合上述规定的电话号码,拒绝所有不符合规定的号码,请为被测程序设计测试方案。,解(1)划分等价类,71,例:某市的电话号码由3部分组成,这3个部分的名称与内容分别是: 长途区号:空白或3位数字; 区码:非0开头的4位数字; 流水号:4位数字。假定被测程序能接受一切符合上述规定的电话号码,拒绝所有不符合规定的号码,请为被测程序设计测试方案。,解(2)确定有效等价类测试用例
28、 表中4个有效等价类,可以公用以下两个测试用例:,72,例:某市的电话号码由3部分组成,这3个部分的名称与内容分别是: 长途区号:空白或3位数字; 区码:非0开头的4位数字; 流水号:4位数字。假定被测程序能接受一切符合上述规定的电话号码,拒绝所有不符合规定的号码,请为被测程序设计测试方案。,解(3)表中10个无效等价类,应选择10个测试用例:,73,74,例4:编写一个程序,输入三个0-200之间的任意整数a,b,c,判断能否成为三角形,如果能是什么三角形。(等价类划分) 输入条件:输出: 1、不能组成三角形 2、等边三角形 3、等腰三角形 4、直角三角形 5、一般三角形 6、某些边不满足限
29、制,74,75,75,二、边界值分析,经验表明,处理边界情况时程序最容易发生错误。例如,许多程序错误出现在下标、纯量、数据结构和循环等等的边界附近。因此,设计使程序运行在边界情况附近的测试方案,暴露出程序错误的可能性更大一些。,76,边界值分析法与等价类划分法区别 (1)边界值分析不是从某等价类中随便挑一个作为代表,而是使这个等价类的每个边界都要作为测试条件。 (2)边界值分析不仅考虑输入条件,还要考虑输出空间产生的测试情况,被测试 子 域,测试内点,测试外点,如果在悬崖峭壁边 可以自信地安全行走, 平地就不在话下。如果软件在能力达 到极限时能够运行,那 么在正常情况下就不会 出什么问题。,软
30、件边界与悬崖很类似,77,使用边界值分析方法设计测试方案首先应该确定边界情况,这需要经验和创造性,通常输入等价类和输出等价类的边界,就是应该着重测试的程序边界情况。按照边界值分析法,应该选取刚好等于、稍小于和稍大于等价类边界值的数据作为测试数据,而不是选取每个等价类内的典型值或任意值作为测试数据。通常设计测试方案时总是联合使用等价划分和边界值分析两种技术。,78,边界值分析方法选择测试用例原则,1)对16-bit 的整数而言 32767 和 -32768 是边界2)屏幕上光标在最左上、最右下位置3)报表的第一行和最后一行4)数组元素的第一个和最后一个5)循环的第 0 次、第 1 次和倒数第 2
31、 次、最后一次,79,边界值分析方法选择测试用例原则,7)如果输入条件规定了值的范围,则应取刚达到这个范围的边界的值,以及刚刚超越这个范围边界的值作为测试输入数据。例如,如果程序的规格说明中规定:“重量在10公斤至50公斤范围内的邮件,其邮费计算公式为“。作为测试用例,我们应取10及50,还应取10.01,49.99,9.99及50.01等。,80,边界值分析方法选择测试用例原则,8)如果输入条件规定了值的个数,则用最大个数,最小个数,比最小个数少一,比最大个数多一的数作为测试数据。比如,一个输入文件应包括1255个记录,则测试用例可取1和255,还应取0及256等。,81,边界值分析方法选择
32、测试用例原则,9)如果程序的规格说明给出的输入域或输出域是有序集合,则应选取集合的第一个元素和最后一个元素作为测试用例。10)如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构的边界上的值作为测试用例。11)分析规格说明,找出其它可能的边界条件。,82,边界条件类型,如果软件测试问题 包含确定的边界,那 么数据类型可能是: 数值 字符 位置 数量 速度 地址 尺寸 ,还要考虑数据类型的特征:第一个/最后一个 最小值/最大值 开始/完成 空/满 最慢/最快 相邻/最远 超过/在内 ,83,84,三、错误推测法,人们也可以靠经验和直觉推测程序中可能存在的各种错误,从而有针对性地编写检查这
33、些错误的例子。这就是错误推测法。 错误推测法的基本想法是:列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例。,84,错误推测法(error guessing) 根据经验、直觉和预感来进行测试 例如: 一定要考虑建立处理下列等价类: 缺省值 空白 空值 零值 无输入条件 在已经找到软件缺陷的地方再找找,85,86,黑盒测试与白盒测试优缺点比较,黑盒测试 白盒测试,优 点,缺 点,性 质,适用于各阶段测试 从产品功能角度测试 容易入手生成测试数 据,可构成测试数据使特定程序部分得到测试 有一定的充分性度量手段 可获较多工具支持,某些代码得不到测试 如果规格说明有误,则无法
34、发现 不易进行充分性测试,不易生成测试数据(通常) 无法对未实现规格说明的部分进行测试 工作量大,通常只用于单元测试,有应用局限,是一种确认技术,回答 “我们在构造一个正确的系统吗?”,是一种验证技术,回答 “我们在正确 地构造一个系统吗?”,86,87,测试用例模版,87,7.3 软件测试的策略,上面介绍了构造测试实例的几种主要方法,实践表明,这些实例构造方法在不同类型的程序测试以及某些特定的应用领域中效果很好,当如果将它们单独使用于综合性的软件测试中,却没有一种方法能够产生完善的、符合测试目标的测试实例。 因此,在实际的测试工作中总是把它们组合起来使用,并且在不同的测试阶段采用不同的测试策
35、略。,88,测试过程按4个步骤进行,即单元测试、组装测试、确认测试和系统测试以及验收测试。 开始是单元测试,集中对用源代码实现的每一个程序单元进行测试,检查各个程序模块是否正确地实现了规定的功能。,组装测试把已测试过的模块组装起来,主要对与设计相关的软件体系结构的构造进行测试。 确认测试则是要检查已实现的软件是否满足了需求规格说明中确定了的各种需求,以及软件配置是否完全、正确。 系统测试把已经经过确认的软件纳入实际运行环境中,与其它系统成份组合在一起进行测试。,7.3 软件测试的策略(续),在单元测试阶段,在构造测试实例时,直接考虑源程序结构是可能的,可用白盒技术和黑盒技术相结合。 具体的做法
36、可采用下面两种形式:一般情况下,单元测试应该以白盒测试为主,黑盒测试为辅。,92,7.3 软件测试的策略(续),集成测试及以后的测试主要采用黑盒技术。其实例构造策略包括: 用等价分类法和(或)边值分析法先构造一组基本测试实例。 再用错误猜测法根据系统具体情况补充新的测试实例。,93,7.4 测试方案的建立及实施,制定一个完善的测试方案是高质量完成软件测试工作的重要保证。 测试方案是整个测试工作的指导性文档,包括测试目标、测试内容、测试实例的集合、测试步骤以及测试过程的说明性信息。 测试方案主要内容包括: 单元测试 集成测试 确认测试 系统测试 验收测试,94,软件测试的步骤图,95,单元测试又
37、称模块测试,是针对软件设计的最小单位 程序模块,进行正确性检验的测试工作。其目的在于发现各模块内部可能存在的各种差错。 单元测试所要发现的往往是编码和详细设计阶段产生的错误。 单元测试需要从程序的内部结构出发设计测试用例。多个模块可以平行地独立进行单元测试。 单元测试主要分为人工静态检查和动态执行跟踪两个步骤进行。,7.4.1 单元测试(Unit Testing),96,人工静态检查(走查),成立一个34人的代码审查小组,包括经验丰富的测试人员、被测程序的作者和其他程序员。被测程序的作者讲述程序的逻辑结构,大家发现问题可随时提问,以判断是否存在错误 。,主要是保证算法代码实现的正确性和高效性,
38、代码编写清晰、规范。 经验表明,使用人工静态检查法能够有效的发现30%-70%的逻辑设计和编码错误。,动态执行跟踪,设计测试用例,执行待测程序,比较实际结果与预期结果,发现程序中的错误。 动态执行测试通常分为黑盒测试与白盒测试。 对于单元测试来说主要应该采用白盒测试法对每个模块的内部作跟踪检查测试。,在单元测试时,测试者需要依据详细设计说明书和源程序清单,了解该模块的I/O条件和模块的逻辑结构,主要采用白盒测试的测试用例,辅之以黑盒测试的测试用例,使之对任何合理的输入和不合理的输入,都能鉴别和响应。,1.单元测试的内容,100,单元测试的内容图示,101,(1) 模块接口测试,在单元测试的开始
39、,应对通过被测模块的数据流进行测试。测试项目包括: 调用本模块的输入参数是否正确; 本模块调用子模块时输入给子模块的参数是否正确; 全局量的定义在各模块中是否一致; 在做内外存交换时要考虑: 文件属性是否正确; OPEN与CLOSE语句是否正确; 缓冲区容量与记录长度是否匹配; 在进行读写操作之前是否打开了文件; 在结束文件处理时是否关闭了文件; 正文书写输入错误, IO错误是否检查并做了处理。,102,(2) 局部数据结构测试,对于一个模块来说,局部数据结构是常见的错误来源 局部数据结构测试发现下列类型的错误: 不正确或不一致的数据类型说明 使用尚未赋值或尚未初始化的变量 错误的初始值或错误
40、的缺省值 变量名拼写错或书写错 不一致的数据类型 全局数据对模块的影响,103,(3) 路径测试,选择适当的测试用例,对模块中重要的执行路径进行测试。选择测试执行路径,是单元测试期间的基本任务。 应当设计测试用例查找由于错误的计算、不正确的比较或不正常的控制流而导致的错误。 测试执行路径可以发现如下种类的错误: 运算符优先级误解或次序不正确; 混合运算中运算对象的类型彼此不相容; 逻辑运算不正确或优先次序不正确; 循环中止条件不正确。,104,(4) 错误处理测试,有意识地进行不合理输入,而使程序出错,从而检查程序的错误处理能力,并检查是否出现如下错误: 出错的描述是否难以理解。 出错的描述是
41、否能够对错误定位 显示的错误与实际的错误是否相符 对错误条件的处理正确与否 在对错误进行处理之前,错误条件是否已经引起系统的干预等,105,(5) 边界测试,注意数据流、控制流中刚好等于、大于或小于确定的比较值时出错的可能性。对这些地方要仔细地选择测试用例,认真加以测试。 如果对模块运行时间有要求的话,还要专门进行关键路径测试,以确定最坏情况下和一般情况下影响模块运行时间的因素。,106,模块并不是一个独立的程序,在考虑测试模块时,同时要考虑它和外界的联系,用一些辅助模块去模拟与被测模块相联系的其它模块。 驱动模块 (driver) 桩模块 (stub) 支持模块,2.单元测试过程,107,驱
42、动模块的作用是模拟被测模块的上层模块,它调用被测模块,并将准备好的测试数据以调用参数的形式传送给被测模块,同时接收运行结果。 桩模块是在测试中模拟被测模块的下属模块,桩程序的接口同真正模块一致,内部只做少量处理,(如响应调用请求,打印“进入退出”消息,或直接传回所需数据)。并将运行结果返回给被测模块。,2.单元测试过程(续),108,集成测试 (组装测试、联合测试),是把经过单元测试的模块按软件结构组合在一起作为一个系统或子系统来综合测试。模块相互间的协调和通信是这个测试过程中的主要测试内容。 该步骤主要发现结构设计阶段产生的错误。,7.4.2 集成测试(Integrated Testing)
43、,109,经验表明,即使所有的模块都通过了测试,但组装中仍不免出现新的问题,这些问题包括: 在把各个模块连接起来的时侯,穿越模块接口的数据是否会丢失 一个模块的功能是否会对另一个模块的功能产生不利的影响; 全局数据结构是否有问题; 单个模块的误差累积起来,是否会放大,从而达到不能接受的程度。 归结起来:接口问题;存取全局量的问题;数据结构不一致问题;模块调用顺序问题。解决这些问题就是集成测试的目的。,集成测试的重要性,110,111,通常,把模块组装成为系统的方式有两种一次性组装方式增殖式组装方式,112,1. 一次性组装方式 (big bang),它是一种非增殖式组装方式。也叫做整体拼装。
44、使用这种方式,首先对每个模块分别进行模块测试,然后再把所有模块组装在一起进行测试,最终得到要求的软件系统。,113,一次全部集成的方式,这种方式属于非递增的模块组合方式。对于一部分规模不大、模块接口不算复杂的软件系统适合采用这种集成测试方法。 这种方法无须驱动模块和桩模块的支持,只需要认真分析确认系统功能及性能,并运用黑盒测试技术构造一组测试实例直接对整个系统进行集成测试。,114,115,2. 增殖式组装方式,这种组装方式又称渐增式组装 首先对一个个模块进行模块测试,然后将这些模块逐步组装成较大的系统 在组装的过程中边连接边测试,以发现连接过程中产生的问题 通过增殖逐步组装成为要求的软件系统
45、。,116,(1) 自顶向下的增殖方式,这种组装方式将模块按系统程序结构,沿控制层次自顶向下进行组装。 自顶向下的增殖方式在测试过程中较早地验证了主要的控制和判断点。 选用按深度方向组装的方式,可以首先实现和验证一个个完整的软件功能。,117,自顶向下集成测试的优缺点,优点: 可以较早体现程序的轮廓,给用户演示; 上层模块往往是关键性模块,有更充分的测试机会; 不用设计驱动模块。 缺点: 测试速度较慢,无法投入更多的人力; 桩模块较多,设计测试用例较难,重要的底层数据无法向上流。,118,119,(2) 自底向上的增殖方式,这种组装的方式是从程序模块结构的最底层的模块开始组装和测试。 因为模块
46、是自底向上进行组装,对于一个给定层次的模块,它的子模块(包括子模块的所有下属模块)已经组装并测试完成,所以不再需要桩模块。在模块的测试过程中需要从子模块得到的信息可以直接运行子模块得到。,120,自顶向下增殖的方式和自底向上增殖的方式各有优缺点。 一般来讲,一种方式的优点是另一种方式的缺点。,自底向上集成测试的优缺点,优点: 大大减少桩模块的设计,减少工作量。 缺点: 只有把最后一个模块组合起来之后,才能作为一个整体进行集成测试。 自顶向下集成的方式和自底向上集成的方式各有优缺点,一般来讲,一种方式的优点是另一种方式的缺点。,121,(3)三明治式集成 (sandwich integratio
47、n),根据系统的实际确定策略,具体采用哪一种集成测试方法主要取决于软件系统的特点以及任务完成的进度。一般来说,软件结构中较上层部分使用自顶向下的模块结合方法实现测试较好,而对于下层的模块使用自底向上底模块结合方法更合适。,123,7.4.3 确认测试,确认测试又称有效性测试。任务是验证软件的功能和性能及其它特性是否与用户的要求一致。 对软件的功能和性能要求在软件需求规格说明书中已经明确规定。它包含的信息就是软件确认测试的基础。,124,确认(有效性)测试(黑盒测试),确认测试是在模拟的环境 (可能就是开发的环境) 下,运用黑盒测试的方法,验证被测软件是否满足需求规格说明书列出的需求。 通过实施
48、预定的测试计划和测试步骤,确定 软件的功能是否与需求相符; 所有的文档都是正确且便于使用; 同时,对其它软件需求,例如可移植性、兼容性、出错自动恢复、可维护性等,也都要进行测试,125,7.4.4 系统测试,系统测试,是将通过确认测试的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其它系统元素结合在一起,在实际运行环境下,对计算机系统进行一系列的组装测试和确认测试。 系统测试的目的在于通过与系统的需求定义作比较, 发现软件与系统的定义不符合或与之矛盾的地方。,126,系统测试的内容,恢复测试:系统发生故障时软件能恢复。用各种办法强迫系统失败而进行考察。 安全测试:测试对非法入侵的防范能力。口令、密码、用户权限等。 强度测试:测试系统的负荷。存储容量、终端个数、网络结点数、实时系统中的上限数据。如空中管理系统的最大飞机量等。 性能测试:测试在系统环境下的运行性能。如响应速度、计算精度等。 可靠性测试:利用一套数学模型来估算系统的可靠性。 配置测试:系统在不同环境下运行情况的测试。 (5)安装测试:对系统的安装过程进行测试。,