《面向对象的测控系统软件设计》课件第3章_第1页
《面向对象的测控系统软件设计》课件第3章_第2页
《面向对象的测控系统软件设计》课件第3章_第3页
《面向对象的测控系统软件设计》课件第3章_第4页
《面向对象的测控系统软件设计》课件第3章_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

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

文档简介

第3章面向对象的软件工程3.1面向对象技术概论3.2面向对象软件过程

3.1面向对象技术概论

3.1.1结构化范型与面向对象范型

所谓范型(Paradigm),是指做事情的整体观点或策略,它是一套特定的思想集。结构化范型(StructruedParadigm)是一种基于如下概念的开发策略,即一个系统应该被划分为两部分:数据(使用数据/持久化模型建模)和功能(使用过程模型建模)。简言之,使用结构化的方法,数据将和设计模型中以及系统实现(也就是程序)中的行为分离。面向对象范型(ObjectOrientedParadigm)是一种基于如下概念的开发策略,即系统可以由一系列称做对象(Object)的可重用组件来构建。与在结构化范型里分离数据和功能不同,对象包含了它们两者。如图3-1中所示,面向对象范型背后的主要概念不是把系统定义为两个分离的部分(数据和功能),而是需要把系统定义为一组正在交互的对象。对象可以完成一些事情(也就是说它们有功能),它们也知道一些事情(也就是说它们有数据)。虽然这听起来和结构化范型相似,但事实上却是不同的。图3-1结构化范型和面向对象范型的比较如果采用结构化的方法完成一所大学信息系统的设计,则可通过定义数据库的布局和程序的设计来访问这些数据。数据库中存有关于学生、教授、教室以及课程的信息。程序可以让用户登记学生的选课情况,分派教授授课,安排授课教室等。程序可以访问并更新数据库,实际上它可以支持学校的日常运作。下面用面向对象的观点来考虑大学信息系统的设计。在现实世界中,有学生、教授、教室和课程,所有这些事情都将被当成对象来考虑。学生知道一些事情(他们有自己的名字、住址、生日、电话号码等),可以完成一些事情(登记课程、取消课程以及支付学费)。教授也知道一些事情(他们所教授的课程以及他们的名字),同样也能完成一些事情(输入分数以及提出进度要求)。从系统的观点来看,教室也知道一些事情(它们所处的建筑物以及它们的房间号),也应该能够完成某些事情(例如告知空闲状态以及可以预定它们的时间段)。课程也知道某些事情(它们的名称、描述以及谁将选这门课),也能完成一些事情(例如通知学生选课或通知学生取消选课)。要实现这样的系统,我们可以定义一组能进行交互的类(类(Class)是相似对象的一种通用表示)。例如,我们将使用“课程”、“学生”、“教授”以及“教室”类。这样的类将组成我们的应用,它包括功能(程序)和数据。

对于个人,面向对象是一种全新的思考方式。对于机构,面向对象则彻底改变了机构内的系统开发文化。3.1.2面向对象的基本概念

1.对象

对象(Object)是面向对象(OO)方法的核心。对象的概念来源就在生活之中。在现实生活中,我们随时随地都在和对象打交道——我们骑的车、看的书以及我们自己,在一个程序员眼中无一例外都是对象。

如果把问题抽象一下,会发现这些现实生活中的对象有两个共同的特点:第一,它们都有自己的状态,例如一个球有自己的质地、颜色、大小;第二,它们都具有自己的行为,比如一个球可以滚动、停止或旋转。飞机等均可看做对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。对象的状态用数据来表示,称为对象的属性;每个对象都有自己的行为,而对象的行为用对象中的代码来实现,则称为对象的方法。不同的对象有不同的方法,当然也不排除有部分重叠。对象具有状态,可用数据值来描述。对象还有操作,用于改变对象的状态。对象及其操作就是对象的行为。对象实现了数据和操作的结合,是一个属性(数据)集及其操作(行为)的封装体。

2.类

类(Class)抽象出了一类对象的共同的结构和行为。这些对象具有相同种类的属性及方法。对象是类的实例。类好比是一类对象的模板,有了类定义后,基于类就可以生成这类对象中的任何一个对象,这些对象虽然采用相同的属性来表示状态,但它们在属性上的取值完全可以不同。在类的定义中,可以为某个属性指定一个值,作为它的默认值。在客观世界中有若干类,这些类之间有一定的结构关系。通常有两种主要的结构关系,即一般—具体结构关系和整体—部分结构关系。

