面向对象的软件维护

2024-06-02

面向对象的软件维护(精选九篇)

面向对象的软件维护 篇1

1 面向对象的发展历史与现状

面向对象方法起源于面向对象的编程语言, 它的发展历程主要包括以下几个阶段[1]:

1.1 雏形阶段

面向对象方法的概念如“对象”、“对象属性”最早出现在50年代人工智能早期研究。60年代挪威计算中心开发的Simula67语言被看作面向对象语言发展史上的第一个里程碑。70年代出现的CLU、并发Pascal、Ada和Modula-2等编程语言支持数据与操作的封装。1972年PARC发布了Smalltalk-72, 正式使用了“面向对象”术语。

1.2 完善阶段

70年代初到80年代, PARC先后发布了Smalltalk-72, 76, 78等版本, 1981年推出最完善的版本Smalltalk-80, 它是面向对象语言发展史上最重要的里程碑。至今人们所采用的绝大部分面向对象的基本概念及支持机制在Smalltalk-80中都已具备。

1.3 繁荣阶段

80年代中期到90年代是面向对象语言走向繁荣的阶段。其主要表现是大批实用的OOPL涌现, 例如C++, Objective-C, Object Pascal等。90年代仍有新的OOPL问世, 许多非OO语言增加了OO概念与机制而发展为OO语言。

1.4 从程序设计走向软件的整个生命周期

面向对象的软件工程方法是面向对象方法在软件工程领域的全面应用, 它包括面向对象的分析、设计、编程、测试和软件维护等内容。从软件生命周期可以看出, 面向对象的软件维护贯穿始终。

2 面向对象的基本概念[2]

(1) 面向对象 (object-oriented, 简称:OO) :基于对象概念, 以对象为中心, 以类和继承为构造机制来认识、理解、刻画客观世界和设计、构建相应的软件系统。

(2) 抽象:忽略事物的非本质特征, 只关注那些与当前目标有关的本质特征, 从而找出事物的共性。

(3) 分类:把共同性质的事物一般划分为一类, 得出一个抽象的概念。类分为一般类和特殊类。不同程度的抽象可以得到不同层次的类。较多的忽略事物的差别可以获得一般的类, 较多的关注事物的差别可以获得特殊的类。

(4) 继承性:指对具有层次关系的类的属性和操作进行共享的一种方式。

(5) 封装:把对象的属性和服务结合成一个独立的系统单位, 并尽可能隐蔽对象的内部细节。

(6) 聚合:一个较复杂的对象由其他若干较简单的对象作为其构成部分, 我们称为聚合。一般分为紧密固定和松散灵活两种。

3 面向对象软件维护与传统软件维护

一个软件有多好, 用户都会要求有更强的功能和适应性, 只有不断的维护, 软件产品才有生命力。面向对象技术维护阶段的任务就是使用面向对象维护 (OOSM) 方法对软件的功能和性能进行修改和扩展。维护是在软件投入运行之后的正常活动, 是系统变更的迭代过程。软件需要维护的原因有:

(1) 运行中发现原有设计存在缺陷;

(2) 某些功能模块的性能是否满足已经发展的业务需求;

(3) 软件运行的环境发生变更, 需要将原有软件移植到新的运行环境中;

(4) 用户的需求发生变化。

3.1 传统软件工程方法的软件维护

软件维护阶段的工作有两种情况:一是对使用中发现的错误进行修改, 二是因需求发生变化而进行修改。前一种情况需要从程序逆向追溯到发生错误的开发阶段, 由于程序不能映射问题域以及各个阶段的文档不能对应, 每一步追溯都存在许多理解障碍。第二种情况是一个从需求到程序的顺向过程, 它存在初次开发时的困难, 并且增加了理解每个阶段原有文档的困难。总之, 传统的软件工程方法各阶段存在方法和原则等方面的缺陷, 理解的错误和过渡的扭曲, 没有做到平滑的过渡, 仍然存在语言的鸿沟 (见图1) 。

3.2 面向对象的软件维护

面向对象的软件工程方法为软件维护提供了有效的途径。程序与问题域、各个阶段的表示均一致, 大大减小理解的难度, 同时系统中最容易发生变化的因素功能被作为对象的服务封装在对象内部, 使一个对象的修改对其他对象的影响减少, 避免了所谓的“波动效应”[3] (见图2) 。

4 面向对象的软件维护方法

4.1 理解、分析面向对象软件的一般方法

理解是维护的基础, 重构“源设计图”是理解的基础。在重构“源设计图”时, 对象的多态性、继承机制以及动态联接等给理解原设计增加了困难。为了以后维护方便, 应在开发时就使软件的设计思想, 软件开发环境应提供帮助维护人员理解原软件设计思路和策略的工具。一般理解一个程序段时, 应先完成对程序的静态分析, 在查阅文档和程序代码的同时, 要弄清楚程序的用途和设计思想。维护人员需查清程序从哪里被调用, 这段代码所调用的其它过程、前提条件、过程的功能及数据流动情况。理解面向对象的软件, 应在获取了该软件文档的前提下, 分析和研究各对象的组织结构, 以及其相互间的作用, 在此基础上遂步识别程序的对象、对象间的关系, 并掌握各对象中方法被激活的条件、消息的来源和传递的途径[4]。

4.1.1 对继承机制的分析

为了理解程序, 必须弄清楚程序的依赖性 (包括调用及数据流的关系) 。面向对象程序中广泛使用的继承机制为查找、分析程序的依赖性增加了困难。分析一段程序时, 必须考虑它是否存在于某些特定的上下文之中, 该程序段是否依赖于某个 (些) 对象类中的方法。这个方法有可能是由其子类中的一个成员所操纵的, 而操纵该方法的实例变元既可以在类中进行说明, 也可以在子类中的一个成员中说明。在面向对象软件的开发过程中, 随着新对象的不断增加, 继承关系的层次也会增加, 这会使继承关系变得更加复杂。在开发软件时, 为避免减弱数据的封装性, 同时保证类的功能, 程序员们把对象内的方法做得短小而简单, 小方法的数量大大增加, 它会使系统中的继承关系链变得很长, 增加了分析的难度。

4.1.2 对具有密切关系的类集团的分析

面向对象的软件中有一些关系密切的对象, 通过密切配合来完成一个特定的任务, 把这些对象类称为具有密切关系的类集团 (简称“密类集团”) 。维护人员要理解密类集团内每个类中的方法, 就必须理解它的整个运行机制, 跟踪所有可能的消息传递序列, 工作量相当巨大。密类集团的存在加大了阅读、理解程序的难度。在缺少分析工具的情况下, 为了以后的维护, 必须在软件文档中记录好密类集团的活动过程, 对各对象中的方法实行跟踪。在测试时, 要记录好消息发送的序列、条件、时间、来源及处理结果的去处。这种完整的记录可以减轻以后维护人员分析、理解软件的难度, 最终提高软件的可维护性。

4.2 面向对象软件的动态联接及多态性

动态联接及多态性会给软件维护带来分析上的困难, 关键是各对象的语义。如果开发者能保证多态一致性, 使所有方法对某个消息都产生相同的反映, 问题就会减少。每个软件的多态性和动态联接都具有两面: (1) 优点是使程序具有灵活性; (2) 缺点是给理解软件带来了困难, 从而增加了维护的难度。

参考文献

[1]面向对象方法综述.飞龙资料网[OL].http://study.that8.com/news.php?id=288635.

[2]蒙应杰.面向对象技术课堂讲义 (内部材料) , 2008.

[3]贾世胜, 程勇.面向对象 (OO) 方法是软件理论的返朴归真[J].山东农业大学学报 (自然科学版) , 2006 (37) :03.

面向对象的软件工程开发分析的论文 篇2

