软件工程第8章.ppt_第1页
软件工程第8章.ppt_第2页
软件工程第8章.ppt_第3页
软件工程第8章.ppt_第4页
软件工程第8章.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、8.1 软件测试的基本概念,8.2 软件测试方法,8.3 测试用例的设计,8.4 软件测试的步骤,8.5 调试,第八章 软件测试,8.6 软件可靠性,测试的定义:为了发现程序中的错误而执行程序的过程。 具体地说,软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计出一批测试用例,并利用测试用例来运行程序,以发现程序错误的过程。,8.1.1 软件测试的定义,8.1 软件测试的基本概念,8.1.2 软件测试的基本原则,(1)尽早地、不断地进行软件测试。 (2)设计测试用例时,要给出测试的预期 结果。 (3)开发小组和测试小组分开。 (4)要设计非法输入的测试用例。 (5)在对程序修改之

2、后要进行回归测试。,8.1.3 软件测试的内容,1单元测试 又称模块测试。每个程序模块完成一个相对独立的子功能,所以可以对该模块进行单独的测试。由于每个模块都有清晰定义的功能,所以通常比较容易设计相应的测试方案,以检验每个模块的正确性。,2集成测试 在单元测试完成后,要考虑将模块集成为系统的过程中可能出现的问题,例如,模块之间的通信和协调问题,所以在单元测试结束之后还要进行集成测试。这个步骤着重测试模块间的接口,子功能的组合是否达到了预期要求的功能,全程数据结构是否有问题等。,3有效性测试,4系统测试 系统测试是把通过有效性测试的软件,作为基于计算机系统的一个整体元素,与整个系统的其他元素结合

3、起来,在实际运行环境下,对计算机系统进行一系列的集成测试和有效性测试。,集成测试通过后,应在用户的参与下进行有效性测试。这个时候往往使用实际数据进行测试,从而验证软件是否能满足用户的实际需要。,白盒测试是将程序看作一个透明的盒子,测试时按照程序内部的逻辑测试程序、检验程序中的每条通路是否都能按预定的要求正确工作(测试人员完全了解程序的内部结构和处理过程)。白盒测试又称为结构测试。 利用白盒测试设计测试用例时,应包括以下三类测试: (1)语句测试:程序中的每个语句至少测试一次; (2)分支测试:程序中的每个分支至少测试一次; (3)路径测试:程序中的每条路径至少测试一次。,8.2.1 白盒测试,

4、8. 2 软件测试方法,白盒测试不能实现穷尽测试:,左图所示的一个小程序的控制流程,其中每个圆圈代表一段源程序(或语句块),图中的曲线代表执行次数不超过20的循环,循环体中共有5条通路。这样,可能执行的路径有520条,近似为1014条可能的路径。,8.2.2 黑盒测试,任何产品都可以使用以下两种方法进行测试: (1)如果已知产品的内部工作过程,则可以对它的每种内部操作进行测试,看是否符合设计要求。 (2)如果已知产品的功能,则可以对它的每一个功能进行测试,看是否都达到了预期的要求。 第一种方法是白盒测试,第二种方法是黑盒测试。,黑盒测试指完全不考虑程序内部的结构和处理过程,只按照规格说明书的规

5、定来检查程序是否符合它的功能要求。黑盒测试是在程序接口进行的测试,又称为功能测试。,黑盒测试检查的主要方面有: 程序的功能是否正确或完善; 数据的输入能否正确接收,输出是否正确; 是否能保证外部信息(如数据文件)的完整性等。 用黑盒法设计测试用例时,必须用所有可能的输入数据来检查程序是否都能产生正确的输出。,黑盒测试不可能实现穷尽测试:,假设有一个很简单的小程序,输入量只有两个:A和B,输出量只有一个:C。如果计算机的字长为32位,A和B的数据类型都只是整数类型。利用黑盒法进行测试时,将A和B的可能取值进行排列组合,输入数据的可能性有:232232264种。 而且,设计测试用例时,不仅要有合法

