2、模型。选取了几个有代表性的测试模型进行阐述,其中V模型是最为被认可和广泛应用的,V模型最早提出测试并不是一个事后弥补行为,而是一个同开发过程同样重要的过程。w模型是V模型的改进型,还属于V模型的范畴,为了解决V模型的问题,X模型和H模型提出测试应该在准备好后马上进行,与开发反复迭代进行,并指出软件测试不仅仅指测试的执行过程本身,还应该包括测试准备活动。随着软件测试研究的进展,软件测试提出了一些比较前沿的理论,如测试驱动开发理论提出先有测试,再写代码,以不断的测试推动代码的开发,既简化了代码,又保证了软件质量。自动化测试要求以各种自动化的测试工具取代测试人员进行一
4、证(verification).94.2确认(validation).95软件测试的分类105.1常用分类.10错误!未定义书签。5.2黑盒测试.105.3白盒测试.115.4静态测试.145.5动态测试.156软件测试中的类测试.156.1面向对象软件的类测试概念.156.2.类测试技术.167参考文献.178致谢.181软件测试的发展史软件测试的发展历史:20世纪60年代(软件工程建立前),为表明程序正确而进行测试。.1972年在北卡罗来纳大学举行了首届软件测试正式会议。.1975年JohnGoodEnough和SusanGerhart在IEEE
7、成果也是由开发人员决定的,当我在参加工作后,真正从学校的学习环境中走上实际运用开发的时候,事实上真的不是那么一回事哦。软件无处不在,软而,软件是人编的所以不完美。臭名昭著的软件测试案例:1、迪士尼的狮子王(19941995)软件在少数系统中能正常工作,但在大众使用的常见系统中不行。后来证实,迪士尼公司没有对市场上投入实用的各种pc机型进行正确的测试。2、英特尔奔腾浮点除法软件缺陷(1994)英特尔为自己处理软件缺陷拿出4亿美元支付更换坏芯片的费用。导致付出如此昂贵的代价,其主要原因是发现了软件缺陷没有正确的处理。3、美国航天局火星极地登陆(1999)该项目
8、使用前有经过测试,两个测试小组双方独立工作都很好,但从未走在一起。4、爱国者导弹防御系统(1991)一枚导弹在多哈击毙28名美国士兵,症结在于一个软件缺陷:一个很小的系统时钟错误累积起来就可能拖延14小时,造成跟踪系统失去准确度。在多哈袭击战中系统被拖延100小时。5、千年虫(大约1974)估计世界各地更换或升级该系统程序解决原有2000年错误的费用已经超过数亿美元。3软件测试的概述3.1软件测试的定义软件测试使用人工或者自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。它是帮助识别开发完成(中间或最终的版本)的计算
9、机软件(整体或部分)的正确度(correctness)完全度(completeness)和质量(quality)的软件过程;是SQA(softwarequalityassurance)的重要子域。(1)测试并不仅仅是为了找出错误.通过分析错误产生的原因和错误的发生趋势,可以帮助项目管理者发现当前软件开发过程中的缺陷,以便及时改进;(2)这种分析也能帮助测试人员设计出有针对性的测试方法,改善测试的效率和有效性;(3)没有发现错误的测试也是有价值的,完整的测试是评定软件质量的一种方法。3.2软件测试的描述测试是软件开发过程的重要组成部分,是用来确
10、认一个程序的品质或性能是否符合开发之前所提出的一些要求。软件测试的目的,第一是确认软件的质量,其一方面是确认软件做了你所期望的事情(Dotherightthing),另一方面是确认软件以正确的方式来做了这个事件(Doitright);第二是提供信息,比如提供给开发人员或程序经理的反馈信息,为风险评估所准备的信息;第三软件测试不仅是在测试软件产品的本身,而且还包括软件开发的过程。如果一个软件产品开发完成之后发现了很多问题,这说明此软件开发过程很可能是有缺陷的。3.3软件测试的目的如果测试的目的是为了尽可能多地找出错误,那么测试就应该直接针对软件比较复杂的部分或是以前出错比较多的
11、位置。如果测试目的是为了给最终用户提供具有一定可信度的质量评价,那么测试就应该直接针对在实际应用中会经常用到的商业假设。在谈到软件测试时,引用GrenfordJ.Myers在TheArtofSoftwareTesting一书中的观点:(1)软件测试是为了发现错误而执行程序的过程;(2)测试是为了证明程序有错,而不是证明程序无错误;(3)一个好的测试用例是在于它能发现至今未发现的错误;(4)一个成功的测试是发现了至今未发现的错误的测试。这种观点可以提醒人们测试要以查找错误为中心,而不是为了演示软件的正确功能。但是仅凭字面意思理解这一观点可能会产生误导,认为
12、发现错误是软件测试的唯一目,查找不出错误的测试就是没有价值的,事实并非如此。首先,测试并不仅仅是为了要找出错误。通过分析错误产生的原因和错误的分布特征,可以帮助项目管理者发现当前所采用的软件过程的缺陷,以便改进。同时,这种分析也能帮助我们设计出有针对性地检测方法,改善测试的有效性。其次,没有发现错误的测试也是有价值的,完整的测试是评定测试质量的一种方法。3.4软件测试的原则1应当把"尽早和不断的测试"作为开发者的座右铭。2程序员应该避免检查自己的程序,测试工作应该由独立的专业的软件测试机构来完成。3设计测试用例时应该考虑到合法的输入和不合法的输入以及各种边界条件,
14、验证(verification)是保证软件正确地实现了一些特定功能的一系列活动,即保证软件做了你所期望的事情。(Dotherightthing)1.确定软件生存周期中的一个给定阶段的产品是否达到前阶段确立的需求的过程;2.程序正确性的形式证明,即采用形式理论证明程序符号设计规约规定的过程;3.评市、审查、测试、检查、审计等各类活动,或对某些项处理、服务或文件等是否和规定的需求相一致进行判断和提出报告。4.2确认(validation)确认(validation)是一系列的活动和过程,目的是想证实在一个给定的外部环境中软件的逻辑正确性。即保证软件以正确的方式来做了
15、这个事件(Doitright)1.静态确认,不在计算机上实际执行程序,通过人工或程序分析来证明软件的正确性;2.动态确认,通过执行程序做分析,测试程序的动态行为,以证实软件是否存在问题。软件测试的对象不仅仅是程序测试,软件测试应该包括整个软件开发期问各个阶段所产生的文档,如需求规格说明、概要设计文档、详细设计文档,当然软件测试的主要对象还是源程序。5软件测试的分类5.1常用分类从是否需要执行被测软件的角度,可分为:静态测试和动态测试从测试是否针对系统的内部结构和具体实现算法的角度来看,可分为:白盒测试和黑盒测试5.2黑盒测试黑盒测试指的是把被测软件看作是一个
16、黑盒子,我们不去关心盒子里面的结构是什么样子,只关心软件的输入数据和输出结果。黑盒测试方法是在程序接口上进行测试,主要是为了发现以下错误:是否有不正确或遗漏了的功能在接口上,输入能否正确地接受能否输出正确的结果是否有数据结构错误或外部信息(例如数据文件)访问错误性能上是否能够满足要求是否有初始化或终止性错误用黑盒测试发现程序中的错误,必须在所有可能的输入条件和输出条件中确定测试数据,来检查程序是否都能产生正确的输出。但这是不可能的。n假设一个程序P有输入量X和Y及输出量Z。在字长为32位的计算机上运行。若X、Y取整数,按黑
18、关信息来设计和选择测试用例,对程序的逻辑路径进行测试。基于一个应用代码的内部逻辑知识,测试是基于覆盖全部代码、分支、路径、条件。白盒测试的主要方法:逻辑驱动测试基本路径测试主要用于软件验证。使用程序设计的控制结构导出测试用例。逻辑驱动测试:主要是测试覆盖率,以程序内在逻辑结构为基础的测试。包括以下6种类型:语句覆盖判断覆盖条件覆盖判定-条件覆盖条件组合覆盖路径覆盖白盒测试的主要目的保证一个模块中的所有独立路径至少被执行一次;对所有的逻辑值均需要测试真、假两个分支;在上下边界及可操作范围内运行所有循环;检查内部数据结构以确保其有效性白盒测试的实施方案在开发阶段
20、对每个测试的测试覆盖信息和累计信息,用图形方式显示覆盖比率,并根据测试运行情况实时更新,随时显示新的测试所反映的测试覆盖情况。允许所有的测试运行依据其有效性进行管理,用户可以减少不适用于非回归测试的测试的过程。概念:1.语句覆盖:语句覆盖就是设计若干个测试用例,运行被测试程序,使得每一条可执行语句至少执行一次;2.判定覆盖(也称为分支覆盖):设计若干个测试用例,运行所测程序,使程序中每个判断的取真分支和取假分支至少执行一次;3.条件覆盖:设计足够多的测试用例,运行所测程序,使程序中每个判断的每个条件的每个可能取值至少执行一次;4.判定-条件
21、覆盖:设计足够多的测试用例,运行所测程序,使程序中每个判断的每个条件的所有可能取值至少执行一次,并且每个可能的判断结果也至少执行一次,换句话说,即是要求各个判断的所有可能的条件取值组合至少执行一次;5.条件组合测试:设计足够多的测试用例,运行所测程序,使程序中每个判断的所有可能的条件取值组合至少执行一次;6.路径测试:设计足够多的测试用例,运行所测程序,要覆盖程序中所有可能的路径。5.4静态测试是指不实际运行被测软件,而只是静态的检查程序代码、界面或文档中可能存在的错误的过程。其中包括代码测试、界面测试和文档测试3个方面。对于代码测试,主要测试代码是否符
22、合相应的标准和规范。对于界面测试,主要测试软件的实际界面与需求中的说明是否相符。对于文档测试,主要测试用户手册和需求说明是否符合用户的实际要求。5.5动态测试是指实际运行被测程序,输入相应的测试数据,检查实际输出结果和预期结果是否相符的过程。所以,我们判断一个测试属于动态还是静态测试,唯一的标准就是看是否运行程序。6软件测试中的类测试6.1面向对象软件从宏观上来看是各个类之间的相互作用。在面向对象系统中,系统的基本构造模块是封装了的数据和方法的类和对象,而不再是一个个能完成特定功能的功能模块。每个对象有自己的生存周期,有自己的状态。消息是对象之间相互请求或协作的途径,是外界使
24、相应的测试策略。BBD通常有两种获取途径。一是采用逆向工程的方法根据源程序画出流程图,然后构造出BBD。但这毕竟是在缺少软件开发前期的分析、设计文档或文档不齐全的情况下退而求其次的办法。当源程序不正确时构造出来的BBD就是错误的。另一种途径就是追根溯源,在软件的分析、设计阶段就根据测试的需要构造出相应的BBD。这样就能从根本上解决问题,正确地指导类的服务的测试。6.2.2基于层次增量的类测试层次增量测试的基本思想是:首先分别测试父类的各个成员函数,再测试成员函数间的相互作用,把测试用例和执行信息保存在测试历史中,在测试子类时,根据父类的测试历史修改部分的定义以及实现语言的继承映射来决定子类中的哪些特征应当重测试以及父类的哪些测试用例可以复用。这种根据类间继承关系的层次特性对类进行增量测试的技术是由M