(1)一般—具体结构称为分类结构,也可以说是“或”关系,或者是“isa”关系。

(2)整体—部分结构称为组装结构,它们之间的关系是一种“与”关系,或者是“hasa”关系。

3.消息和方法

对象之间进行通信的结构叫做消息(Message)。消息是由发送对象发送给接收对象的一个操作请求。对象可以向其他对象发送消息以请求服务,也可以响应其他对象传来的消息,完成自身固有的某些操作,从而服务于其他对象。发送一条消息至少要包括说明接收消息的对象名和发送给该对象的消息名(即对象名和方法名)。一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者是所有对象都知道的全局变量名。

类中操作的实现过程叫做方法,一个方法有方法名、参数、方法体。消息传递如图3-2所示。图3-2对象、类和消息的传递

4.类的特性

类的定义决定了类具有5个特性:抽象、继承、封装、多态、重载。

(1)抽象。类的定义中明确指出类是一组具有内部状态和运动规律对象的抽象。抽象是一种从一般的观点看待事物的方法,它要求我们集中于事物的本质特征(内部状态和运动规律),而非具体细节或具体实现。面向对象鼓励我们用抽象的观点来看待现实世界,也就是说,现实世界是由一组抽象的对象——类组成的。

(2)继承。继承是类不同抽象级别之间的关系。类的定义主要有两种办法:归纳和演绎。由一些特殊类归纳出来的一般类称为这些特殊类的父类,特殊类称为一般类的子类,同样父类可演绎出子类;父类是子类更高级别的抽象。子类可以继承父类的所有内部状态和运动规律。在计算机软件开发中采用继承性,提供了类的规范的等级结构;通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。

(3)封装。对象间的相互联系和相互作用过程主要通过消息机制得以实现。对象之间并不需要过多地了解对方内部的具体状态或运动规律。面向对象的类是封装良好的模块,类定义将其说明(用户可见的外部接口)与实现(用户不可见的内部实现)显式地分开,其内部实现按其具体定义的作用域提供保护。类是封装的最基本单位。封装防止了因程序相互依赖而带来的变动影响。在类中定义的接收对方消息的方法称为类的接口。

(4)多态(覆盖)。多态是指一个程序中同名的不同方法共存的情况。在父类演绎为子类时,类的运动规律也同样可以演绎,演绎使子类的同名运动规律或运动形式更具体,甚至子类可以有不同于父类的运动规律或运动形式。不同的子类可以演绎出不同的运动规律。如动物都会吃,而羊和狼吃的方式和内容都不一样,如图3-3所示。图3-3类的多态性

(5)重载。重载指类的同名方法在给其传递不同的参数时可以有不同的运动规律。在对象间相互作用时,即使接收消息对象采用相同的接收办法,但消息内容的详细程度不同,接收消息对象内部的运动规律也可能不同。如图3-4所示,老板指派采购员买东西,当老板没有指明买什么时,采购员可能默认买地瓜;如老板指明要采购员买大米,采购员可能到最近的超市买10斤大米;如老板指明采购员今天晚上到福州东街口买5斤大米,那么采购员将不得不按老板指定的时间、地点去购买5斤大米。图3-4方法重载

3.2面向对象软件过程

3.2.1生命周期