经实践研究表明,面向对象进行设计的软件工程在当前的计算机软件工程中具有较强的优势。第一,该方法与人类的思维方式更为贴近;第二,该方法具有较强的稳定性;第三,具有更强的可复用性;第四,在大型产品的开发与维护工作中可提供更为良好的便利条件。该方法的特点主要可概括如下:①对象属于基本元素,不同的基本元素之间可进行组合,形成复杂的软件对象,并由软件对象构成整体的系统;②在对不同的对象类进行划分时,可各自对应的数据与方法;③层次结构可通过子类与父类来进行设定;④不同对象之间可进行相互联系。

4结语

综上所述,面向对象的软件开发工程是一种具有较强先进性的方法,在计算机软件开发工作中具有重要的意义,但仍面临着一定的局限性,需在今后的实践中做出相应的完善。

面向对象的软件开发方法分析 篇3

【关键词】面向对象 软件开发方法 问题 分析

相比传统的软件开发方法,面向对象的软件开发方法(OMT)实现了质的飞跃,采用了一种自底向上的归纳、自顶向下的分解方法,通过对对象建模的建立,彻底解决了软件开发在需求分析、可维护性以及可靠性三大环节上的问题,同时也大大提高和改善了系统的可维护性。可见,面向对象的软件开发方法,作为一种归纳和演绎思想的综合体现,其对软件设计、软件开发所起的促进作用是毋庸置疑的。

一、传统软件开发方法存在的问题

(一)软件复用性差

在软件开发工程所追求的目标当中,软件复用性是重点之一,同时也是节约人力和提升软件生产率的重要渠道。虽然近年来软件当中的结构化分析、结构化设计和结构化程序开发给软件产业带来了巨大的进步,但是还不足以从根源上解决软件重复使用的问题。

(二)软件可维护性差

传统的软件开发方法过于侧重一致、完整的文件合成最终的产品,以致在整个开发过程中,软件的可测试性、可读性和可修改性成了衡量一个软件产品优劣的重要标准。事实上,在软件的实际应用中,我们可以发现这类产品的维护性差,且所消耗的成本相当高。

(三)开发出的软件不能满足用户需要

传统的结构化方法所涉及的知识领域比较广泛,以致使用它开发大型软件时,一旦遇到系統需求模糊或者系统发生动态变化,就会影响开发效率,导致最终开发出来的软件脱离用户实际需求。

(四)软件质量难以保证

传统的软件开发方法所开发出来的复杂型大型软件,或者是需求模糊的系统,绝大多数都是难以成功投入市场使用的。归其原因,主要有以下两大因素:第一,软件开发人员对用户的实际需求理解不够透彻,以致最后开发出来的软件和用户的期待不相符;第二,所开发出来的软件灵活性低,无法适应用户需求的经常性变化,再加上部分用户有时会在软件的一些使用性能方面提出部分要求,倘若系统的设计和开发是基于过程中,那么软件系统的可扩充性和稳定性就会无法适应变化,而这种变化也会对软件系统自身的机构造成影响,设计、开发的成本也会随之提高。

二、面向对象的软件开发方法

现阶段,面向对象的软件开发方法的研究已经日趋成熟,市场上也不断有新产品涌现。面向对象的软件开发方法有Coad方法、Booch方法和OMT方法等。

(一)Booch方法

Booch方法的最突出特点就是它能够反映出系统的各个方面是如何相互联系和作用的。在一系列的面向对象的软件开发方法中,Booch方法是最早描述当中的基础问题的,其首先提出面向对象是区别于传统软件开发的一种方法。Booch方法认为面向对象的软件分解更接近人们对客观事物的认知,它并没有对各个开发阶段进行明确的周期划分,把主要的工作都集中在软件设计阶段。

(二)Coad方法

Coad方法是通过多年来大型系统开发的经验与面向对象概念的有机结合,该方法在对象、结构、属性和操作的认定方面,提出了一套系统化的原则,并完成了从客户需求角度进一步进行类和类层次结构的认定。Coad方法把软件系统的开发划分为分析和设计两个阶段,虽然说Coad方法没有引入类和类层次结构的术语,但事实上它已经在分类结构、消息关联等概念中呈现了类和类层次结构的特征。从某种程度上来说,Coad方法的概念虽然简单易懂,但是它对各个面向对象和行为的描述不够全面,对象模型的语言表达能力也不突出。

(三)OMT方法

OMT方法是一种跟随OOP向OOD和OOA发展而形成的面向对象的软件开发方法,它的方法涵盖了软件分析、软件设计以及软件实现三大步骤,贯穿于软件开发的全程。OMT还建立了对象模型、动态模型和功能模型三个模型,这三个模型在一定程度上完善了软件,使软件开发更加清晰,也更易于维护。可以说,作为一种以真实世界为对象建模而进行的独立语言设计,OMT方法彻底实现了传统软件开发方法没有完全实现的目标,为绝大多数领域的应用软件提供了一种实际的、高效的、可操作的保证。

(四)UML语言

UML语言是一种建模语言,它是软件工程领域的重要成果之一,在未来,UML语言将会成为面向对象技术领域内的标准建模语言。UML不仅结合了Booch方法、OMT方法、OOSE方法的优势,而且还对其做了进一步的发展,汲取了面向对象技术领域中的其他流派优秀的开发思想,融入了软件工程领域的新思想、新方法、新技术。总而言之,UML是一种通用的标准建模语言,适用于以面向对象技术为基础的任何类型的软件系统,而且还能够在系统开发的不同阶段使用,从需求规格描述直至系统完成后的测试和维护。

综上所述,由于面向对象的软件开发方法所具备的诸多优点,相信面向对象的软件开发方法在未来会有更广阔的前景。可见,开展面向对象的软件开发方法的研究工作,也有着十分重要的现实意义。

【参考文献】

[1]唐黎黎.面向对象的软件工程应用研究[J].现代商贸工业,2010(22).

谈软件工程中的面向对象软件设计 篇4

1 面向对象设计概述

面向对象(OO,Objected Oriented)方法是1979年以后发展起来的,它是一种系统的软件方法学。有学者认为面向对象技术与方法包括面向对象分析、面向对象设计、面向对象编程、面向对象测试和面向对象维护5个阶段。

面向对象设计(OOD,Objected Oriented Design)并不是指用一种具体语言去直接编写代码,而是建立在前期的面向对象分析建模基础上,主要考虑“如何实现”问题,焦点从问题空间转到解空间,着重完成各种不同层次的模块设计。但是有一点与传统设计有很大区别,面向对象设计和分析没有明显的分界线,二者采用相同的符号表示,它们往往反复迭代地进行。设计对分析模型进行调整并补充与实现有关的部分,形成面向对象设计模型。

2 面向对象设计过程

2.1 系统设计

系统设计确定实现系统的策略和目标系统的高层结构,要将系统分解为若干子系统,在定义和设计子系统时应使其具有良好的接口,通过接口和系统的其余部分通信。主要步骤有:划分子系统,确定需要并发运行的子系统并分配处理器,描述子系统之间的通信,确定系统资源的管理和控制,确定人机交互构件,选择实现数据管理和任务管理的基本策略。

2.2 对象设计

面向对象设计阶段是扩充、完善和细化对象模型的过程,设计类中的服务、实现服务的算法是面向对象设计的重要任务,还要设计类的关联、借口形式及进行设计的优化。一般步骤是:对象描述,设计类中的服务,设计类的关联,链属性的实现,设计的优化。

2.3 领域对象设计

OOD阶段的一个重要内容是实现角度对领域模型做补充或修改。例如,增添、合并或分解类对象,调整继承关系等等。领域对象设计一般包括:调整需求,复用已有的组建,引入父类、分组管理领域类,增添一般化类以建立协议,调整OOA模型,设计复审。

3 面向对象设计的原则

3.1 单一职责原则

就一个类而言,应该仅有一个引起它的变化的原因。最有效类的职责简单而且集中,避免相同的职责分散到不同的类之中,避免一个类承担过多的职责减少类之间的耦合当需求变化时,只修改一个地方。