6、的输入,而且还应该有非法的输入,在这个例子中,输入还应该包括实数、字符串等,这样,输入数据的可能性就更多了。所以说,穷尽测试是不可能实现的。,8.3 测试用例的设计,8.3.1 基本途径测试,8.3.2条件测试,8.3.3等价类划分,8.3.4边界值分析,8.3.1 基本途径测试,1)基本途径测试:所谓基本途径测试是指覆盖基本途径集合的试验案例将使程序中每个语句至少执行一次。属白盒测试。,1、概念,2)独立途径:是指程序中至少引入一个新(执行)语句的途径。在程序流图中独立途径中至少有一条边是先前的途径所没有遍历的。 独立途径构成了基本途径集合。,2、测试案例,1)计算环形复杂度: V(G)m-

7、n+2,2)列出独立途径: 途径1: 途径2: 途径3: 途径4:,8.3.2 条件测试,1、概念,1)条件测试:通过检查程序模块中所包含的逻辑条件对软件进行测试。属白盒测试。 优点:确定条件的覆盖是简单的,它不仅能检测出程序条件中的错误,还能检测出程序中的其它错误。,2)测试策略 (1)分支测试:指对于一个组合条件C,要求对于C的“真”分支与“假”分支,以及C中每个简单条件执行至少至少一次。 (2)分支和关系算子测试:要求在条件中所有布尔变量与关系算子都不重复出现。,2、测试案例,以三角型类型判定程序来讨论测试案例的设计。程序中有三个判定条件:,对于条件C1只作大于与小于两个试验;对于条件C

8、2和C3只作等于与不等于测试。,8.3.3 等价类划分,等价类划分是一种实用的测试技术,属于黑盒测试。与逻辑覆盖不同,使用等价类划分设计测试用例时,完全不需要考虑程序的内部逻辑结构,而主要依据程序的功能说明。 穷尽测试是不可能实现的,实际上也是不必要的,我们可以从所有可能的输入数据中选择一个子集来进行测试。如何选择这个子集,使得这个子集具有代表性,能尽可能多地发现程序中的错误,等价类划分就是基于这种考虑的一种实现方法。该方法根据输入数据和输出数据的特点,将程序输入域划分成若干个部分,即子集,然后从每个子集中选取具有代表性的数据作为测试用例。,1、划分等价类,等价类的划分在很大程度上依靠的是测试

9、人员的经验,下面给出几条基本原则: (1)如果输入条件规定了取值范围,则可划分出一个有效的等价类(输入值在此范围内)和两个无效的等价类(输入值小于最小值、输入值大于最大值)。 (2)如果输入条件规定了输入数据的个数,则可相应地划分出一个有效的等价类(输入数据的个数等于给定的个数要求)和两个无效的等价类(输入数据的个数少于给定的个数要求、输入数据的个数多于给定的个数要求)。 (3)如果输入条件规定了输入数据的一组可能的值,而且程序对这组可能的值做相同的处理,则可将这组可能的值划分为一个有效的等价类,而这些值以外的值划分成无效的等价类。,(4)如果输入条件规定了输入数据的一组可能的值,但是程序对不

10、同的输入值做不同的处理,则每个输入值是一个有效的等价类,此外还有一个无效的等价类(所有不允许值的集合)。,(5)如果输入条件规定了输入数据必须遵循的规则,则可以划分一个有效的等价类(符合规则)和若干个无效的等价类(从各种角度违反规则)。,2、确定测试用例,划分出等价类后,根据以下原则设计测试用例: (1)为每个等价类编号。 (2)设计一个新的测试用例,使它能包含尽可能多的尚未被覆盖的有效等价类。重复这一过程,直到所有的有效等价类都被覆盖。 (3)设计一个新的测试用例,使它包含一个尚未被覆盖的无效等价类。重复这一过程,直到所有的无效等价类都被覆盖。,8.3.4 边界值分析,人们在长期的测试中发现

