软件工程(chap10)_第1页
软件工程(chap10)_第2页
软件工程(chap10)_第3页
软件工程(chap10)_第4页
软件工程(chap10)_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

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

文档简介

1、软件工程及软件开发应用第10章 软件测试 10.1 软件测试概述 10.1.1 软件测试的概念 10.1.2 软件测试的分类 10.1.3 软件测试的基本步骤 10.2 白盒测试 10.2.1 逻辑覆盖 10.2.2 路径测试 10.3 黑盒测试 10.3.1 等价分类法 10.3.2 边界值分析法 10.3.3 错误推测法 10.4 测试用例 10.4.1 测试用例概念 10.4.2 应用实例 第10章 软件测试 10.5 调试 10.6 面向对象的测试 10.7 软件测试的发展趋势 10.8 小结 习题10 第10章 软件测试 随着软件应用领域越来越广泛,其质量的优劣也日益受到人们的重视。

2、质量保证能力的强弱直接影响着软件业的发展与生存。软件测试是一个成熟软件企业的重要组成部分,它是软件生命周期中一项非常重要且非常复杂的工作,对软件可靠性保证具有极其重要的意义。 本章主要介绍软件测试的基本概念、分类和步骤,黑盒测试和白盒测试采用的技术和测试用例,软件测试和调试的区别,最后介绍面向对象测试的方法。10.1 软件测试概述 软件测试是伴随着软件的产生而产生的,有了软件生产和运行就必然有软件测试。早期的软件开发过程中,测试的含义比较狭窄,将测试等同于“调试”,目的是纠正软件中已经知道的故障,常常由开发人员自己完成这部分的工作。对测试的投入极少,测试介入得也晚,常常是等到形成代码,产品已经

3、基本完成时才进行测试。 10.1 软件测试概述 直到20世纪80年代早期,“质量“的号角才开始吹响。软件测试定义发生了改变,测试不单纯是一个发现错误的过程,而且包含软件质量评价的内容。软件开发人员和测试人员开始坐在一起探讨软件工程和测试问题。 20世纪90年代,测试工具终于盛行起来。人们普遍意识到工具不仅是有用的,而且要对今天的软件系统进行充分的测试,工具是必不可少的。 10.1 软件测试概述 虽然软件测试技术的发展很快,但是其发展速度仍落后于软件开发技术的发展速度,使得软件测试在今天面临着很大的挑战,主要体现在以下几个方面。 (1) 软件在国防现代化、社会信息化和国民经济信息化领域中的作用越

4、来越重要,由此产生的测试任务越来越繁重。 (2) 软件规模越来越大,功能越来越复杂,如何进行充分而有效的测试成为难题。 (3) 面向对象的开发技术越来越普及,但是面向对象的测试技术却刚刚起步。 (4) 对于分布式系统整体性能还不能进行很好的测试。 (5)对于实时系统来说,缺乏有效的测试手段。 (6)随着安全问题的日益突出,信息系统的安全性如何进行有效的测试与评估,成为世界性的难题。10.1.1 软件测试的概念 软件测试的目的是为了发现软件中存在的错误,但是,其根本目的是为了提高软件质量,降低软件项目的风险。软件的质量风险表现在两个方面,一种是内部风险,一种是外部风险。 软件测试只能证明软件存在

5、错误,而不能证明软件没有错误。 测试是为了发现程序中的错误而执行程序的过程。 10.1.2 软件测试的分类 1.按照测试过程是否在计算机上执行进行的分类:静态测试:被测软件的目标程序不在计算机上执行。动态测试:被测软件的目标程序在计算机上执行。解释执行:被测软件的源程序在计算机上解释执行。 2.按照是否考察软件的内部结构进行的分类:黑盒测试:测试过程只关心测试的输入和结果的对应关系是否正确,即程序的功能,而不考察被测软件内部结构。白盒测试:测试过程不但关心测试的输入和结果的对应关系是否正确,而且考察被测软件内部结构。 10.1.2 软件测试的分类 3.按照软件测试的对象进行的分类: 源程序走查