软件生命周期(SoftwareLifeCycle)是指从软件开发项目的提出到软件产品完成使命而报废的整个时期。假设软件的生命是从软件的需求说明开始的,然后软件长成到设计、实现、测试,这就是软件的成长过程。如果它通过测试,那么软件就升级为产品状态。当它吸引了用户,且这些用户发现了程序错误时,就必须维护它。当用户强烈要求更多的东西时,软件必须扩展。创建一个改进的版本,同样包括需求说明、设计、实现和测试各阶段。传统的软件生命周期和面向对象的软件生命周期是有所不同的。传统的程序设计早期主要集中在如何实现上,即一个项目生命周期的绝大部分花费在实现设计上,其生命周期螺旋线如图3-5所示。而面向对象设计的目标是为了得到强壮的软件,这些软件易于重用、细化、测试、维护和扩展。当软件作为其他软件的一部分使用而不是原始设计时,叫做软件“重用”。当它作为基本的东西用为其他软件定义时,叫做软件“细化”。图3-5传统软件生命周期当确定它的行为是否符合软件的说明书时,叫做软件“测试”。当发现软件有错误并改正错误时,叫做软件“维护”。当把新的功能加入到一个已有的程序中时,叫做软件“扩展”。一个面向对象软件项目的螺旋线如图3-6所示。这条螺旋线清楚地表明了整个时间的很大一部分花在了设计阶段,相对较少的一部分花在了实现和测试上。图3-6面向对象的软件生命周期因为要设计易于重用、维护和修改的软件,所以很大一部分的时间花在了设计上。面向对象编程工具本身不能保证产生可重用的、可维护的和可扩展的软件。相反,面向对象编程工具能够起到支持一个项目的作用,帮助项目中的团队成员探索问题,并作出详细的设计。为了实现软件的重用,需要付出很大的努力来设计代码,但最后终将取得可观的成果。花时间作详细设计,同样也给了编程人员深入理解问题的时间。由于深入了解了问题,因而实现起来很快。因此,对于一个周期所需要的总时间而言,可以保持不变,甚至减少。正是因为在编程人员的脑海中一开始就有了软件设计的维护、扩展和重用的思想,并对此付出了各种努力,所以所需要的时间就会从根本上减少。3.2.2面向对象分析

所谓面向对象分析(ObjectOrientedAnalysis,OOA),是指在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。OOA与结构化分析有较大的区别。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。

1.OOA方法中用到的概念和术语

在OOA方法中,用到了一些新的概念和术语,在这里给予简单介绍。

主题(Subject)是指把一些具有较强联系的类组织在一起而得到的类的集合。对大的系统而言,当类较多时,会增加人们阅读和理解的难度。运用主题划分的原则,把众多类组合成数量较少的几个主题,通过控制可见性,对人们的注意力加以引导,使人们可以从更高的宏观角度观察这些主题,有助于理解总体模型。问题域(ProblemDomain)是指被开发系统的应用领域,即在客观世界中由该系统处理的业务范围。

关联(Association)是指对象之间存在的静态联系。如果这种联系是系统责任所需要的,则要求在OOA模型中通过连接明确地表示出来。

聚合(Aggregation)又称组装,是指把—个复杂的事物看成若干个简单的事物的组装体,用于简化对复杂事物的描述。

主动对象是指至少有一个服务不需要接收消息就能主动执行的对象。

2.OOA模型

OOA模型由5个层次(主题层、结构层、服务层、属性层、类和对象层)和5个活动(标识对象类、标识结构、定义主题、定义属性和定义服务)组成。在这种方法中定义了两种对象类之间的结构,一种称为分类结构,一种称为组装结构。分类结构就是所谓的一般与特殊的关系。组装结构则反映了对象之间的整体与部分的关系。

图3-7是OOA模型的结构示意图。5个层次的含义如下:图3-7OOA模型的结构示意图

(1)类和对象层表示待开发系统的基本构造块。对象都是现实世界中应用领域的概念的抽象。

信息建模是OOA过程中最基本和最关键的活动之一,就是从现实世界的应用领域中捕捉应用领域的基本结构的过程。

(2)对象的属性和实例连接共同构成了OOA模型的属性层。

(3)对象的服务加上对象间的消息通信构成了OOA模型的服务层。

(4)应用领域中的特定结构构成了OOA模型的结构层。

(5)当OOA模型的结构庞大复杂时,众多的对象有时难以处理,可以将对象归结到一定的主题中,这样可以使得模型的结构清晰。

OOA在定义属性的同时,要识别实例连接。实例连接反映的是一个实例与另一个实例的映射关系。

OOA在定义服务的同时要识别消息连接。当一个对象需要向另一个对象发送消息时,它们之间就存在消息连接。

3.OOA的主要原则

OOA有以下一些主要原则:

(1)抽象。从许多事物中舍弃个别的、非本质的特征,抽取共同的、本质性的特征,就叫做抽象。抽象是形成概念的必需手段。

