面向对象的软件测试_第1页
面向对象的软件测试_第2页
面向对象的软件测试_第3页
面向对象的软件测试_第4页
面向对象的软件测试_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

软件测试(六)面向对象的软件测试本章要点面向对象的基本概念面向对象的测试模型面向对象的单元测试面向对象的集成和系统测试面向对象的基本概念面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围,成为20世纪90年代以来软件开发的主流。面向对象的软件开发以抽象、继承、封装、重载、多态为基本特征。抽象类的定义中明确指出类是一组具有内部状态和运动规律的对象的抽象。抽象是一种从一般的观点看待事物的方法,它要求我们集中于事物的本质特征(内部状态和运动规律),而非具体细节或具体实现。面向对象鼓励我们用抽象的观点来看待现实世界,也就是说,现实世界是一组抽象的对象——类组成的。继承继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”。被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。继承概念的实现方式有三类:实现继承、接口继承和可视继承。实现继承是指使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。封装封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。对象间的相互联系和相互作用过程主要通过消息机制得以实现。对象之间并不需要过多的了解对方内部的具体状态或运动规律。面向对象的类是封装良好的模块,类定义将其说明(用户可见的外部接口)与实现(用户不可见的内部实现)显式地分开,其内部实现按其具体定义的作用域提供保护。类是封装的最基本单位。封装防止了程序相互依赖性而带来的变动影响。在类中定义的接收对方消息的方法称为类的接口。多态多态性(polymorphism)是指同名的方法可在不同的类中具有不同的运动规律。在父类演绎为子类时,类的运动规律也同样可以演绎,演绎使子类的同名运动规律或运动形式更具体,甚至子类可以有不同于父类的运动规律或运动形式。不同的子类可以演绎出不同的运动规律。实现多态,有两种方式:覆盖、重载。覆盖,是指子类重新定义父类的虚函数的做法。重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。类和对象类是一个对一组像是对象的一般性描述(如,模板、模式或蓝图)。通过定义,存在于类中的所有对象继承其属性和用于操纵属性的操作。父类是类的集合,子类是类的实例。这些定义蕴含了类层次的存在,父类的属性和操作被子类继承,而子类也可以加入自己“私有的”属性和方法。属性属性依附于类和对象,并且以某种方式描述类或对象。Champeaux及其同事给出了如下的关于属性的讨论:现实的实体经常用指明其稳定特性的词来描述。大多数物理对象具有形状、重量、颜色和材料类型等特性;人具有生日、父母、名字、肤色等特性,特性可被视为在类和某确定域之间的二元关系。面向对象的开发方法传统的面向过程的开发方法是以过程为中心,以算法为驱动,因此,面向过程的编程语言是程序=算法+数据面向对象的开发方法是以对象为中心,以消息为驱动,因此,面向对象的编程语言是程序=对象+消息。传统开发方法开发软件存在的问题软件重用性差软件可维护性差软件稳定性差面向对象的分析面向对象的分析(ObjectOrientedAnalysis,OOA),是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。四个基本步骤:第一步,获取功能需求。第二步,根据功能和参与者确定系统的对象和类。第三步,确定类的结构、主题、属性和方法。第四步,建造对象模型。面向对象的设计面向对象的设计(ObjectOrientedDesign,OOD),是根据OOA中确定的类和对象,设计软件系统,以作为面向对象的编程的基础。整个设计过程分为系统设计和对象设计。系统设计过程包括:系统分解确定并发性设计人机交互子系统设计任务管理子系统设计数据管理子系统面向对象的模型模型是对实体的特征和变化规律的一种表示或抽象,即把对象实体通过适当的过滤,用适当的表现规则描绘出的模仿品。该模型主要关心系统中对象的结构、属性和操作,它是分析阶段三个模型的核心,是其他两个模型的框架。在面向对象的开发中,有对象模型、动态模型和功能模型这三种常用模型。对象模型对象模型使表示了静态的、结构化的系统数据性质,描绘了系统的静态结构,它是从客观世界实体的对象关系角度来描绘的,表现了对象的相互关系。在该模型中包括以下几方面的元素。对象和类关联和链层次结构动态模型动态模型是与时间和变化有关的系统性质。该模型描述了系统的控制结构,它表示了瞬间的、行为化的系统控制。它关心的是系统的控制、操作的执行顺序,它从对象的事件和状态的角度出发,表现了对象的相互行为。事件状态状态图功能模型功能模型描述了系统的所有计算。功能模型指出发生了什么,动态模型确定什么时候发生,而对象模型确定发生的客体。功能模型由多张数据流图组成。处理数据流动作对象数据存储对象面向对象软件的测试策略面向对象测试的目标和传统的结构化软件测试相同,都是需要在现实和时间范围内利用有限的时间和工作量尽可能多的发现错误。面向对象系统测试一般都包含以下主题:单元测试类的集成测试系统测试回归测试面向对象测试的相关模型面向对象的单元测试当考虑到面向对象软件时,单元测试的概念发生了变化。面向对象软件引入了封装和类的概念,这意味着每个类的实例(对象)包装有属性(数据)和处理这些数据的操作(函数)。封装的类常是单元测试的重点,然而,类中包含的操作是最小的可测试单元。以方法为单元以方法为单元可以将面向对象单元测试归结为传统的(面向过程的)单元测试。方法几乎等价于过程,所以可以使用所有传统功能性和结构性测试技术。面向对象的单元测试以类为单元在以类为单元的测试中不再孤立的对单个操作进行测试,而是将其作为类的一部分。以类作为单元可以解决类内集成问题,但是会产生其他问题。不能测试抽象类,因为它不能被实例化;如果使用充分扁平化的类,则还要在单元测试结束后将其“恢复”为原来的形式;如果不使用充分扁平化的类,则为了编译类需要在继承树中高于除该类外的所有其他类。面向对象的集成测试对于面向对象系统,由于测试重点是重用和类,因此测试这种集成单元是至关重要的。多态性中存在的一种方式是通过动态绑定实现的多态,这也为测试带来了很大的挑战。面向对象系统的集成测试有两种不同的策略一种是基于线程的测试,集成影响系统的一个输入或者事件所需的一组类,每个线程单独的集成和测试。应用回归测试以确保没有其他关联产生。另一种方法是基于使用的测试,通过测试很少使用服务类的那些类(独立类)开始构造系统,独立类测试完成后,利用独立类测试下一层的类(依赖类)。继续依赖类的测试,直到完成整个系统的测试。面向对象的集成测试在面向对象系统的集成测试中需要注意以下几点:面向对象系统本质上是通过小的、可重用的组件构成。因此,集成测试对于面向对象系统来说更重要。面向对象系统下组件的开发一般更具并行性,因此对频繁集成的要求更高。由于并行性提高,集成测试时需要考虑类的完成顺序,也需要设计驱动器来模拟外没有完成的类功能。面向对象的系统测试面向对象的系统测试是针对非功能需求的测试,它所包含的范围是所有功能需求以外的需求以及注意事项。面向对象系统测试有三个主要目的:验证产品交付的组件和系统性能能否达到要求;定位产品的容量以及边界限制;定位系统性能瓶颈。面向对象系统的回归测试将集成测试的讨论再向前推进一步,回归测试对于面向对象系统非常重要。作为面向对象系统强调依赖可重用组件的结果,对任何组件的变更都可能对使用该组件的客户引入潜在的副作用,对于面向对象系统测试来说,频繁运行集成和回归测试用例是很有必要的。此外,由于继承等性质导致的变更级联效果,尽可能早地捕获缺陷是很有意义的。回归测试需要时间、经费和人力来计划、实施和管理。为了在给定的预算和进度下,尽可能有效力地进行回归测试,需要对测试用例库进行维护并依据一定的策略选择相应的回归测试包。面向对象软件的测试用例设计面向对象测试与传统测试相类似,但它们的测试策略是不同的。由于面向对象分析与设计模型在结构和内容上与面向对象程序相类似,因此,测试从对这些模型的评审开始。当代码产生后,面向对象测试则是从设计一系列用例检验类操作的小型测试和类与其他类进行协作时是否出现错误开始。当集成类形成一个子系统时,结合基于故障的方法,运用基于使用的测试对相互协作的类进行完全检查。最后,利用用例发现软件确认层的错误。相比于传统的结构化程序测试通过软件的【输入】-【处理】-【输出】视图或者单个模块的算法细节来设计测试用例的方式,面向对象测试侧重于设计适当的操作序列来检查类的状态。面向对象测试用例设计的基本概念类经过分析模型到设计模型的演变,它成为测试用例设计目标。由于操作和属性是封装的,从类的外面测试操作通常是不现实的。尽管封装是面向对象的基本特征之一,但可能成为测试的阻碍。前面描述的白盒测试方法可以应用于类中定义的操作。基本路径、循环测试或者数据流技术有助于确保测试一个操作的每一条语句。但是,因为类的操作结构简洁,所以通常采用白盒测试方法来测试类的层次的测试。并且,与利用传统的软件工程方法开发的系统一样,黑盒测试方法同样也适用于面向对象系统测试。用例可以为黑盒测试提供有用的输入。面向对象编程对测试的影响面向对象编程可能对测试有几种方式的影响,依赖于面向对象编程的方法。某些类型的故障变得就不可能(不值得去测试);某些类型的故障变得更加可能(值得进行测试);出现某些新的故障类型。测试面向对象的类操作类似于测试一段代码,它设置了函数参数,然后调用该函数。继承是一种方便的生产多态的方式,在调用点,关心的不是继承,而是多态。基于故障的测试在面向对象系统中,基于故障的测试的目标是设计最有可能发现似乎可能的故障的测试。集成测试在消息链接中查找似乎可能的故障,在此语境下,会遇到三种类型的故障:非期望的结果、错误的操作/消息使用、不正确的调用。基于场景的测试基于故障测试忽略了两种主要的错误类型:(1)不正确的规格说明;(2)子系统间的交互。基于场景的测试关心用户做什么,而不是产品做什么。这意味着需要通过用例捕获用户必须完成的任务,然后在测试时使用它们及其变体。场景可以发现交互错误。为了达到这一标准,测试用例必须比基于故障的测试更复杂且更切合实际。基于场景的测试倾向于用单一的测试检查多个子系统,用户并不限制自己一次只使用一个子系统。表层结构和深层结构的测试表层结构是指面向对象程序的外部可观察的结构,即对最终用户显而易见的。许多面向对象系统的用户可能不是完成某个功能,而是得到以某种方式操纵的对象。但是,无论接口是什么,测试仍然是基于用户任务进行的。捕捉这些任务涉及理解、观察以及与有代表性的用户进行交谈。深层结构指面向对象程序的内部技术细节,即通过检查设计和代码来理解的数据结构。设计深层结构测试来检查面向对象软件设计模型中的依赖关系、行为和通信机制。分析模型和设计模型用作深层结构测试的基础。面向对象的软件测试案例HelloWorld类的测试每一种语言在其学习用书的第一个例子通常都是最简单的HelloWorld。HelloWorld类的测试为了对HelloWorld类进行测试,可以编写以下测试用例,它本身也是一个Java类文件。Date.increment方法的测试首先对于类CalendarUnit,它提供一个方法在所继承的类中设置取值,提供一个布尔方法说明所继承类中的属性是否可以增1。Date.increment方法的测试要测试Date.increment方法需要开发类testIt用做测试驱动,即创建一个测试日期对象,然后请求该对象对其本身增1,最后打印新值。Date.increment方法的测试Date类的CRC卡中的信息类名:Date责任:Date对象由日期、月份和年对象组成。Date对象使用所继承的Day和Month对象中的布尔增量方法对其本身增1;如果日期和月份对象本身不能增1(例如月份或年的最后一天),则Date的增量方法会根据需要重新设置日期和月份。如果是12月31日,则年也要增1。printDate操作使用Day、Month和Year对象中的get()方法,

温馨提示

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

评论

0/150

提交评论