3.2 开放封闭原则

包含两个要点:一种可变性不应当散落在代码的很多角落里,而应当被封装到一个对象里面。同一种可变性的不同表象意味着同一个继承等级结构中的具体子类。换言之,指当需求改变时设计人员扩展模块增加新功能,而不需要改动原来的代码。

3.3 Liskov替换原则LSP

LSP是主要针对继承的设计原则,所有派生类的行为功能必须和客户程序对其基类所期望的保持一致。简单的说,如果一个软件实体使用的是基类的话那么也一定适用于子类,但反过来的代换不成立。

3.4 依赖倒置原则DIP

IDP原则规定:1)高层模块不应依赖于底层模块,两者都应该依赖于抽象;2)抽象不应该依赖于细节,细节应该依赖于抽象。

3.5 接口隔离原则——ISP

从客户的角度来说:一个类对另外一个类的依赖性应当是建立在最小的接口上的。如果客户端只需要某一些方法的话,那么就应当向客户端提供这些需要的方法,而不要提供不需要的方法。提供接口意味着向客户端承诺,过多的承诺会给系统的维护造成不必要的负担。

4 面向对象设计的软件

4.1 设计软件概述

20世纪80年代以来,出现了几十种支持软件开发的面向对象方法。其中,Booch,Coad/Yourdon、OMT和Jacobson的方法在面向对象软件开发界得到了广泛的认可。目前主要使用的是统一建模语言UML(Unified Modeling Language)进行建模,该方法结合了Booch、OMT和Jacobson方法的优点,统一了符号体系,并从其它的方法和工程实践中吸收了许多经过实际检验的概念和技术。UML1.1版本于1997年被OMG组织接纳确定为基于面向对象技术的标准建模语言。

4.2 具体的设计模型

第一,用例模型,它是从用户的角度描述系统需求。一般先将用例按优先级分类,再区分用例在体系结构方面的风险大小,最后对用例所需的工作量进行估算。第二,静态模型,它是描述系统的元素,即元素间的关系,定义了类、对象和它们之间的关系及组件模型,可以使用用例图、类图、包图、对象图、构件图、部署图等。第三,动态模型,它描述系统随时间的推移发生的行为,可以使用的UML图有状态图、顺序图、活动图、协作图。第四,实现模型,它包括构件图和部署图,它们描述了系统实现时的一些特性。构件图显示代码本身的逻辑结构;部署图显示系统运行时的结构。

5 面向对象设计的评价

我们在关注面向对象思想进行开发的易维护、质量高、效率高、易扩展优点的同时,也必须充分认识其不足,尤其是关于效率的问题。有研究者发现,成功的操作系统没有一个是使用面向对象语言开发的,成功的搜索引擎也是如此。由于比较脱离底层,因此在一些嵌入式等跟硬件打交道较多的地方不太适合使用。因而,有评论认为在效率极其关键、或者处理超大规模数据的情况下,面向对象思想毫无用处,面向过程的开发才是最适合的。

虽然面向对象设计原则上不依赖于特定的实现环境,但是实现结果和实现成本却在很大程度上取决于实现环境。因此,笔者认为直接支持面向对象设计范式的面向对象程序语言、开发环境及类库,对于面向对象实现来说是非常重要的,作为软件工程的学习、研究人员有必要熟悉一门面向对象程序语言。

摘要:本文软件从工程学习的角度,概括的阐述了面向对象软件设计的特点、步骤、原则等方面的内容。

关键词:面向对象,软件设计,OOD

参考文献

[1]史济民,等.软件工程原理、方法与应用[M].北京:高等教育出版社.

[2]任红卫.面向对象技术与软件复用技术的关系[J].电脑与信息,2008(5):77-78,81.

[3]任胜兰.面向对象的OOA、OOD软件开发技术分析[J].忻州师范学院学报,2009(10):39-42.

[4]陆惠恩.实用软件工程[M].北京:清华大学出版社,2006,5.

[5]张勇.ASP环境中面向对象技术的研究与应用[J].计算机与现代化,2008(6):113-115.

面向对象软件测试的方法分析 篇5

1 概述

1.1 基本概念及目的

软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现错误的过程。所以,软件测试的目标是以最少的时间和人力系统地找出软件中潜在的各种错误和缺陷。测试的附带收获是,它能够证明软件的功能和性能与需求说明相符合。此外,实施测试收集到的测试结果数据为可靠性分析提供了依据。测试不能表明软件中不存在错误,它只能说明软件中存在错误。

1.2 测试方法

软件测试方法分为两大类,即静态测试和动态测试。

(1)确认、验证和认证是静态测试中检验软件质量常用的方式。静态测试包括:审计、评审、静态分析、正确性证明及符号执行等。静态测试可以用于各种文档的测试。

(2)动态测试是通过程序运行检验软件的动态特性和运行结果。并根据程序运行过程对程序进行评价的过程。动态测试可以看成是一个发现错误的过程。

2 面向对象软件测试中的新问题

当前主流的面向对象开发方法有Booch法、OMT、UML等方法。面向对象程序的基本构造单元是类。所以,面向类的测试就成为测试面向对象软件的关键。

(1)系统基本的构造模块是封装了属性和方法的类和对象,它类似于传统的函数、过程或子程序。但类不能直接测试,测试类只能通过类的实例——对象进行。随之而来的问题是,对象无法实例化的抽象类如何测试。

(2)在面向对象程序中,对象之间以消息传递的方式进行通信,控制流的转移发生在多个不同对象之间。因此,一个类的内部没有顺序的控制流。

(3)对于常规的过程来讲,仅靠传给过程的参数和全局变量决定着过程内部的执行路径。而面向对象程序中,类中方法的执行路径除此以外还取决于对象的状态,类中的方法通过对象的状态进行交互。因此,对对象状态转移的测试是测试类的一个重要内容。

(4)继承是面向对象系统的主要特征,在一定程度上实现了软件代码的重用,使得多个类能够共享相同的属性和方法。但继承性也引入了一系列的问题。在允许多重继承的语言里,类继承结构更加复杂,因而易于导致编码出错。

(5)多态性和动态连接显著地增加了系统运动中的不确定性,以及可能的执行路径,为静态分析方法及测试覆盖率的满足带来了困难。

3 面向对象软件测试的策略及技术

3.1 软件测试的层次划分

软件测试层次是基于测试复杂性分解的思想,是软件测试的一种基本模式。面向对象程序的结构不再是传统的功能模块结构,原有集成测试所要求的逐步将开发的模块组装在一起进行测试的方法己不可能实现。而且,面向对象软件抛弃了传统的开发模式,对每个开发阶段都有不同以往的要求和结果,已不可能用功能细化的观点来检测面向对象分析和设计的结果。根据测试层次结构,面向对象软件测试总体上呈现从单元级、集成级到系统级的分层测试结构。测试集成的过程是基于可靠部件组装系统的过程。针对面向对象软件的开发特点,面向对象软件测试的层次划分如下:

(1)方法测试;(2)类测试;(3)类簇测试(集成测试);(4)系统测试。

3.2 软件测试用例设计

传统软件测试用例设计是从软件的各个模块的算法细节得出的,而面向对象的软件测试用例则着眼于适当的操作序列,以实现对类的说明。

黑盒子测试不仅适用于传统软件,也适用面向对象的软件测试。白盒子测试也可用于面向对象软件类的操作定义。但面向对象的软件中许多类的操作结构简明,所以有人认为在类层上测试可能要比传统软件中的白盒子测试更为方便。

(1)基于故障的测试

由于系统必须满足用户的需求。因此,基于故障的测试要从分析模型开始,考察可能发生的故障。为了确定这些故障是否存在,可设计用例去执行设计或代码。