抽象原则有两方面的含义:第一,尽管问题域中的事物是很复杂的,但是分析员并不需要了解和描述它们的一切,只需要分析研究其中与系统目标有关的事物及其本质性特征;第二,通过舍弃个体事物在细节上的差异,抽取其共同特征而得到一批事物的抽象概念。抽象是面向对象方法中使用最为广泛的原则。抽象原则包括过程抽象和数据抽象两个方面。过程抽象是指任何一个完成确定功能的操作序列,其使用者都可以把它看做一个单一的实体,尽管实际上它可能是由一系列更低级的操作完成的。数据抽象是根据施加于数据之上的操作来定义数据类型,并限定数据的值只能由这些操作来修改和观察。数据抽象是OOA的核心原则。它强调把数据(属性)和操作(服务)结合为一个不可分的系统单位(即对象),对象的外部只需要知道它做什么,而不必知道它如何做。

(2)封装。封装就是把对象的属性和服务结合为一个不可分的系统单位,并尽可能隐蔽对象的内部细节。

(3)继承。特殊类的对象拥有的一般类的全部属性与服务,称作特殊类对一般类的继承。

在OOA中运用继承原则,就是在每个由一般类和特殊类形成的一般和特殊结构中,把一般类的对象实例和所有特殊类的对象实例都共同具有的属性和服务,一次性地在一般类中进行显式的定义。在特殊类中不再重复地定义一般类中已定义的东西,但是在语义上,特殊类却自动地、隐含地拥有它的一般类(以及所有更上层的一般类)中定义的全部属性和服务。继承原则的好处是:使系统模型比较简练,也比较清晰。

(4)分类。分类就是把具有相同属性和服务的对象划分为一类,用类作为这些对象的抽象描述。分类原则实际上是抽象原则运用于对象描述时的一种表现形式。

(5)聚合。聚合又称组装,其原则是:把一个复杂的事物看成若干个比较简单的事物的组装体,从而简化对复杂事物的描述。

(6)关联。并联是人类思考问题时经常运用的思想方法,即通过一个事物联想到另外的事物。能使人发生联想的原因是事物之间确实存在着某些联系。

(7)消息通信。这一原则要求对象之间只能通过消息进行通信,而不允许在对象之外直接地存取对象内部的属性。通过消息进行通信是由于封装原则而引起的。在OOA中要求用消息连接表示出对象之间的动态联系。

(8)粒度控制。一般来讲,人在面对一个复杂的问题域时,不可能在同一时刻既能纵观全局,又能洞察秋毫,因此需要控制自己的视野。考虑全局时,注意其大的组成部分,暂时不详察每一部分的具体细节;考虑某部分的细节时,则暂时撇开其余的部分。这就是粒度控制原则。

(9)行为分析。现实世界中事物的行为是复杂的。由大量的事物所构成的问题域中各种行为往往相互依赖、相互交织。

4.实现OOA方法的步骤

在用OOA具体地分析一个事物时,大致上遵循如下五个基本步骤:

(1)确定对象和类。这里所说的对象是对数据及其处理方式的抽象,它反映了系统保存和处理现实世界中某些事物的信息的能力。类是多个对象的共同属性和方法集合的描述,它包括如何在一个类中建立一个新对象的描述。

(2)确定结构(Structure)。结构是指问题域的复杂性和连接关系。类成员结构反映了泛化—特化关系,整体和部分结构反映了整体和局部之间的关系。

(3)确定主题(Subject)。主题是指事物的总体概貌和总体分析模型。

(4)确定属性(Attribute)。属性就是数据元素,可在图中给出,并在对象的存储中指定,用来描述对象或分类结构的实例。

(5)确定方法(Method)。方法是在收到消息后必须进行的一些处理方法。方法要在图中定义,并在对象的存储中指定。对于每个对象和结构来说,用来增加、修改、删除和选择一个方法本身都是隐含的(虽然它们是要在对象的存储中定义,但并不在图上给出),而有些则是显示的。

OOA有许多不同的方法,但是这些方法中有一点是共同的,那就是定义对象。定义对象的主要活动包括确定对象、确定属性、定义服务、建立结构、确定关联。上述过程的执行次序是可以改变的,某些活动可能会重复地发生。3.2.3面向对象设计

面向对象设计(ObjectOrientedDesign,OOD)方法是OO方法中一个中间过渡环节。其主要作用是对OOA分析的结果作进一步的规范化整理,以便能够被面向对象编程(OOP)直接接受。