6、。 单元测试。 部件测试(组装测试)。配置项测试(确认测试)。系统测试(可能包括硬件在一起测试)。软件产品交付前的可靠性(增长)测试。软件产品交付时的鉴定/验收测试。软件被修改时的回归测试。10.1.2 软件测试的分类 4.按照测试人员属性进行的分类:内部测试:开发阶段由软件开发人员自己内部进行的各种测试。用户测试/鉴定测试:由用户(用户代表/鉴定测试组)进行的验证测试。资格测试:由特设机构(例如认证机构)人员进行的测试。第三方测试:由开发方和用户之外的第三方进行的测试。 10.1.3 软件测试的基本步骤 软件测试过程按测试的先后次序可分为5个步骤进行:单元测试、集成测试、确认测试和系统测试,

7、最后进行验收测试,如图10-1所示。 1单元测试 单元测试分别完成每个单元的测试任务,以确保每个模块能正常工作,也叫模块测试。单元测试大量地采用了白盒测试方法,尽可能发现模块内部的程序差错。 10.1.3 软件测试的基本步骤 图10-1 软件测试的基本步骤 10.1.3 软件测试的基本步骤 模块并不是一个独立的程序,因此必须为每个单元测试开发驱动软件和(或)存根软件。 通常驱动程序也就是一个“主程序”,它接收测试数据,把这些数据传送给被测试的模块,并且印出有关的结果。存根程序代替被测试的模块所调用的模块。因此存根程序也可以称为“虚拟子程序”。它使用被它代替的模块的接口,可能做最少量的数据操作,

8、印出对入口的检验或操作结果,并且把控制归还给调用它的模块。 10.1.3 软件测试的基本步骤 例如,图11-2是一个正文加工系统的部分层次图,假定要测试其中编号为3.0的关键模块正文编辑模块。因为正文编辑模块不是一个独立的程序,所以需要有一个测试驱动程序来调用它。这个驱动程序说明必要的变量,接收测试数据字符串,并且设置正文编辑模块的编辑功能。因为在原来的软件结构中,正文编辑模块通过调用它的下层模块来完成具体的编辑功能,所以需要有存根程序简化地模拟这些下层模块。为了简单起见,测试时可以设置的编辑功能只有修改(CHANGE)和添加(APPEND)两种,用控制变量CFUNCT标记要求的编辑功能,而且

9、只用一个存根程序模拟正文编辑模块的所有下层模块。10.1.3 软件测试的基本步骤 图10-2正文加工系统的层次图 10.1.3 软件测试的基本步骤 . TEST STUB(*测试正文编辑模块用的存根程序*)初始化;输出信息“进入了正文编辑程序”;输出“输入的控制信息是”CFUNCT;输出缓冲区中的字符串;IF CFUNCT=CHANGETHEN把缓冲区中第二个字改为*ELSE在缓冲区的尾部加?ENDIF;输出缓冲区中的新字符串;END TEST STUB10.1.3 软件测试的基本步骤 . TEST DRIVER(*测试正文编辑模块用的驱动程序*)说明长度为2500个字符的一个缓冲区;把CFU

10、NCT置为希望测试的状态;输入字符串;调用正文编辑模块;停止或再次初启; END TEST DRIVER10.1.3 软件测试的基本步骤 1. 2集成测试 集成测试把已测试过的模块组装起来,进行集成测试,也叫子系统测试。其目的在于检验与软件设计相关的程序结构问题。这时较多地采用黑盒测试方法来设计测试用例。 子系统测试是把经过单元测试的模块放在一起形成一个子系统来测试。模块相互间的协调和通信是这个测试过程中的主要问题,因此,这个步骤着重测试模块的接口。10.1.3 软件测试的基本步骤 3确认测试 完成集成测试以后,要对开发工作初期制定的确认准则进行检验。确认测试是检验所开发的软件能否满足所有功能

11、和性能需求的最后手段,通常均采用黑盒测试方法。 4系统测试 完成确认测试以后,给出的应该是合格的软件产品,但为检验它能否与系统的其他部分(如硬件,数据库及操作人员)协调工作,需要进行系统测试。 系统测试是把经过测试的系统装配成一个完整的系统来测试。 10.1.3 软件测试的基本步骤 不论是子系统测试还是系统测试,都兼有检测和组装两重含义,通常称为集成测试。 5验收测试 检验软件产品质量的最后一道工序是验收测试。与前面讨论的各种测试活动的不同之处主要在于它突出了客户的作用,同时软件开发人员也应有一定程度的参与。 一般采用黑盒测试,软件配置复查是验收测试的一个重要内容。 10.1.3 软件测试的基