基于故障测试的关键取决于测试设计者如何理解“可能的错误”。基于故障测试也可以用于集成测试,集成测试可以发现消息联系中“可能的故障”。“可能的故障”一般为意料之外的结果,错误地操作、消息、不正确引用等。为了确定由操作(功能)引起的可能故障必须检查操作的行为。这种方法除用于操作测试外,还可用于属性测试,确定其对于不同类型对象行为是否赋予了正确的属性值。

(2)基于脚本的测试

基于脚本的测试主要关注用户需要做什么,即从用户任务(使用用例)中找出用户要做什么及去执行。这种基于脚本的测试有助于在一个单元测试情况下检查多重系统。所以基于脚本用例测试比基于故障测试更实际(接近用户)更复杂。

3.3 类层次的分割测试

这种测试可以减少用完全相同的方式检查类测试用例的数目。这很像传统软件测试中的等价类划分测试。分割测试可分为:基于状态的分割,按类操作是否改变类的状态来分割(归类);基于属性的分割,按类操作所用到的属性来分割(归类);基于类型的分割,按完成的功能分割(归类)。

4 结束语

与传统软件测试相比,面向对象软件测试的策略和技术有很大不同。测试的视角扩大到包括复审分析和设计模型;测试的焦点从模块转向了类;并将对类层的测试作为基本的单元测试。面向对象软件测试技术还没有真正完全成熟,有待在今后的工作实践中进一步深入研究。

参考文献

[1]Roger S.Pressman著.软件工程—实践者的研究方法[M].袁柏素,梅宏译.北京:机械工业出版社,1999-10.

[2]罗国庆.实用软件测试方法与应用[M].北京:电子工业出版社,2003.

面向对象软件测试技术的研究 篇6

软件测试是软件开发过程中一个重要的组成部分, 它贯穿于软件开发的整个生命周期, 是保证软件正确性和提高软件可靠性的最基本和最重要的手段。1975年, Good Enough等首次提出了软件测试理论, 同年Huang全面讨论了测试过程和测试准则。1982年在美国北卡罗来纳大学召开了第一次软件测试的技术会议, 此后, 软件测试理论迅速发展, 并相应出现了各种测试方法。

什么是软件测试?1983年IEEE定义为:使用人工或自动手段来运行或测定某个系统的过程, 其目的在于检验它是否满足规定的需求或是弄清预期结果与实际结果之间的差别。传统的面向过程的软件测试已相当成熟。面向对象开发技术新增了封装、继承、多态和动态绑定等特性, 虽然优化了软件程序, 但也影响了软件测试的方法和内容, 出现了传统软件设计所不存在的错误, 或者使传统软件测试中的重点不再突出, 或者使原来测试经验认为和实践证明的次要方面成为了主要问题。因此, 需要深入研究面向对象软件的测试技术。

2. 面向对象测试与传统测试技术的区别

面向对象软件与传统软件的测试目标完全相同, 都是为了确保软件能够正确的执行预定功能, 测试过程基本都包括了测试计划、测试用例设计、测试运行、测试结果分析。传统测试采用的是过程性的测试方法, 程序单元即为功能单元, 系统由一系列相关联的功能单元构成, 程序之间的关系是调用关系。而面向对象的系统则由一些相互关联的对象构成, 对象由数据和操作组成, 对象之间靠消息传递信息, 虽然系统由对象构成, 但在程序中的基本单元却是“类”, 它是对象的抽象描述, 对象是类的实例, 同时类还具有封装、继承和多态等特性。类是对象经过抽象后的产物, 不能直接运行, 需要实例化类, 实例化后形成的对象又具有不同的状态, 这是类与传统的功能模块之间的截然不同之处, 这样, 程序结构和实现机制的差别直接造成了测试方法的差异。在传统的软件测试中, 测试过程要求与应用环境尽量相结合, 结合得越紧密, 其测试的结果越可靠。但在面对对象的软件测试中, 类是一个可以应用于不同软件中的独立部件, 其复用的程度高, 对类的测试要求尽量与具体应用环境相独立, 越独立其测试的结果越可靠。面向对象的测试与传统测试的差异主要由于程序实现机制的不同造成, “类”是面向对象程序的主要机制, 解决了类的测试问题也就解决面向对象测试中的关键问题, 类测试将是整个测试过程的主要方面, 它与传统的测试模型可用图1和图2表示。

3. 面向对象软件测试模型

面向对象的开发模型突破了传统的瀑布模型, 将开发分为面向对象分析 (OOA) 、面向对象设计 (OOD) 和面向对象编程 (OOP) 三个阶段。分析阶段产生整个问题空间的抽象描述, 在此基础上, 进一步归纳出适用于面向对象编程语言的类结构, 最后形成代码。由于面向对象的特点, 采用这种开发模型能有效地将分析设计的文本或图表代码化, 不断适应用户需求的变动。针对这种模型, 结合传统的测试方法, 可以建立一种整个软件开发过程中不断进行测试的面向对象软件模型, 使开发阶段的测试与编码完成后的单元测试、集成测试、系统测试成为一个整体。测试模型如图3所示。

OOA Test和OOD Test是分析结果和设计结果的测试, 主要是采用正式的技术复审对分析设计产生的文本进行正确性验证, 是软件开发前期的关键性测试。OOP Test主要针对编程风格和程序代码实现进行测试, 其主要的测试内容体现在两方面, 一是数据是否满足数据封装的要求, 二是类是否实现了系统分配的所有功能。面向对象的单元测试是对程序内部具体单一的功能模块的测试, 主要就是对基础类的测试。面向对象的单元测试是进行面向对象集成测试的基础。面向对象集成测试的重点是类之间的逻辑关系, 不仅要基于面向对象单元测试, 更要参见OOD或OOD Test结果。面向对象系统测试是最后阶段的测试, 主要以用户需求为测试标准, 借鉴OOA或OOA Test结果, 对系统的有效性进行测试。

4. 测试方法与解决方案

在面向对象系统中, 类是基本的构造模块, 是最小的可测试单元。系统从宏观上看, 是各个类之间的相互作用, 已经有经验表明类级测试是必须的, 是发现错误的重要手段, 因此, 本文提出的测试策略是:将类层的测试作为单元测试, 类集成的类簇测试作为集成测试, 系统级测试与传统测试层基本相同。

4.1 类测试 (单元测试)

类包含一组不同的操作, 并且某特殊操作可能作为一组不同类的一部分存在。同时, 一个对象有它自己的状态和依赖于状态的行为, 对象操作既与对象的状态有关, 也可能改变对象的状态。因此, 类测试时不能孤立地测试单个操作, 要将操作作为类的一部分, 同时要把对象与其状态结合起来, 进行对象状态行为的测试。类测试可以分为基于服务的测试、基于状态的测试、基于响应状态的测试三个部分, 如图4所示。

(1) 基于服务的类测试

基于服务的类测试主要考察封装在类中的一个方法对数据进行的操作。Kung等人提出的块分支图 (简称BBD) 是一种比较好的类的服务的测试模型。

如图5所示, 服务f的BBD是一个五元组。BBD f= (Du, Dd, P, Fe, G) , 其中:Du={di│di是f引用的全局数据或类数据};

Dd={di│di是f修改了的全局数据或类数据};

P={X1θ1, X2θ2, …, X nθn;Xn+1θn+1是f的参数表和函数返回值, θi为↓ (表示输入) 、↑ (表示输出) , 或↓ (表示输入/输出) ;若X n+1缺省, 则无返回值};

Fe={fi│fi是被f调用的其它服务};

G是一个有向图, 叫做块体, 它是按照控制流图的思想修改f的程序流程图而来的, 表示f的控制结构。F中的复合条件判断被分解, 每个判断框只有单个条件。

BBD通常有两种获取途径。一是采用逆向工程的方法根据源程序画出流程图, 然后构造出BBD。但这并不是最好的方法, 当源程序不正确时构造出来的BBD是错误的。另一种途径是在软件的分析设计阶段根据测试的需要构造出相应的BBD, 这样能从根本上解决问题, 正确指导类的服务的测试。