在OO方法中,OOA和OOD之间有密切的衔接关系。OOA是提取和整理用户需求,并建立问题域精确模型的过程,在分析建模过程中是以对象为中心,可以不考虑任何与特定计算机有关的问题。而OOD则是用OO方法建立求解域模型的过程,针对计算机的开发活动。

OOD的目标是生成对问题域的表示并将这种表示映射到计算机的求解中。与传统方法不同的是,OOD把数据对象和处理操作连接起来,把数据和处理一起模块化。

OO方法在概念和表示方法上的一致性使得分析和设计的界限比较模糊,许多分析结果可以直接映射成设计结果,而在设计过程中又会反过来加深和补充对系统需求的理解。因此,分析和设计活动是一个反复交替进行的过程。各项开发活动之间可以做到无缝衔接,使得开发人员比较容易地追踪整个系统的开发过程,这是OO方法较传统方法的一大优势所在。从OOA过渡到OOD是一个自然而平滑的过程。OOA的终点即是OOD的起点。

将OOA模型进一步扩展便可得到OOD模型,即将OOA横向划分的5个层次和5个活动继续贯穿在OOD过程中,再将系统纵向划分为4个部件:设计问题域部分、设计人

机交互部分、设计任务管理部分和设计数据库管理部分。OOD模型的总体结构如图3-8所示。图3-8OOD模型的总体结构

(1)问题域部分。设计构造一组为底层应用建立模型的类和对象,细化分析结果。问题域部分是为了消除对象所具有的无限存储容量、对象间的通信速度无限快等而假设的。

(2)人机交互部分。设计一组有关类接口视图的用户模型的类和对象,设计用户界面。人机接口部分的设计是为了将系统和外界的通信任务由特定的对象承担,使得系统的功能和现实分离。如果系统与外界的接口发生改变,则只需要改变这部分对象即可。

(3)任务管理部分。确定系统资源的分配,设计用于系统中类的行为控制的对象/类。任务管理部分的设计是为了将系统和具体的操作系统提供的任务调用由特定的对象来承担。如果操作系统的环境发生改变,则只需要改变这部分对象即可。

(4)数据库管理部分。确定所要存储的对象,将对象转换成数据库记录或表格。数据库管理部分的设计是为了将系统和由特定数据库系统所管理的数据访问由特定的对象来承担。如果系统应用到的一些由数据库管理的数据,其类型或结构发生改变,则只需要改变这部分对象即可。从OOD模型的总体结构图中可以看出,OOD和OOA在表示方法上是一致的。OOA的结果可以作为OOD问题域部分的一个原始版本,以其为中心,在相应的层次上构造出人机交互部分、任务管理部分、数据库管理部分。

OOA最终分析结果、问题域部分、人机交互部分、任务管理部分、数据库管理部分和系统外界环境的关系如图3-9所示。图3-9OOD的主要任务及其关系

OOD的目标是消除管理程序内部各部分之间的相互依赖。为了达到这个目标,OOD要求将程序分成块,每个块的规模应该小到可以管理的程度,然后分别将各个块隐藏在接口(Interface)的后面,让它们只通过接口相互交流。比如说,如果用OOD的方法来设计一个服务器-客户端(Client-Server)应用,那么服务器和客户端之间不应该有直接的依赖,而是应该让服务器的接口和客户端的接口相互依赖。这种依赖关系的转换使得系统的各部分具有了可复用性。如果要复用某一个程序块,只要实现必需的接口即可。

OOD是一种解决软件问题的设计范式,也是一种抽象的范式。使用OOD这种设计范式,我们可以用对象来表现问题领域的实体,每个对象都有相应的状态和行为。OOD是一种抽象的范式。抽象可以分成很多层次,从非常概括的到非常特殊的,而对象可能处于任何一个抽象层次上。彼此不同但又互有关联的对象可以共同构成抽象。只要这些对象之间有相似性,就可以把它们当成同一类的对象来处理。3.2.4面向对象编程

面向对象编程(ObjectOrientedProgramming,OOP)是一种计算机编程架构。OOP的一条基本原则是,计算机程序是由单个能够起到子程序作用的单元或对象组合而成的。OOP达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其他对象发送信息。