11、,程序往往在处理边界值的时候容易出错,比如数组的下标,循环的上下界等。针对这种情况设计测试用例的方法就是边界值分析方法。 使用边界值分析方法设计测试用例时,首先要确定边界情况。通常输入等价类和输出等价类的边界,就是应该着重测试的程序边界情况。也就是说,应该选取恰好等于、小于和大于边界的值作为测试数据,而不是选取每个等价类内的典型值或任意值作为测试数据。 边界值分析也属于黑盒测试,可以看作是对等价类划分的一个补充。在设计测试用例时,往往联合等价类划分和边界值分析这两种方法。,8.4 软件测试的步骤,8.4.1 单元测试,8.4.2 集成测试,8.4.3 有效性测试,8.4.4 系统测试,单元测试

12、又称模块测试,集中对软件设计的最小单位模块进行测试,以保证它能够正确执行规定的功能。 进行单元测试时,可以使用黑盒测试法,也可以使用白盒测试法。由于各模块间相对独立,因而对多个模块的测试可以并行地进行,以提高测试效率。,8.4.1 单元测试,1、单元测试的内容,(1)模块接口 主要进行的测试项目有以下几方面: 所测模块的形式参数和调用该模块的实际输入参数在参数数目、属性和顺序上是否匹配; 是否修改了只做输入用的形式参数; 输出给被调用模块的参数在数目、属性和顺序上是否正确; 若模块中有外部的I/O操作,还应该进行以下的测试项目: 文件属性是否正确; 打开文件语句和关闭语句是否正确; 格式说明书

13、与输入输出语句是否一致; 缓冲区的大小与记录长度是否匹配; 使用文件之前是否先打开了文件; 文件操作结束后是否关闭了文件; 是否进行了输入输出错误检查并进行了相应的处理。,(2)局部数据结构,模块的局部数据结构是常见的错误来源,测试者应该仔细设计测试用例,以便发现这样一些类型的错误: 错误的变量名(变量名拼写错或被编译程序截短); 错误的或不一致的数据类型说明; 使用尚未赋值或尚未初始化的变量; 错误的初始值或错误的缺省值; 数据类型不相容; 上溢、下溢或地址异常。 如果有可能的话,在单元测试期间除了局部数据结构之外,还应该检查全程数据对模块的影响。,(3)重要的执行路径,选择适当的测试用例,

14、对模块中的最有代表性、最可能发现错误的执行路径进行测试。 错误的计算主要集中在以下几个方面: 运算的优先次序不对或误解了运算符的优先次序; 变量的初始值赋值不正确; 运算的精度不够; 表达式的符号有错误。 错误的比较和控制流主要集中在以下几个方面: 不同数据类型之间的比较; 逻辑运算符不正确或优先次序不正确; 由于精度问题造成的两值比较时不相等; 差“1”错,即循环次数多一次或少一次; 错误的或不可能的循环终止条件; 当遇到发散的迭代时不能终止的循环; 错误地修改循环变量。,(4)出错处理,由于输入等条件的限制,程序在运行中出错往往是不可避免的。因而好的程序设计应该能预见可能出现的各种出错情况

15、,并且设置相应的出错处理,以便在出现错误时执行相应的操作。 在单元测试时也应该对模块中的出错处理部分进行测试,进行这一部分测试时可能存在的错误主要有: 对错误的描述难于理解,或者是描述过于简单; 显示的错误信息与实际错误不相符; 在对错误进行处理之前,错误条件已经引起系统的干预; 对错误的处理不正确。,(5)边界条件,我们知道,软件常常在它的边界上失效。例如,处理n元数组的第一个元素或最后一个元素时,在n次循环中的第n次重复时,往往会发生错误。因此,使用刚好小于、等于或大于最大值或最小值的数据结构、控制量和数据值的测试方案时,很可能会发现软件中的错误。,2、单元测试的步骤,单元测试的对象是模块

16、。测试者必须自己动手设计这两类模块:驱动模块和存根模块。,驱动模块:相当于所测模块的“主程序”。它接收测试数据,把这些数据传送给所测模块,然后输出测试结果。 存根模块:也叫虚拟子程序。它的作用是模拟被测模块所调用的子模块。存根模块可以做少量的数据操作,一般情况下,不需要把实际子模块的所有功能都带进来。,8.4.2 集成测试,集成测试过程中要考虑的问题: (1)数据穿过模块接口时是否会丢失; (2)模块的功能是否会对其它模块的功能产生不利的影响; (3)把子功能组合起来,能否达到预期的主功能要求; (4)单个模块的误差累积起来是否会放大到不能接受的程度; (5)全局数据结构是否有问题。,将各个模