借用BBD, 可对服务进行结构测试和功能测试。

结构测试:主要进行基本路径测试, 根据软件过程性描述 (详细设计或代码) 中的控制流程确定复杂性度量, 再用此度量定义基本路径集合, 由此导出一组测试用例, 它们能保证在测试中, 程序的每一个可执行语句至少执行一次。

功能测试:等价类划分和边界值分析是两种被实践证实了的很有效的功能测试方法, 但这两种方法都只对数据集中的孤立数据进行测试, 一种可行的办法是以判定表和判定树为工具, 列出输入数据的各种组成情况和程序相应的动作以及可能的输出结果之间的对应关系, 为判定的每一列至少设计一个测试用例。

(2) 基于状态的类测试

基于状态的测试是检查对象的状态在执行某个方法后是否会达到预期的一种测试技术, 是通过测试对象的动态行为检测错误的测试方法。对象状态的变化是通过对象的数据成员值体现出来的, 实现对象数据成员值的跟踪监视, 即完成了对象状态的检测。要检测对象多个数据成员的状态需要对对象的状态空间进行划分, 并在对象的数据成员的取值域中找到特殊值和一般性区间, 分别对其进行测试。测试时, 首先要对受测试的类进行扩充定义, 增加一些用于设置和检查对象状态的方法, 另一项重要工作是编写主控的测试驱动程序。

(3) 基于响应状态的测试

从类和对象的责任出发, 以外界向对象发送特定的消息序列来测试对象的各个响应状态。较有影响的是基于规约的测试方法和基于程序的测试。基于规约的测试往往可以根据规约自动或半自动地生成测试用例, 但未必能提供足够的代码覆盖率。基于程序的测试大都是在传统的基于程序的测试技术的推广, 有一定的实用性, 但方法过于复杂且效率不高。

4.2 面向对象的集成测试 (类簇测试)

面向对象程序相互调用的功能散布在程序不同的类中, 类通过消息相互作用申请和提供服务, 类相互依赖极其紧密, 根本无法在编译时进行测试, 所以, 面向对象的集成测试通常需要在整个程序编译完成后进行。

在面向对象系统中, 集成测试属于应用生命周期的一个阶段, 可在两个层次上进行。第一层是对一个新类进行测试, 以及测试在定义中所涉及的那些类的集成。首先测试基础类, 然后使用这些类的类接着测试, 再按层次继续测试, 每一层次都使用了以前已定义和测试过的类作为部件块。测试重点是模块之间的协调性, 尤其是那些从没有在一起的类之间的协调性。集成测试的第二层是将各部分集成在一起组成整个系统进行测试。这种测试所选择的测试用例应当瞄准待开发软件的目标而设计, 并且应当给出预期的结果, 以确定软件的开发是否与目标相吻合。

4.3 面向对象的系统测试

通过类测试、集成测试等测试, 仅能保证软件开发的功能得以实现, 不能确认在实际运行时, 软件是否满足用户的需要、是否存在实际使用环境下会被诱发产生错误的隐患, 这就需要测试它与系统其他部分配套运行的表现。系统测试是对所有类和主程序构成的整个系统进行整体测试, 以验证软件的正确性和性能指标等满足规格说明书和任务书所指定的要求, 所以, 系统测试不仅是检测软件的整体行为表现, 也是对软件开发设计的再确认。系统测试需要对被测试的软件结合需求分析做仔细的测试分析, 建立测试用例。测试内容包括: (1) 功能测试:测试软件是否满足开发要求、是否能够提供设计所描述的功能、能否达到用户需求; (2) 强度测试:测试系统的最高能力限度, 即在一些超负荷的情况下, 软件功能实现情况; (3) 性能测试:测试软件的运行性能, 这种测试需要事先对被测试软件提出一系列具体的性能指标, 常常与强度测试结合进行; (4) 安全保密测试:主要验证安装在系统内的保护机构确实能够对其进行保护, 通过测试用例检验系统是否有安全保密的漏洞; (5) 恢复测试:通过人工干扰使软件出错, 使用中断, 检验系统的恢复能力; (6) 可用性测试:主要侧试用户使用的满意程度, 比如操作是否简捷、方便, 界面是否友好等; (7) 安装/卸载测试等等。

5. 结束语

和传统软件测试相比, 面向对象软件测试的策略和技术有很大不同, 测试的视角扩大到包括复审分析和设计模型, 测试的焦点从功能模块转向了对象类。目前, 面向对象软件系统的开发已逐步形成了自己的方法学, 但对于面向对象软件测试, 还没有普遍接受的充分性准则, 还没有真正完全成熟。

参考文献

[1]赵荣利, 崔志明, 陈建民.面向对象软件测试技术的研究与应用;计算机技术与发展, 2007 (17) .

[2]Grady Booch;面向对象分析与设计;冯博琴, 冯岚译;北京:机械工业出版社, 2003.

[3]郭海燕.面向对象的软件类测试技术的研究;电脑知识与技术;2009 (16) .

[4]朱少民;软件测试方法和技术;北京:清华大学出版社, 2005.

面向对象技术与软件复用技术的关系 篇7

近年来,随着软件规模日益增大,控制软件开发的费用,提高软件开发的效率,改进软件开发的质量,成为一个主要问题。软件复用是软件开发中避免重复劳动,提高软件生产效率和质量的现实可行的途径。因此越来越受到人们的关注。软件构件技术是支持软件复用的核心技术,随着对软件复用理解的深入,构件的概念已不再局限于代码构件,而是延伸到需求。近几年来,软件构件技术得到迅速发展,成为受到高度重视的一个学科分支。面向对象技术的出现并逐渐成为主流技术,为软件复用技术提供了新的技术支持。不仅其概念及原则与软件复用身份吻合,而且其开发方法也适用于软件复用。面向对象技术的出现,为软件复用提供了更加广阔的前景。

2. 面向对象技术

面向对象的技术强调直接以问题域中的事物为中心来思考问题、认识问题,并根据这些事物的本质特征,把他们抽象的表示为系统中的对象作为系统的基本构成单位。这可使系统直接的映射问题域,保持问题域中事物及其相互关系的本来面目。

面向对象的设计方法与传统的面向数据/过程的方法不同。它着重通过比较发现对象间的相似性,即对象间的共同属性,并以此为基础构造对象类型。这些对象类型按“类”,“子类”和“父类”的概念构成层次关系。下一层对象类型继承上一层对象类型的属性。一个类型的各个对象,可以定义一组“方法”来说明该类型对象的功能。对象间可建立“联系”和传递“消息”[1]。消息就是通知一个对象去完成这个对象类型中已定义过的操作。该对象完成的这个操作的细节,则封装在这个对象类型的定义中,对外界是隐蔽的。

利用面向对象技术,可以更加方便有效的实现软件复用的原因是面向对象中的类是比较理想的可重用软构件,也可以称为类构件,它具有模块独立性强、高度可塑性和接口清晰、简明、可靠等特点,此外类构件提供了实例重用、继承重用和多态重用三种方式。面向对象方法逐步形成从面向对象分析、面向对象设计、面向对象编程语言、面向对象实现这样一套完整的软件开发方法学。

3. 软件复用技术

90年代以后,人们渐渐将软件复用与面向对象技术结合起来。软件复用是指在两次或多次不同的软件开发过程中重复使用相同或相近软件元素的过程。软件复用是在软件开发中避免重复劳动的解决方案,其出发点是应用系统的开发不再采用一切“从零开始”的模式,而是采用过去应用系统开发中积累的知识和经验,从而将开发的重点集中于应用的特有构成部分[2]。

目前实现软件复用的关键技术包括:软件构件技术、领域工程、软件构架、软件再工程、开放系统技术、软件过程、CASE技术和非技术因素。实现软件复用的各种技术因素和非技术因素是互相联系、互相影响的。其中软件构件技术是软件复用技术的核心技术。