12、本步骤 6测试阶段的信息流 图10-3描绘了测试阶段的信息流,这个阶段的输入信息有两类: (1)软件配置,包括需求说明书、设计说明书和源程序清单等; (2)测试配置,包括测试计划和测试方案。所谓测试方案不仅仅是测试时使用的输入数据(称为测试用例),还应该包括每组输入数据预定要检验的功能,以及每组输入数据预期应该得到的正确输出。实际上测试配置是软件配置的一个子集,最终交出的软件配置应该包括上述测试配置以及测试的实际结果和调试的记录。 10.1.3 软件测试的基本步骤 图10-3 软件测试的信息流 10.2 白盒测试 如果产品内部活动方式已经知道,可以测试它的内部活动是否符合设计要求。 将被测程序

13、视为一个透明的盒子,根据被测程序的内部结构来设计测试用例。 白盒测试采用逻辑覆盖测试法和路径测试法。10.2.1 逻辑覆盖 所谓逻辑覆盖是对一系列测试过程的总称,这组测试过程逐渐进行越来越完整的通路测试。 通常用流程图来设计测试用例,它考察的重点是流程图中的判定框。 逻辑覆盖有5种不同的覆盖标准。 1语句覆盖 语句覆盖的含义是:选择足够的测试用例,使程序中的每个执行语句至少执行一次。 2判定覆盖 判定覆盖的含义是:执行足够的测试用例,使得程序中的每个判定至少都获得一次“真”和“假”值。因此,判定覆盖有称为分支覆盖。10.2.1 逻辑覆盖 3条件覆盖 条件覆盖的含义是:设计若干个测试用例,执行被

14、测程序以后,要使每个判定中的每个条件的可能取值至少满足一次。 4判定条件覆盖 判定条件覆盖要求设计足够的测试用例,使得判定中每个条件的所有可能至少出现一次,并且每个判定本身的判定结果(真/假)也至少出现一次。 5条件组合覆盖 条件组合覆盖的含义是:执行足够的测试用例,使得每个判定中条件的各种可能组合至少出现一次。10.2.1 逻辑覆盖 例: 10.2.1 逻辑覆盖 测试用例应满足的条件: 语句覆盖: AB = T 判定覆盖: AB = T AB = F 条件覆盖:A = T A = F B = T B = F 判定/条件覆盖: 条件组合覆盖:A = T B = T A = T B = F A

15、= F B = T A = F B = F10.2.2 路径测试 路径测试是对程序执行的路径进行测试。路径测试采用程序图。 程序图是一种简化的流程图,在路径测试中,它是用来考察测试路径的有用工具。流程图中各种不同形状的框,在程序图中都被简化为用圆圈表示。10.2.2 路径测试 (a)顺序 (b)选择 (c)循环 程序图: 10.2.2 路径测试 测试路径 覆盖结点/边 覆盖标准 acd (1)(2)(3)(4) 点覆盖 acd,be a,b,c,d,e 边覆盖 acd,be,ae,bcd (1)(2)(3)(4)a,b,c,d,e 路径覆盖例:程序图10.2.2 路径测试 路径测试的特点: 1

16、.满足结构测试的最低要求 根据对路径测试的要求可见:只要满足了路径覆盖,就必然满足语句覆盖和判定覆盖这一最低要求。 2.有利于安排循环测试 对单循环结构的路径测试可包括: 零次循环 一次循环 典型次数的循环 最大次数的循环 对多重嵌套循环,某一指定的循环层遍历单循环测试。 10.2.2 路径测试 练习:写出下列伪码程序的语句覆盖和路径覆盖的测试用例满足的条件。 START INPUT(A,B,C) IF A5 THEN X=10 ELSE X=1 ENDIF IF B10 THEN Y=20 ELSE Y=2 ENDIF IF C0,B0,C0,且A+BC,B+CA,A+CB。如果是等腰的,还

17、要判断A=B,或B=C,或A=C。如果是等边的,则需判断是否A=B,且B=C,且A=C。 这个程序要打印出信息,说明这个三角形是不等边的、是等腰的、还是等边的。 10.4.2 应用实例 在黑盒法中,首先用等价分类法划分输入的等价类, 然后用边界值分析法和错误猜测法作补充。 1划分有效等价类: (1) 两数之和大于第三数。 (2) 三个数相等,等边三角形。 (3) 两个数相等,等腰三角形。 (4) 三个数都不等,任意三角形。 划分无效等价类: (5) 有非数字字符 (6) 有非整数 (7) 少于三个整数 (8) 含有0数据 (9) 含有负整数10.4.2 应用实例 2边缘值分析法: 两数之和等于