17、块组装成系统的方法:非增殖式组装方式和增殖式组装方式。,采用非增殖式组装方式:先分别对每个模块进行测试,再把所有模块按设计要求组装在一起进行测试,最终得到所要求的软件。 采用增殖式组装方式:把下一个要测试的模块同已经测试好的那些模块结合起来进行测试,测试完以后再把下一个应该测试的模块结合进来测试,这种方法实际上同时完成单元测试和集成测试。,这两种方法各有优缺点:,(1)采用非增殖式组装方式时,可以较早发现模块间的接口错误,而采用增殖式组装方式时,只有在模块加进来时才可能发现,因此接口错误发现较晚。 (2)采用非增殖式组装方式时要对每个模块进行单元测试,需要编写的测试软件较多,工作量大,而采用增

18、殖式组装方式时,利用已测试过的模块部分作为部分测试软件,因而工作量较小。 (3)非增殖式组装方式要求一下子把所有模块组装起来,如果发现错误则较难判断错误的位置,而采用增殖式组装方式时,由于每次只加入一个模块,因而错误往往与刚加入的模块有关,查错则相对容易些。 (4)采用非增殖式组装方式时,各模块的单元测试可以并行地进行,因此可以充分利用人力,加快测试进程,采用增殖式组装方式时却不能如此。,1、自顶向下结合,在使用增殖式组装方式时,常用的有自顶向下和自底向上两种方法。,采用这种组装方式时,是从主控制模块开始,沿着软件的控制层次向下移动,从而逐渐把各个模块都结合起来。,左图是一个树形结构,主控制模

19、块是M1,在把主控制模块M1所属的那些模块都组装起来时可以采取两种方法:深度优先策略或者宽度优先策略。,采用深度优先的结合方法时,先把软件结构的一条主控制通路上的所有模块一个一个地结合组装起来。主控制通路的选择取决于应用的特点。对于图8.5来说,如果选取左通路为主控通路,那么首先结合模块M1,M2和M5,然后是M8。如果M2的某个功能需要的话,可结合M6。然后结合中间的和右边的控制通路。,采用宽度优先的结合方法时,逐层结合直接下属的所有模块,即把处于同一个控制层次上的所有模块组装起来。对于图8.5来说,首先结合模块M2,M3和M4(代替存根模块S4),接着结合下一个控制层次中的模块M5,M6和

20、M7;如此继续进行下去,直到所有模块都被结合进来。,不管是采用深度优先策略还是宽度优先策略,其结合过程如下:,(1)用主控制模块作为测试驱动模块,所有直接下属于主控制模块的模块用存根模块代替,对主模块进行测试; (2)根据选定的结合策略(深度优先或宽度优先),每次用一个实际模块替换一个存根模块,对新结合进来的模块的直接下属模块,用新的存根模块代替; (3)对结合进来的模块进行相应的测试; (4)为了保证新加入的模块不引入新的错误,可以进行回归测试,即重复以前进行过的部分测试或全部测试。 从第(2)步开始,不断地重复进行上述过程,直到所有模块都结合进来为止。,采用自顶向下的结合策略的好处:,在测

21、试过程中能够较早地对主要的控制或关键的判断点进行检验。因为在一个功能划分合理的软件结构中,关键的判断点常常出现在较高的层次里,所以能够较早碰到。如果主要控制存在问题,及早发现这类问题并尽快想办法解决是十分重要的,这样可以大大减少后面的工作量。如果选择的是深度优先结合方法,可以首先实现并验证软件的一个比较完整的功能,这样对增强开发人员和用户双方的信心是很有意义的。,采用自顶向下的结合策略的不足:,可能会遇到逻辑上的问题。当我们为了充分地测试较高层次的功能时,可能需要较低层次上处理的信息,但是我们采用自顶向下的方法时,存根模块代替了低层次的模块,若高层模块需要低层模块返回的信息不仅数量大,而且种类