利用软件复用进行软件开发有很多优势。诸如提高了软件开发生产率、提高了质量、提高了可维护性,并且支持原型开发,对软件人员的要求降低了,软件开发成本降低了。从而避免了重复劳动,节约了社会财富。

尽管这样,软件复用技术在整体上对软件产业的影响并不尽人意。这是因为由于技术方面和非技术方面的种种因素造成的,其中技术上的不成熟是一个主要原因。许多工作都是相同或类似的问题的一个不同的变形,它们既不是完全相同,也不是完全不同,若想编一个通用模块实现这些不同的类型,也有很大的困难。虽然是一个问题的不同变型,但可复变信息是非常多的,实现通用处理模块的第一个难题就是要找到各个不同的变型之间实现上的共性。由于这些技术问题,使得软件复用并不普遍。

近几十年来,面向对象技术出现并逐渐成为主流技术,为软件复用提供了基本的技术支持。面向对象技术是最有前途的软件开发方法之一,它着重于对象,并且也是缩小问题域和解题域之间距离的一种有效方法。同时,在某种程度上也体现了软件复用。

4. 面向对象技术与软件复用的关系

4.1 面向对象技术对软件复用的支持

面向对象方法对软件复用技术提供了良好的支持。面向对象方法支持软件复用的固有特征从软件生命周期的前期阶段开始就发挥作用,从而使面向对象方法对软件复用的支持达到了较高的级别[3]。面向对象方法不但能在各个级别支持软件复用,而且能对各个级别的复用形成统一的、高效的支持,达到良好的全局效果。面向对象对软件复用技术提供了概念上的支持和OOA方法上的支持。其中在概念上的支持主要有:

1)对象与类

面向对象技术中,对象是开发模式的基本成分,是独立的活性单元。对象是可复用构件的雏形。对象是部件化了的软件单元,具有通用性。对象(解空间)是对实体(问题空间)的模拟,缩短了问题空间中的问题与解空间中的软件实体之间的距离。在问题空间中具有共性的实体,其共性能够在与之对应的软件模块之间反映出来,从而得到共享(重用)。类是具有一组相同数据结构和相同操作的对象的集合。它们都是系统构成的基本单位,因此,可用于表示一个相对独立的问题,且对问题描述相对完整,符合构件的独立性与完整性要求。

2)封装性

将属性与服务封装为一个独立的实体,隐藏了数据的实现,数据不能被外部随意改变,而只能通过对象间消息传递来相互影响,从而保证了对象与对象类可作为独立性很强的模块,为大型软件提供可靠的软件集成的单元模块,因此也符合构件的独立性与完整性要求。

3)抽象性

具有用户定义的复杂的数据类型功能,使它能表示一些复杂工程领域的问题,它描述了事物的共性,体现了构件设计的一般性原则。

4)继承性

类的层次通过继承实现,特殊类继承一般类,即一般类的属性和服务可被特殊类所复用。提供了一种代码共享的手段,可以避免重复代码的设计,同时,可以通过继承机制不断扩充功能。因此信息及代码的复用可被方便的实现。

5)多态性

使得消息可根据所发送的对象类选择不同的服务。许多服务可以不加修改地被复用于不同的对象。

6)面向对象技术中的重载、虚函数和动态联编等特性,增强软件开发过程的灵活性和复用性。

OO方法上的支持主要有:1)OOA模型,它反映系统重要或细节信息,因而模型更容易被抽象为一个可复用的系统构架,从而应用于不同的实现系统内。2)在OOD中考虑与实现有关的细节,从而使得其与OOA相互独立,OOA的结果不依赖于具体的设计与实现,从而使分析结果可以在问题域及系统责任相同而实现条件互异的多个系统中复用。3)一般——特殊结构表示允许将可复用构件作为一般类通过继承类产生特殊类;还可通过多态性的表示,使一个相似的类被应用与其它不同的系统之中。

面向对象技术的这些特性,使其很容易与软件复用技术相结合,面向对象技术中类的聚集、实例对类的成员函数或操作的引用、子类对父类的继承等使软件的可复用性有了较大的提高,而且这种类型的复用容易实现,所以这种方式的软件复用发展较快,并且能够使软件开发过程向缩短软件开发周期、降低生产成本和提高软件质量的方向发展。

4.2 复用技术对面向对象的方法的支持

面向对象的软件开发和软件复用之间的关系是相辅相成的。一方面,OO方法的基本概念、原则与技术提供了实现软件复用的有利条件;另一方面,软件复用技术也对面向对象的软件开发提供了有力的支持,如在类库、构件库、构架库等方面。在面向对象的软件开发中,类库是实现对象类复用的基本条件,有力的支持了源程序级的软件复用,但要在更高的级别上实现软件复用,仅有编程类库是不够的。必须有分析类库和设计类库的支持。类库可以看作一种特殊的可复用构件库,但类库只能存储和管理一类为单位的可复用构件,不能保存其他形式的构件;但可以更多的保持类构件之间的结构与连接关系。构件库中的可复用构件,可以是类,也可以使其他系统单位。如果在某个应用领域中已经运用OOA技术建立过一个或几个系统的OOA模型,则每个OOA模型都应该保存起来,为该领域新系统的开发提供参考。当一个领域已有多个OOA模型时,可以通过进一步抽象而产生一个可复用的软件构架。

4.3 采用构件编程的优势

面向对象方法是一种基于抽象数据类型的方法,相对来说,采用构件编程有更大的优势。

1)面向对象编程的重用属于白盒复用[4],即是源代码的复用,而构件复用可以是黑盒复用,使用者可以不对它进行继承、重载等操作而直接使用。

2)面向对象编程的复用要受到其开发环境的制约,如用C++产生的类很难在以Object Pascal为开发语言的项目中复用,而构件复用则不然。

3)面向对象编程的复用是基于源代码级的,而很多程序员出于技术保密,不会公开其源代码,这样研究成果的复用范围很小。采用构件就不一样了,因为构件是一段二进制码,其内部具体实现是无法看到的,可以将成熟的构件当作商品出售,更有效的重用他人已有的劳动成果。

将面向对象技术与软件复用相结合是相辅相成的、有效的。其主要目的之一在于缩短问题空间中的问题与解空间中的软件实体之间的距离,也就是尽量使问题空间中的问题描述与解空间中的软件描述一致起来。在问题空间中具有共性的实体,其共性能够在与之对应的软件模块之间反映出来,从而得到共享(复用)。由于这种关系,使得无论是在问题空间中还是在解空间中寻找具有共性的东西就变得容易了。其次,类与类之间的继承减少冗余,达到了复用的目的。

5. 结束语

面向对象思想与技术的成熟,是以软件复用为其主要目的,通过对系统进行面向对象的分析,设计并用面向对象的语言实现生产出来的软件系统是可以复用的。面向对象的技术和软件复用技术相结合,是一种提高软件开发效率、缩短软件开发周期和提高软件质量的有效途径。

参考文献

[1]Ronald J.Norman.面向对象系统分析与设计[M].周之英,肖奔放,柴洪钧译.北京:清华大学出版社,2000.

[2]唐勇,陈晶,李秀龙.软件复用与面向对象技术的研究[J].河北省科学院学报,2001,18(3):163-166.

[3]郝振明.基于面向对象方法的软件复用研究[J].现代计算机,2000,7(95):24-26.

面向对象的软件测试方法研究 篇8

软件测试是随着软件工程学科的诞生而诞生,也随着软件工程学科的发展而发展。软件测试是软件工程的重要组成部份,是软件质量保证的重要前提。软件测试费用一般占软件开发总费用的40%以上,由此可见,软件测试在软件开发过程中起非常重要的作用,它不仅体现软件开发过程中的一个阶段,而且是贯穿软件生命周期过程。