18、第三数。3.错误猜测法: (10)三个数为0数据 (11)三个数为负数据10.4.2 应用实例 4.设计测试用例如下: 测试数据 期望结果 测试范围 5,5,5 等边三角形 (1)(2) 4,4,5 等腰三角形 (1)(3) 4,5,6 任意三角形 (1)(4) A,4,5 有非数字字符 (5) 3.3,4,5 有非整数 (6) 4,5 少于三个整数 (7)0,4,5 含有0数据 (8) -5 ,4,5 含有负整数 (9) 3,4,7 退化三角形 (10) 0,0,0 输入无效 (11) -4,-5,-7 输入无效 (12)10.5 调试 软件测试的目的是尽可能多地发现软件中的缺陷,而调试则是

19、在进行了成功的测试之后才开始的工作。其目的是确定错误的原因和位置,并改正错误,因此调试也称为纠错。 调试是一件较困难并具有很强技巧性的工作。因为,在分析测试结果时所发现的问题,往往只是潜在错误的外部表现,而外部表现与内在原因之间常常并无明显的联系。因此,要找出真正的原因,排除潜在的错误,并不是一件容易的事情。所以说调试是通过现象,找出原因的一个思维分析的过程。 10.5 调试 2.调试技术 常用的调试技术 在程序中插入打印语句、输出存储器内容和借助于调试工具。 2)归纳法技术 从特殊到一般的思维过程 3)演绎法技术1) 从一般的推测和前提出发,运用排除和推断过程作出结论的思考方法。10.6 面

20、向对象的测试 当考虑面向对象的软件时,单元的概念改变了。“封装”导致了类和对象的定义,这意味着类和类的实例(对象)包装了属性(数据)和处理这些数据的操作(也称为方法或服务)。现在,最小的可测试单元是封装起来的类和对象。一个类可以包含一组不同的操作,而一个特定的操作也可能存在于一组不同的类中。因此,对于面向对象的软件来说,单元测试的含义发生了很大变化。10.6 面向对象的测试 1面向对象的集成测试 面向对象软件的集成测试: 1)基于线程的测试(thread based testing)。这种策略把响应系统的一个输入或一个事件所需要的那些类集成起来。分别集成并测试每个线程,同时应用回归测试以保证没

21、有产生副作用。 2)基于使用的测试(use based testing)。这种方法首先测试几乎不使用服务器类的那些类(称为独立类),把独立类都测试完之后,再测试使用独立类的下一个层次的类(称为依赖类)。对依赖类的测试一个层次一个层次地持续进行下去,直至把整个软件系统构造完为止。 10.6 面向对象的测试 2面向对象的确认测试 在确认测试或系统测试层次,不再考虑类之间相互连接的细节。和传统的确认测试一样,面向对象软件的确认测试也集中检查用户可见的动作和用户可识别的输出。为了导出确认测试用例,测试人员应该认真研究动态模型和描述系统行为的脚本,以确定最可能发现用户交互需求错误的情景。 当然,传统的黑

22、盒测试方法也可用于设计确认测试用例,但是,对于面向对象的软件来说,主要还是根据动态模型和描述系统行为的脚本来设计确认测试用例。10.6 面向对象的测试 对面向对象的软件来说,小型测试着重测试单个类和类中封装的方法。测试单个类的方法主要有随机测试、划分测试和基于故障的测试等3种。 1随机测试 下面通过银行应用系统的例子,简要地说明这种测试方法。该系统的account(账户)类有下列操作: open(打开),setup(建立),deposit(存款),withdraw(取款),balance(余额),summarize(清单),creditLimit(透支限额)和close(关闭)。上列每个操作都

23、可以应用于account类的实例,但是,该系统的性质也对操作的应用施加了一些限制,例如,必须在应用其他操作之前先打开账户,在完成了全部操作之后才能关闭账户。即使有这些限制,可做的操作也有许多种排列方法。10.6 面向对象的测试 一个account类实例的最小行为历史包括下列操作: opensetupdepositwithdrawclose 这就是对account类的最小测试序列。但是,在下面的序列中可能发生许多其他行为: opensetupdepositdeposit|withdraw|balance|summarize|creditLimitnwithdrawclose 从上列序列可以随机地