22、也很多时,存根模块有可能很难完全满足这个要求,因而,这种方法有一定的局限性。为了解决这个问题,可以采用以下解决办法: (1)把许多测试推迟到用实际模块替换了存根模块以后再进行。采用这种方法也有一定的缺陷:由于我们对一些特定的测试和组装与特定模块间的对应关系失去了某些控制,从而在确定错误原因时会发生困难。 (2)由层次系统的底部向上组装软件。这种方法就是下面要介绍的自底向上结合方法。,2、自底向上结合,自底向上测试是从软件结构最低层的模块开始进行组装和测试。它不需要存根模块,但需要驱动模块。其结合过程如下: (1)把低层模块组合成实现某个特定软件子功能的模块族; (2)为每一个族编写一个驱动模块

23、,作为测试的控制来协调测试用例的输入和输出; (3)对模块族进行测试; (4)按模块结构图依次向上扩展,用实际模块替换驱动模块,将模块族与新的模块结合,形成新的模块族,再进行测试,直到所有模块都被结合进来。,图中自底向上的结合过程:首先把模块组合成族1、族2和族3,然后设计相应的驱动模块D1、D2和D3,并对每个子功能族进行测试;族1和族2下属于模块Ma,去掉驱动模块D1和D2,把这两个族直接与Ma结合,同样地,在族3与模块Mb结合之前将D3去掉;最后Ma和Mb与Mc结合起来。,自顶向下结合的主要优点:不需要设计测试驱动模块,与存根模块相联系的问题可能在测试的早期发现。主要缺点是:需要设计存根

24、模块,并且由于为了使存根模块能够尽量模拟实际模块的功能,必然会增加设计存根模块的复杂度,从而导致增加一些附加的测试。,自底向上结合的主要优点:不需要设计存根模块,而设计测试驱动模块一般比建立存根模块要容易,同时比较容易设计测试用例,并且可以实现多个模块的并行测试,从而提高测试效率。主要缺点是:直到最后一个模块结合进来以前,程序作为一个整体始终不存在。也就是说,对主要的控制直到最后才接触到。 一般来说,我们并不只是使用单一的自顶向下结合或自底向上结合方式,而是根据情况结合这两种方法来进行组装和测试:对软件结构中较上层模块使用自顶向下结合方法,对软件结构中较下层模块使用自底向上结合方法。,比较自顶

25、向下与自底向上:,8.4.3 有效性测试,有效性测试的任务:进一步验证软件的有效性,即验证软件的功能和性能是否与用户的要求一致。,在每个有效性测试用例测试完成以后,可能有两种情况: (1)软件的功能和性能与用户的要求一致,软件可以接受; (2)软件的功能或性能与用户的要求有差距。 若出现后一种情况,通常与需求分析阶段的差错有关,这时要列出一张软件缺陷表,通过与用户的协商,找出问题所在并解决它。,8.4.4 系统测试,软件仅仅是计算机系统的一个组成部分,在实际运行中,它要和计算机系统的其它元素一起工作,所以最终要把软件与其它系统元素结合起来,进行一系列的集成测试和有效性测试。 系统测试的目的在于通过与系统的需求定义作比较,发现软件与系统定义不符合或与之矛盾的地方。,调试过程由两个部分组成:首先,确定程序中错误的确切性质和位置;然后,对程序代码进行分析,确定问题的原因,并设法改正这个错误。 具体地说,由以下步骤组成: (1)从错误的外部表现入手,确定程序中出错的位置; (2)分析有关程序代码,找出错误的内在原因; (3)修改程序代码,排除这个错误; (4)重复进行暴露了这个错误的原始测试以及某些回归测试,以确保该错误确实被排除且没有引入新的错误; (5)如果所作的修正无效,则撤消这次改动,重复上述过程,直到找到一个有效的办法为止。,8.5.1 调试的步

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论