目前,面向对象技术是一种全新的软件开发技术,正逐渐代替被广泛使用的面向过程开发方法,被看成是解决软件危机的新兴技术。面向对象技术产生更好的系统结构,更规范的编程风格,极大地优化了数据使用的安全性,提高了程序代码的重用。面向对象的测试技术主要也是继承了面向过程的软件测试技术,但其技术作了适当的改变。本文将结合面向对象技术的特点,分析面向对象软件测试的方法及过程。

1 面向对象的软件测试方法及过程

1.1 面向对象的软件系统的特征

传统的面向过程分析是一个功能分解的过程,是把一个系统看成可以分解的功能的集合。这种传统的功能分解分析法的着眼点在于一个系统需要什么样的信息处理方法和过程,以过程的抽象来对待系统的需要。而面向对象分析是把信息造型中的概念,与面向对象程序设计语言中的重要概念结合在一起而形成的分析方法,最后通常是得到问题空间的图表的形式描述。因此,面向对象的软件系统开发技术与面向过程的软件开发技术在技术方法上有许多差异, 主要表现在以下几个方面:

(1)对象作为一个单独的组件(软件功能单元)一般要比一个软件功能模块大(即对象是大粒度的软件功能模块)。

(2)由对象到子系统的集成通常是松散耦合的,系统中没有一个明显的”顶层”,而且对象间数据接口明显少于软件模块间接口。

(3)如果对象被复用,测试者就无法进入组件内部分析其代码,由于面向对象软件开发过程中会用到大量的中间件或插件,而这些中间件或插件是不需要测试的。

1.2 根据面向对象的特点,面向对象的软件测试可分三个层阶段

(1)测试单个对象类

测试单个对象类相当于传统的单元测试,传统的单元测试是针对程序的函数、过程或完成某一定功能的程序块。沿用单元测试的概念,实际测试类成员函数。一些传统的测试方法在面向对象的单元测试中都可以使用。只不过单元概念发生了变化,是封装的类或对象作为最小的可测试单位。一般可用白盒法的覆盖测试方法,保证所有程序中的语句至少执行一遍。单个类的测试一般建议由程序员完成。

对象的覆盖测试应包括:对象中所有操作被单独隔离测试、对象所有属性的设置和访问的测试、对象的所有可能状态的测试。尽量做到所有能引起状态改变的事件都要模拟到。

单个类的测试方法可分为:随机测试、划分测试、基于状态的测试和基于故障的测试。随机测试是依据对象类的功能随机输入数据来进行的测试,一般用于类设计过程中的调试。划分测试与测试传统软件时采用的等价类划分方法类似,但划分原则有所不同,常见的划分类别有:基于状态的划分、基于属性的划分、基于功能的划分。基于状态的划分是根据类操作改变类状态的能力来划分类操作;基于属性的划分是根据类操作使用的属性来划分类操作;基于功能的划分是根据类操作所完成的功能来划分类操作。基于状态的测试是测试对象类的状态转换过程;基于故障的测试与测试面向过程的软件时采用的错误推测法类似。

(2)面向对象集成测试

面向对象的集成测试也叫测试对象集群。面向对象的软件由于没有层次的控制结构,传统的自顶向下和自底向上的集成策略变成没有意义。面向对象软件的集成测试三种集成策略:基于使用的测试(基于用例或场景的测试)、基于线程的测试、基于对象的交互测试。基于线程的测试集成响应系统的一个输入或事件所需的一组类,每个线程被个体地集成和测试,通过回归测试保证没有副作用产生。

面向对象的集成测试能够检测出相对独立的单元测试无法检测出的那些类相互作用时才会产生的错误。基于单元测试对成员函数行为正确性的保证,集成测试只关注于系统的结构和内部的相互作用。面向对象的集成测试可以分成两步进行:先进行静态测试,再进行动态测试。

静态测试主要针对程序的结构进行,检测程序结构是否符合设计要求。动态测试设计测试用例时,通常功能调用结构图、类关系图或者实体关系图为参考,确定不需要被重复测试的部分,从而优化测试用例,减少测试工作量,使得进行的测试能够达到一定覆盖标准。

值得注意的是:设计测试用例时,不但要设计确认类功能满足的输入,还应该有意识地设计一些被禁止的例子,确认类是否有不合法的行为产生,如发送与类状态不相适应的消息,要求不相适应的服务等。根据具体情况,动态的集成测试,有时也可以通过系统测试完成。

(3)面向对象系统测试

通过单元测试和集成测试,仅能保证软件开发的功能得以实现。但不能确认在实际运行时,它是否满足用户的需要,是否大量存在实际使用条件下会被诱发产生错误的隐患。为此,对完成开发的软件必须经过规范的系统测试。

它体现的具体测试内容包括:

功能测试:测试是否满足开发要求,是否能够提供设计所描述的功能,是否用户的需求都得到满足。功能测试是系统测试最常用和必须的测试,通常还会以正式的软件说明书为测试标准。

强度测试:测试系统的能力最高实际限度,即软件在一些超负荷的情况,功能实现情况。如要求软件某一行为的大量重复、输入大量的数据或大数值数据、对数据库大量复杂的查询等。

性能测试:测试软件的运行性能。这种测试常常与强度测试结合进行,需要事先对被测软件提出性能指标,如传输连接的最长时限、传输的错误率、计算的精度、记录的精度、响应的时限和恢复时限等。

安全测试:验证安装在系统内的保护机构确实能够对系统进行保护,使之不受各种非常的干扰。安全测试时需要设计一些测试用例试图突破系统的安全保密措施,检验系统是否有安全保密的漏洞。

恢复测试:采用人工的干扰使软件出错,中断使用,检测系统的恢复能力,特别是通讯系统。恢复测试时,应该参考性能测试的相关测试指标。

可用性测试:测试用户是否能够满意使用。具体体现为操作是否方便,用户界面是否友好等。

2 软件测试的评测

软件测试的评测是指软件测试质量的好坏,从某种意义上说也是软件质量的好坏。评测方法主要包括:测试覆盖法和错误植入法。

2.1 测试覆盖法

测试覆盖是对测试完全程度的评测,它建立在测试覆盖基础上,测试覆盖是由测试需求和测试用例的覆盖或已执行代码的覆盖表示的。

最常用的覆盖评测是基于需求的测试覆盖和基于代码的测试覆盖这两种。简而言之,测试覆盖是针对需求(基于需求的)或代码的设计/实施标准(基于代码的)而言的完全程度的任意评测。系统的测试活动建立在至少一个测试覆盖策略基础上。

如果需求已经完全分类,则基于需求的覆盖策略可能足以生成测试完全程度的可计量评测。如果应用基于代码的覆盖,则测试策略是根据测试已经执行的源代码的多少来表示的。这种测试覆盖策略类型对于安全性要求高的系统来说是非常重要。基于代码的测试覆盖评测测试过程中,已经执行的代码的多少,与之相对的是要执行的剩余代码的多少。代码覆盖可以建立在控制流(语句、分支或路径)或数据流的基础上。控制流覆盖的目的是测试代码行、分支条件、代码中的路径或软件控制流的其他元素。数据流覆盖的目的是通过软件操作测试数据状态是否有效。

2.2 错误植入法

错误植入法是指在软件测试前有意的在程序中一些位置插入错误,然后通过软件测试后,分析被植入的错误有多少被发现,有多少尚未发现,由此也可以推断软件的测试效果。在大多数情况下,一般的软件测试方法是比较难判定经过测试后,软件中还存余多少错误,而且覆盖评测的精确度也不是很高,所以有时也需采用错误植入模型来估算测试的效果。但必须注意的是要记录植入错误的位置,以便测试完毕后消除这些错误,以免出现不必要的错误。

3 结束语

软件测试的一项重要而且复杂的工作,它不仅要求软件测试人员掌握一定的软件测试方法,更需要软件测试人员针对不同特性的软件系统来分析、选择其测试策略和测试方法。所以软件测试应该说是建立在方法和经验之上的,这就需要软件测试人员在测试工作中,善于根据系统的特点来设计测试的方法。总之,能在测试中发现软件中尽可能多的错误的测试就是最好的测试方法。