数据和功能一起在运行着的计算机程序中形成的单元,称做组件。组件在OOP计算机程序中是模块和结构化的基础。

OOP具有以下功能:

抽象性:程序有能力忽略正在处理中信息的某些方面,即对信息主要方面关注的能力。

封装性:确保组件不会以不可预期的方式改变其他组件的内部状态;只有在那些提供了内部状态改变方法的组件中,才可以访问其内部状态。每类组件都提供了一个与其他组件联系的接口,并规定了其他组件进行调用的方法。

多态性:组件的引用和类集会涉及其他许多不同类型的组件,而且引用组件所产生的结果得依据实际调用的类型。继承性:允许在现存的组件基础上创建子类组件,这统一并增强了多态性和封装性。也就是说,用类来对组件进行分组,而且可以定义新类为现存的类的扩展,可以将类组织成树型或网状结构,这体现了动作的通用性。

由于抽象性、封装性、重用性以及便于使用等方面的原因,以组件为基础的编程在脚本语言中已经变得特别流行。Python和Ruby是新近出现的语言,在开发时完全采用了OOP的思想,而流行的Perl脚本语言从版本5开始也慢慢地加入了新的面向对象的功能组件。用组件代替“现实”上的实体已成为JavaScript(ECMAScript)流行的原因。事实表明,对组件进行适当的组合就可以在因特网上代替HTML和XML的文档对象模型(DOM)。3.2.5面向对象测试

面向对象的开发模型突破了传统的瀑布模型,将开发分为面向对象分析(OOA)、面向对象设计(OOD)和面向对象编程(OOP)三个阶段。针对这种开发模型,结合传统的测试步骤的划分,我们把面向对象测试(ObjectOrientedTest)分为面向对象分析的测试、面向对象设计的测试、面向对象编程的测试、面向对象的单元测试、面向对象的集成测试和面向对象的系统测试。

1.面向对象分析的测试

传统的面向过程分析是一个功能分解的过程,它是把一个系统看成可以分解的功能的集合。这种传统的功能分解分析法的着眼点在于一个系统需要什么样的信息处理方法和过程,以过程的抽象来对待系统的需要。而面向对象分析(OOA)是把信息世界中的概念与面向对象程序设计语言的重要概念结合在一起而形成的分析方法,最后通常是将问题空间以图表形式描述。OOA直接映射问题空间,全面地将问题空间中现实功能抽象化。将问题空间中的实例抽象为对象,用对象的结构反映问题空间的复杂实例和复杂关系,用属性和操作表示实例的特性和行为。对一个系统而言,与传统分析方法产生的结果相反,行为是相对稳定的,结构是相对不稳定的,这更充分反映了现实的特性。OOA的作用是为后面阶段类的选定和实现,以及类层次结构的组织和实现提供平台。因此,对OOA的测试,应从以下方面考虑:

(1)对认定的对象的测试;

(2)对认定的结构的测试;

(3)对认定的主题的测试;

(4)对定义的属性和实例关联的测试;

(5)对定义的服务和消息关联的测试。

2.面向对象设计的测试

通常的结构化的设计方法用的是面向作业的设计方法,它把系统分解以后,提出一组作业,这些作业是以过程实现系统的基础构造,把问题域的分析转化为求解域的设计,分析的结果是设计阶段的输入。而面向对象设计(OOD)采用“造型”的观点,以OOA为基础归纳出类,并建立类结构或进一步构造成类库,实现分析结果对问题空间的抽象。由此可见,OOD是OOA的进一步细化和更高层的抽象。所以,OOD与OOA的界限通常是难以严格区分的。OOD确定类和类结构不仅是满足当前需求分析的要求,更重要的是通过重新组合或加以适当的补充,能方便实现功能的重用和扩增,以不断适应用户的要求。因此,对OOD的测试,应从以下三方面考虑:

(1)对认定的类的测试;

(2)对构造的类层次结构的测试;

(3)对类库的支持的测试。

3.面向对象编程的测试

