《软件实现及测试第五章.ppt》由会员分享,可在线阅读,更多相关《软件实现及测试第五章.ppt(74页珍藏版)》请在三一办公上搜索。
1、第五章 结构化实现编码和测试,5.1.1编程语言的选择,应用领域算法及运算的复杂性软件运行的环境性能数据结构的复杂性软件开发组成员对该语言的熟悉程度,5.1.2 编码风格,5.2 软件测试基础,软件测试的目的软件测试的原则软件测试的对象,软件测试的目的,基于不同的立场,存在着两种完全不同的测试目的。从用户的角度出发,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,以考虑是否可接受该产品。从软件开发者的角度出发,则希望测试成为表明软件产品中不存在错误的过程,验证该软件已正确地实现了用户的要求,确立人们对软件质量的信心。,Myers软件测试目的,(1)测试是程序的执行过程,目的在于发现错误;(2)
2、一个好的测试用例在于能发现至今未发现的错误;(3)一个成功的测试是发现了至今未发现的错误的测试。,换言之,测试的目的是 想以最少的时间和人力,系统地找出软件中潜在的各种错误和缺陷。如果我们成功地实施了测试,我们就能够发现软件中的错误。测试的附带收获是,它能够证明软件的功能和性能与需求说明相符合。实施测试收集到的测试结果数据为可靠性分析提供了依据。测试不能表明软件中不存在错误,它只能说明软件中存在错误。,软件测试的原则,1.应当把“尽早地和不断地进行软件测试”作为软件开发者的座右铭。2.测试用例应由测试输入数据和对应的预期输出结果这两部分组成。3.程序员应避免检查自己的程序。4.在设计测试用例时
3、,应当包括合理的输入条件和不合理的输入条件。,5.充分注意测试中的群集现象。经验表明,测试后程序中残存的错误数目与该程序中已发现的错误数目成正比。6.严格执行测试计划,排除测试的随意性。7.应当对每一个测试结果做全面检查。8.妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便。,软件测试的对象,软件测试并不等于程序测试。软件测试应贯穿于软件定义与开发的整个期间。需求分析、概要设计、详细设计以及程序编码等各阶段所得到的文档,包括需求规格说明、概要设计规格说明、详细设计规格说明以及源程序,都应成为软件测试的对象。,为把握软件开发各个环节的正确性,需要进行各种确认和验证工作。确认(V
4、alidation),是一系列的活动和过程,目的是想证实在一个给定的外部环境中软件的逻辑正确性。需求规格说明的确认 程序的确认(静态确认、动态确认)验证(Verification),试图证明在软件生存期各个阶段,以及阶段间的逻辑协调性、完备性和正确性。,测试用例设计,两种常用的测试方法 黑盒测试 白盒测试,黑盒测试,这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。黑盒测试又叫做功能测试或数据驱动测试。,黑盒测试方法是在程序接口上进行测试,主要是为了发现以下错误:是否有不正确或遗漏了的功能?在接口
5、上,输入能否正确地接受?能否输出正确的结果?是否有数据结构错误或外部信息(例如数据文件)访问错误?性能上是否能够满足要求?是否有初始化或终止性错误?,假设一个程序P有输入量X和Y及输出量Z。在字长为32位的计算机上运行。若X、Y取整数,按黑盒方法进行穷举测试:可能采用的 测试数据组:232232 264 如果测试一 组数据需要1毫秒,一年工作365 24小时,完成所有测试需5亿年。,白盒测试,此方法把测试对象看做一个透明的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。因此白盒
6、测试又称为结构测试或逻辑驱动测试。,软件人员使用白盒测试方法,主要想对程序模块进行如下的检查:对程序模块的所有独立的执行路径至少测试一次;对所有的逻辑判定,取“真”与取“假”的两种情况都至少测试一次;在循环的边界和运行界限内执行循环体;测试内部数据结构的有效性,等。,对一个具有多重选择和循环嵌套的程序,不同的路径数目可能是天文数字。给出一个小程序的流程图,它包括了一个执行20次的循环。包含的不同执行路径数达520条,对每一条路径进行测试需要1毫秒,假定一年工作365 24小时,要想把所有路径测试完,需3170年。,5.3 逻辑覆盖,语句覆盖 判定覆盖 条件覆盖,判定条件覆盖 条件组合覆盖 路径
7、覆盖。,逻辑覆盖是以程序内部的逻辑结构为基础的设计测试用例的技术。它属白盒测试。,例,语句覆盖,语句覆盖就是设计若干个测试用例,运行被测程序,使得每一可执行语句至少执行一次。在图例中,正好所有的可执行语句都在路径L1上,所以选择路径 L1设计测试用例,就可以覆盖所有的可执行语句。,测试用例的设计格式如下【输入的(A,B,X),输出的(A,B,X)】为图例设计满足语句覆盖的测试用例是:【(2,0,4),(2,0,3)】覆盖 ace【L1】,判定覆盖,判定覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次。判定覆盖又称为分支覆盖。对于图例,如果选择路径L1
8、和L2,就可得满足要求的测试用例:,【(2,0,4),(2,0,3)】覆盖 ace【L1】【(1,1,1),(1,1,1)】覆盖 abd【L2】,如果选择路径L3和L4,还可得另一组可用的测试用例:【(2,1,1),(2,1,2)】覆盖 abe【L3】【(3,0,3),(3,0,1)】覆盖 acd【L4】,条件覆盖,条件覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的每个条件的可能取值至少执行一次。在图例中,我们事先可对所有条件的取值加以标记。例如,对于第一个判断:条件 A1 取真为,取假为 条件 B0 取真为,取假为,对于第二个判断:条件A2 取真为,取假为 条件X1 取真为,
9、取假为测试用例 覆盖分支 条件取值【(2,0,4),(2,0,3)】L1(c,e)【(1,0,1),(1,0,1)】L2(b,d)【(2,1,1),(2,1,2)】L3(b,e)或,测 试 用 例覆盖分支 条件取值【(1,0,3),(1,0,4)】L3(b,e)【(2,1,1),(2,1,2)】L3(b,e)判定条件覆盖判定条件覆盖就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,同时每个判断中的每个条件的可能取值至少执行一次。,测 试 用 例覆盖分支 条件取值【(2,0,4),(2,0,3)】L1(c,e)【(1,1,1),(1,1,1)】L2(b,d),and,or,条
10、件组合覆盖,条件组合覆盖就是设计足够的测试用例,运行被测程序,使得每个判断的所有可能的条件取值组合至少执行一次。记 A1,B0 作 A1,B0 作 A1,B0 作 A1,B0 作,A2,X1 作 A2,X1 作 A2,X1 作 A2,X1 作 测 试 用 例 覆盖条件 覆盖组合【(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),5.4 控制结构测试,基本方法:1、基本路径测试2、条件测试3、循环测试,基本路径测试,基本路径测试方法把覆盖的路径数压缩到一定限度内,程序中的循
11、环体最多只执行一次。它是在程序控制流图的基础上,分析控制构造的环路复杂性,导出基本可执行路径集合,设计测试用例的方法。设计出的测试用例要保证在测试中,程序的每一个可执行语句至少要执行一次。,1.程序的控制流图,符号为控制流图的一个结点,表示一个或多个无分支的PDL语句或源程序语句。箭头为边,表示控制流的方向。,在选择或多分支结构中,分支的汇聚处应有一个汇聚结点。边和结点圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为一个区域。如果判断中的条件表达式是由一个或多个逻辑运算符(OR,AND,NAND,NOR)连接的复合条件表达式,则需要改为一系列只有单个条件的嵌套的判断。,2.程序环路复杂
12、性,程序的环路复杂性给出了程序基本路径集中的独立路径条数,这是确保程序中每个可执行语句至少执行一次所必需的测试用例数目的上界。从控制流图来看,一条独立路径是至少包含有一条在其它独立路径中从未有过的边的路径。,例如,在图示的控制流图中,一组独立的路径是path1:1-11path2:1-2-3-4-5-10-1-11path3:1-2-3-6-8-9-10-1-11path4:1-2-3-6-7-9-10-1-11路径 path1,path2,path3,path4组成了控制流图的一个基本路径集。,程序环路复杂性的度量(流图),1、McCabe方法,每条路径都有一个新边,即独立路径,环型复杂度的
13、计算方法 用于路径测试中的程序逻辑复杂性测试,得到程序中的独立路径数。将程序图连成强连通 1)从入口点总能到达图中任一点 2)从图中任一点总能到达出口点 3)经过从出口点到入口点的弧,可以从出口点到达入口点,程序复杂度的度量,图中环形复杂度为:V(G)=14-12+2=4,环形复杂度计算方法:1、区域数2、EN23、P1,3.导出测试用例,导出测试用例,确保基本路径集中的每一条路径的执行。根据判断结点给出的条件,选择适当的数据以保证某一条路径可以被测试到 用逻辑覆盖方法。,每个测试用例执行之后,与预期结果进行比较。如果所有测试用例都执行完毕,则可以确信程序中所有的可执行语句至少被执行了一次。必
14、须注意,一些独立的路径(如例中的路径1),往往不是完全孤立的,有时它是程序正常的控制流的一部分,这时,这些路径的测试可以是另一条路径测试的一部分。,条件测试,当程序中判定多于一个时,形成的分支结构可以分为两类:嵌套型分支结构和连锁型分支结构。对于嵌套型分支结构,若有n个判定语句,需要n+1个测试用例;对于连锁型分支结构,若有n个判定语句,需要有2n个测试用例,覆盖它的2n条路径。当n较大时将无法测试。,循环测试路径选择,循环分为4种不同类型:简单循环、连锁循环、嵌套循环和非结构循环。(1)简单循环 零次循环:从循环入口到出口 一次循环:检查循环初始值 二次循环:检查多次循环 m次循环:检查在多
15、次循环最大次数循环、比最大次数多一次、少一次的循环。,(2)嵌套循环 对最内层循环做简单循环的全部测试。所有其它层的循环变量置为最小值;逐步外推,对其外面一层循环进行测试。测试时保持所有外层循环的循环变量取最小值,所有其它嵌套内层循环的循环变量取“典型”值。反复进行,直到所有各层循环测试完毕。,对全部各层循环同时取最小循环次数,或者同时取最大循环次数(3)连锁循环如果各个循环互相独立,则可以用与简单循环相同的方法进行测试。但如果几个循环不是互相独立的,则需要使用测试嵌套循环的办法来处理。(4)非结构循环这一类循环应该使用结构化程序设计方法重新设计测试用例。,5.5 黑盒测试的测试用例设计,等价
16、类划分 边界值分析 错误推测法 因果图,等价类划分,等价类划分是一种典型的黑盒测试方法,使用这一方法时,完全不考虑程序的内部结构,只依据程序的规格说明来设计测试用例。等价类划分方法把所有可能的输入数据,即程序的输入域划分成若干部分,然后从每一部分中选取少数有代表性的数据做为测试用例。,步骤:1、划分等价类 2、选取测试用例划分等价类等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的。测试某等价类的代表值就等价于对这一类其它值的测试。,等价类的划分有两种不同的情况:有效等价类:是指对于程序的规格说明来说,是合理的,有意义的输入数据构成的集合。无效等价类:是指对
17、于程序的规格说明来说,是不合理的,无意义的输入数据构成的集合。,划分等价类等价类的原则。(1)如果输入条件规定了取值范围,或值的个数,则可以确立一个有效等价类和两个无效等价类。(2)如果输入条件规定了输入值的集合,或者是规定了“必须如何”的条件,这时可确立一个有效等价类和一个无效等价类。(3)如果输入条件是一个布尔量,则可以确定一个有效等价类和一个无效等价类。,(4)如果规定了输入数据的一组值,而且程序要对每个输入值分别进行处理。这时可为 每一个输入值确立一个有效等价类,此外针对这组值确立一个无效等价类,它是所有不允许的输入值的集合。例如,在教师上岗方案中规定对教授、副教授、讲师和助教分别计算
18、分数,做相应的处理。因此可以确定4个有效等价类为教授、副教授、讲师和助教,一个无效等价类,它是所有不符合以上身分的人员的输入值的集合。,(5)如果规定了输入数据必须遵守的规则,则可以确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。例如,Pascal语言规定“一个语句必须以分号;结束”。有效等价类“以;结束”,若干个无效等价类“以:结束”、“以,结束”、“以 结束”、“以LF结束”等。,确立测试用例在确立了等价类之后,建立等价类表,列出所有划分出的等价类。,再从划分出的等价类中按以下原则选择测试用例:(1)为每一个等价类规定一个唯一编号;(2)设计测试用例,使其尽可能多地
19、覆盖尚未被覆盖的有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止;(3)设计测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖为止。,用等价类划分法设计测试用例的实例 在某一PASCAL语言版本中规定:“标识符是由字母开头,后跟字母或数字的任意组合构成。有效字符数为8个,最大字符数为80个。”并且规定:“标识符必须先说明,再使用。”“在同一说明语句中,标识符至少必须有一个。”,用等价类划分的方法,建立输入等价类表:,下面选取了9个测试用例,它们覆盖了所有的等价类。VAR x,T1234567:REAL;BEGIN x:=3.414;T1234567
20、:=2.732;.(1),(2),(4),(8),(9),(12),(14)VAR:REAL;(3)VAR x,:REAL;(5),VAR T12345678:REAL;(6)VAR T12345.:REAL;(7)多于80个字符 VAR T$:CHAR;(10)VAR GOTO:INTEGER;(11)VAR 2T:REAL;(13)VAR PAR:REAL;(15)BEGIN.PAP:=SIN(3.14*0.8)/6;,边界值分析,人们从长期的测试工作经验得知,大量的错误是发生在输入或输出范围的边界上,而不是在输入范围的内部。因此针对各种边界情况设计测试用例,可以查出更多的错误。,比如,在
21、做三角形计算时,要输入三角形的三个边长:A、B和C。我们应注意到这三个数值应当满足 A0、B0、C0、ABC、ACB、BCA,才能构成三角形。但如果把六个不等式中的任何一个大于号“”错写成大于等于号“”,那就不能构成三角形。问题恰出现在容易被疏忽的边界附近。,这里所说的边界是指,相当于输入等价类和输出等价类而言,稍高于其边界值及稍低于其边界值的一些特定情况。使用边界值分析方法设计测试用例,首先应确定边界情况。应当选取正好等于,刚刚大于,或刚刚小于边界的值做为测试数据,而不是选取等价类中的典型值或任意值做为测试数据。,错误推测法,人们也可以靠经验和直觉推测程序中可能存在的各种错误,从而有针对性地编写检查这些错误的例子。这就是错误推测法。错误推测法的基本想法是:列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例。,5.6 测试策略,测试过程按4个步骤进行,即单元测试、集成测试、确认测试和系统测试。开始是单元测试,集中对用源代码实现的每一个程序单元进行测试,检查各个程序模块是否正确地实现了规定的功能。,集成测试把已测试过的模块组装起来,主要对与设计相关的软件体系结构的构造进行测试。确认测试则是要检查已实现的软件是否满足了需求规格说明中确定了的各种需求,以及软件配置是否完全、正确。系统测试把已经经过确认的软件纳入实际运行环境中,与其它系统成份组合在一起进行测试。,