参考文献

[1]蔡希尧,陈平.面向对象技术[M].西安电子科技大学出版社,1993(11).

[2][美]Shari Lawrence Pfleeger.软件工程理论与实践[M].清华大学出版社,2001.

浅谈面向对象的软件开发方法 篇9

关键词:面向对象,开发方法,OMT,UML

0 引言

面向对象软件开发方法正席卷整个软件领域。相比较传统的开发方法, 面向对象的软件方法采用了自底向上的归纳、自顶向下的分解的方法, 通过对对象模型的建立, 能够真正建立基于用户的需求, 而且系统的可维护性大大改善。它是归纳和演绎思想的综合体现, 对于软件设计起到了很好的作用。

1 传统开发方法存在的问题

传统开发方法存在以下方面的问题:

(1) 软件复用性差。软件复用性是软件工程追求的目标之一, 是节约人力和提高软件生产率的重要途径。结构化分析、设计和结构化程序开发虽然给软件产业带来了巨大进步, 但却没能很好地解决软件重用问题。

(2) 软件可维护性差。传统的开发方法注重完整、一致的文档组成最终的软件产品, 所以在整个软件开发的过程中, 非常注重软件的可读性、可修改性和可测试性, 成为衡量软件质量的重要指标。然而在实际的应用过程中发现, 其维护起来相当困难, 且成本相当高, 导致其可维护性差。

(3) 开发出的软件不能满足用户需要。如果用传统的结构化方法开发大型软件系统, 由于涉及很多领域的知识, 在开发的系统需求比较模糊或动态变化时, 开发效率会受到很多制约, 并且开发出的软件不能满足用户需要。

(4) 软件质量难以保证。用传统方法开发大型复杂软件系统, 或需求模糊、需求动态变化的系统时, 所开发出的软件系统往往不很成功。主要有以下两种表现:一是开发人员不能完全获得或不能彻底理解用户的需求, 往往导致开发出的软件和用户期待的不一样, 不能满足用户的需求;二是所开发出的系统不能适应用户需求的经常变化, 系统的稳定性和可扩充性不能适应变化。用户有时会在系统的一些功能方面提出一些要求, 所以, 如果系统的设计是基于过程的, 那么这种变化会造成系统结构的很大变化, 设计成本一定会大大提高。

2 面向对象 (OO) 方法

面向对象方法 (Object-Oriented Method) 简称OO方法, 是一种把面向对象的思想应用于软件开发过程中, 指导开发活动的系统方法。所谓面向对象就是基于对象概念, 以对象为中心, 以类和继承为构造机制, 来认识、理解、刻画客观世界和设计、构建相应的软件系统。

传统的软件开发方法被称为是面向过程和功能分解的软件开发方法, 这些方法在开发中小型软件时还得心应手, 但对大型软件却难于驾驭。而且传统的方法存在软件生产率低的问题, 面向对象方法的出现很好的弥补了这一缺陷, 它是建立在“对象”概念基础上的, 对象是由数据和容许的操作组成的封装体, 与客观实体有直接对应关系, 一个对象类定义了具有相似性质的一组对象。软件对象同现实中的“事物”有明确的对应关系, 使得软件的设计变的简单, 可以很容易把一个实际问题映射为软件对象。

面向对象OO (Object-Oriented) 软件开发过程一般分为三个阶段:第一是面向对象的分析 (OOA, Object Oriented Analysis) , 它的任务是了解问题域内所涉及的对象和对象间的关系, 建立模型。第二是进行面向对象的设计 (OOD, Object Oriented Design) , 它的任务是调整、完善和充实由OOA建立的模型。第三是面向对象的编程设计 (OOP, Object Oriented Programming) , 它的任务是用面向对象的语言实现。OO方法的发展过程本身是需求驱动的自底向上的发展过程, 即先有OOP的产生, 再在OOP的基础上进一步发展了OOD和OOA。由OOA、OOD、OOP构成的软件开发过程的OO方法覆盖了软件生命周期的分析、设计和实现等各个阶段, 成为指导软件开发的全面的、完整的方法。OOP是软件开发方法的一次革命, 它彻底改变了传统的功能分解。其最基本的概念是数据抽象、封闭性和继承性。OOD是根据OOA的结构, 对系统进一步细化。其基本步骤有设计问题域部分、设计人机交互部分、设计任务管理部分与设计数据管理部分。OOA基本思想是认识客观对象及其属性, 认识对象的整体及组成部分和对象类的形成及其区分, 主要特点是过程抽象、数据抽象以及信息隐蔽。

3 面向对象的软件开发方法

现阶段, 面向对象开发方法已经比较成熟, 主要开发方法有Booch方法、Coad方法、OMT方法、UML语言等。

Booch方法是最早描述面向对象的软件开发方法的基础问题的方法, 首先提出面向对象开发是区别与其他传统系统开发的一个方法。它最大的特色是能够反映出系统的各个方面是如何相互联系及相互作用的。其软件分解更接近人对客观事务的理解, Booch方法认为面向对象的开发是一个部分生命周期的方法, 不涉及面向对象分析, 只涉及面向对象的设计和实现, 所以它没有对每个阶段进行明确的区分, 工作主要集中在设计阶段。

Coad方法把系统的开发分为分析和设计两个阶段。其中分析阶段的OOA模型由类及对象层、结构层、主题层、属性层和服务层五个层次构成, 分别对应OOA的标识对象, 标识结构, 标识主题, 定义属性, 定义服务的五个活动。它的优点是具有一套系统的原则, 完成了从需求角度进一步进行类和类层次结构的认定。这种方法概念简单, 易于掌握, 但是对每个对象的功能和行为的描述不很全面, 对象模型的语义表达能力不是太强。

OMT方法 (Object Modeling Technique) 是随着OOP (面向对象编程) 向OOD (面向对象设计) 和OOA (面向对象分析) 的发展最终形成的面向对象的软件开发方法。OMT方法全面覆盖了软件开发的整个过程, 包括分析、设计和实现几个步骤。该方法开发工作的基础是对真实世界的对象建模, 围绕这些对象使用分析模型来进行独立于语言的设计, OMT分别建立三个模型:对象模型、动态模型和功能模型, 从不同的角度全面地反映系统的需求, 建模和设计有利于促进开发更为清晰、更容易维护的软件系统。这是一种自底向上和自顶向下相结合的方法, 以对象建模为基础, 既考虑了输入、输出数据结构, 也包含了所有对象的数据结构, 所以OMT彻底实现了PAM没有完全实现的目标。尽管OMT方法通过构造三个模型较全面地描述了系统的需求, 但其缺点是在功能模型中使用数据流图与其它两个模型有些脱节。

UML (Unified Modeling Language) 语言是面向对象技术领域内占主导地位的标准建模语言, UML统一了Booch、OMT和OOSE等方法中的基本概念, 同时还吸取了面向对象技术领域中其他流派的优秀思想, 其中也包括非OO方法的影响。UML能够用来描述其它的开发过程, 产生新的软件开发方法。它的目标就是以面向对象图的方式来描述任何类型的系统。总之UML是一个通用的标准建模语言, 适用于以面向对象技术来描述任何类型的系统, 而且适用于系统开发的不同阶段, 从需求规格描述直至系统完成后的测试和维护。

4 总结

面向对象这一概念来源于程序设计, 逐渐成为目前软件开发领域的主流, 并扩展到很宽的范围如数据库系统、交互式界面等领域。由于面向对象软件开发方法的诸多优点, 相信面向对象软件开发方法在未来会有更广阔的前景。

参考文献

[1]Mike O'Docherty, 俞志翔.面向对象分析与设计 (UML2.0版) [M].北京:清华大学出版社, 2006.

[2]明仲.结合UML和RAISE的软件开发方法研究[J].计算机工程, 2001 (4) .

上一篇:绘画写生采风下一篇:优质工程申报