24、产生一系列不同的操作序列,例如: 测试用例#r1:opensetupdepositdepositbalancesummarizewithdrawclose 测试用例#r2:opensetupdepositwithdrawdepositbalancecreditLimitwithdrawclose 执行上述这些及另外一些随机产生的测试用例,可以测试类实例的不同生存历史。10.6 面向对象的测试 2划分测试 与测试传统软件时采用等价划分方法类似,采用划分测试(partition testing)方法可以减少测试类时所需要的测试用例的数量。首先,把输入和输出分类,然后设计测试用例以测试划分出的每个类

25、别。 3基于故障的测试 基于故障的测试(fault based testing)与传统的错误推测法类似,也是首先推测软件中可能有的错误,然后设计出最可能发现这些错误的测试用例。例如,软件工程师经常在问题的边界处犯错误,因此,在测试SQRT(计算平方根)操作(该操作在输入为负数时返回出错信息)时,应该着重检查边界情况: 一个接近零的负数和零本身。10.7 软件测试的发展趋势 在软件比较发达的国家,特别是美国,软件测试已经发展成为一个独立的产业,主要体现在:软件测试在软件公司中占有重要的地位。软件测试理论研究蓬勃发展,每年举办各种各样的测试技术年会,发表了大量的软件测试研究论文,引领软件测试理论研

26、究的国际潮流。软件测试市场繁荣。美国有一些专业公司开发软件测试标准与测试工具,MI、Compuware、MaCabe、Rational等都是著名的软件测试工具提供商,它们出品的测试工具已经占领了国际市场,目前我国使用的主流测试工具大部分是国外的产品,而且在世界各地都可以看到它们出品的软件测试工具,可见国外的软件测试已经形成了较大的产业。 10.7 软件测试的发展趋势 中国的软件测试技术研究起步于“六五”期间,主要是随着软件工程的研究而逐步发展起来的,由于起步较晚,与国际先进水平相比差距较大。直到1990年,成立了国家级的中国软件评测中心,测试服务才逐步开展起来。因此,我国无论是在软件测试理论研

27、究还是在测试实践上,和国外发达国家都有不少的差距,主要体现在对软件产品化测试的技术研究还比较贫乏,从业人员较少,测试服务没有形成足够的规模等方面。但是,随着我国软件产业的蓬勃发展以及对软件质量的重视,软件测试也越来越被人们所看重,软件测试正在逐步成为一个新兴的产业。经过一段时间的发展,我们会逐步缩小与国外发达国家的差距,从而带动整个软件产业的健康发展。10.7 软件测试的发展趋势 纵观国内外软件测试的发展现状,可以看到软件测试有以下的发展趋势。 1测试工作将进一步前移。软件测试不仅仅是单元测试、集成测试、系统测试和验收测试,对需求的精确性和完整性的测试技术、对系统设计的测试技术将成为新的研究热

28、点。 2软件架构师、开发工程师、QA人员、测试工程师将进行更好的融合。他们相互之间要成为伙伴关系,而不是相互对立的关系,因为他们的工作可以相互借鉴,相互促进,而且软件测试工程师应该尽早地介入整个工程,在软件定义阶段就要开发相应的测试方法,使得每一个需求定义都是可以测试的。 3测试职业将得到充分的尊重。测试工程师和开发工程师不仅是矛盾体,也是相互协调的统一体。 10.8 小结 软件测试是软件生存周期中一个独立的、关键的阶段,也是保证软件质量的重要手段。软件测试包括技术、工具、规程和管理四个方面,它是开发高质量软件的重要手段。.测试只能发现软件的错误,但是不能证明软件已经没有错误。 软件测试过程按测试的先后次序可分为5个步骤进行:单元测试、集成测试、确认测试和系统测试,最后进行验收测试。 白盒测试法是以程序的内部逻辑为依据。合理的白盒测试,就是要选取足够的测试用例,对源代码进行比较充分的覆盖,以便尽可能多地发现程序中的错误。白盒法适用范围:主要用于模块测试、测试等。 10.8 小结 黑盒测试注重于测试软件的功能性需求,需要测试软件产品的功能,不需测试软件产品的内部结构和处理过程。黑盒法不可能进行完全的测试,要企图遍历所有输入数据的是不可能的。 软件测试的目的是尽可能多地发现软件中的缺陷,而调试则是在进行了成功的测试之后才开始的工作。其

温馨提示

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

评论

0/150

提交评论