典型的面向对象程序具有继承、封装和多态的新特性,这使得传统的测试策略必须有所改变。封装是对数据的隐藏,外界只能通过被提供的操作来访问或修改数据,这样降低了数据被任意修改和读/写的可能性,也降低了传统程序中对数据非法操作的测试。继承是面向对象程序的重要特点。继承使得代码的重用率提高,同时也使错误传播的概率提高。多态使得面向对象程序对外呈现出强大的处理能力,但同时却使得程序内“同一”函数的行为复杂化,测试时不得不考虑不同类型具体执行的代码和产生的行为。面向对象程序是把功能的实现分布在类中,能正确实现功能的类,通过消息传递来协同实现设计要求的功能。因此,在面向对象编程(OOP)阶段,忽略类功能实现的细则,将测试的目光集中在类功能的实现和相应的面向对象程序风格。对OOP的测试主要体现在以下两个方面:

(1)数据成员是否满足数据封装的要求;

(2)类是否实现了要求的功能。

4.面向对象的单元测试

传统的单元测试的对象是软件设计的最小单位——模块。单元测试的依据是详细设计描述,单元测试应对模块内所有重要的控制路径设计测试用例,以便发现模块内部的错误。单元测试多采用白盒测试技术,系统内多个模块可以并行地进行测试。

当考虑面向对象软件时,单元的概念发生了变化。封装驱动了类和对象的定义,意味着每个类和类的实例(对象)包装了属性(数据)和操纵这些数据的操作,而不是个体的模块。最小的可测试单位是封装的类或对象,类包含一组不同的操作,并且某特殊操作可能作为一组不同类的一部分存在,因此,单元测试的意义发生了较大变化。我们不再孤立地测试单个操作,而是将操作作为类的一部分。

5.面向对象的集成测试

传统的集成测试有两种方式:自顶向下集成和自底向上集成。自顶向下集成是构造程序结构的一种增量式方式,它从主控模块开始,按照软件的控制层次结构,以深度优先或广度优先的策略,逐步把各个模块集成在一起。自底向上集成是从“原子”模块(即软件结构最低层的模块)开始组装测试。因为面向对象软件没有层次的控制结构,所以传统的自顶向下和自底向上集成策略就没有意义。此外,一次集成一个操作到类中(传统的增量集成方法)经常是不可能的,这是由于构成类的成分的直接和间接的交互。对OO软件的集成测试有两种不同策略:第一种是称为基于线程的测试,集成对回应系统的一个输入或事件所需的一组类,每个线程被集成并分别测试,应用回归测试以保证没有产生副作用;第二种是称为基于使用的测试,通过测试那些几乎不使用服务器类的类(称为独立类)而开始构造系统,在独立类测试完成后,下一层的使用独立类的类(称为依赖类)被测试。这个依赖类层次的测试序列一直持续到构造完整个系统。

6.面向对象的系统测试

通过单元测试和集成测试,仅能保证软件开发的功能得以实现,但不能确认在实际运行时,它是否满足用户的需要。为此,对完成开发的软件必须经过规范的系统测试。系统测试应该尽量搭建与用户实际使用环境相同的测试平台,应该保证被测系统的完整性,对临时没有的系统设备部件也应有相应的模拟手段。系统测试时,应该参考OOA分析的结果,对应描述的对象、属性和各种服务,检测软件是否能够完全再现问题空间。系统测试不仅是检测软件的整体行为表现,从另一个侧面看,也是对软件开发设计的再确认。面向对象测试的整体目标——以最小的工作量发现最多的错误,和传统软件测试的目标是一致的,但是OO测试的策略和战术有很大不同。面向对象测试的视角扩大到包括复审分析和设计模型。此外,测试的焦点从过程构件(模块)移向了类。不论是传统的测试方法还是面向对象的测试方法,我们都应该遵循以下原则:

(1)应当把“尽早和不断地测试”作为开发者的座右铭。

(2)程序员应该避免检查自己的程序,测试工作应该由独立的专业的软件测试机构来完成。

(3)设计测试用例时,应该考虑到合法的输入和不合法的输入,以及各种边界条件,特殊情况下要制造极端状态和意外状态,比如网络异常中断、电源断电等情况。

(4)一定要注意测试中的错误集中发生现象,这与程序员的编程水平和习惯有很大的关系。

(5)对测试错误结果一定要有一个确认的过程。一般由A测试出来的错误,一定要有一个B来确认,严重的错误可以召开评审会进行讨论和分析。

(6)制定严格的测试计划,并把测试时间安排得尽量宽松

温馨提示

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

评论

0/150

提交评论