第12章 面向对象实现_第1页
第12章 面向对象实现_第2页
第12章 面向对象实现_第3页
第12章 面向对象实现_第4页
第12章 面向对象实现_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

1、第第12章章 面向对象实现面向对象实现12.1 程序设计语言程序设计语言12.2 程序设计风格程序设计风格12.3 测试策略测试策略12.4 设计测试用例设计测试用例12.5 小结小结1n面向对象实现与面向过程的一样应包括:面向对象实现与面向过程的一样应包括:编码,测试。编码,测试。n面向对象的分析和设计共同的模型使它们难于分开。面向对象的分析和设计共同的模型使它们难于分开。n面向对象编程面向对象编程(OOP)需要需要OOP语言语言OOLnOOL具有自己的特点和风格。具有自己的特点和风格。n面向对象程序中的封装、继承和多态等机制,给测试面向对象程序中的封装、继承和多态等机制,给测试带来新特点,

2、增加了测试和调试的难度。带来新特点,增加了测试和调试的难度。23n面向对象的设计适宜用面向对象的设计适宜用OOL来实现,来实现, 理论上也理论上也可以用非可以用非OOL实现但不可取。实现但不可取。n若用非若用非OOL编写面向对象程序,则程序员必须自编写面向对象程序,则程序员必须自己实现己实现OOL编译程序自动提供的面向对象的概念编译程序自动提供的面向对象的概念和机制:类,继承,封装。和机制:类,继承,封装。若有可能,应选用若有可能,应选用OOL。12.1 程序设计语言程序设计语言 12.1.1 面向对象语言面向对象语言OOL的优点的优点41. 一致的表示方法一致的表示方法 面向对象开发基于不随

3、时间变化的、一致的表面向对象开发基于不随时间变化的、一致的表示方法示方法OOOO模型:模型:OOAOOA,OODOOD,OOPOOP。2. 可重用性可重用性软件开发组织可重用软件开发组织可重用OOA, OOD和和OOP结果。结果。3. 可维护性可维护性 保持文档与源程序一致的完全一致几乎不可能。保持文档与源程序一致的完全一致几乎不可能。OOLOOL的可读性的可读性( (对象名等对象名等) ) = =可维护性可维护性。5两大类面向对象语言两大类面向对象语言:u纯面向对象语言纯面向对象语言: Smalltalk和和Eiffel等等u混合型面向对象语言混合型面向对象语言: 过程语言过程语言+OO,如

4、,如C+n纯面向对象语言着重支持面向对象方法研究和快纯面向对象语言着重支持面向对象方法研究和快速原型的实现。速原型的实现。n混合型面向对象语言的目标则是提高运行速度和混合型面向对象语言的目标则是提高运行速度和使传统程序员容易接受面向对象思想。使传统程序员容易接受面向对象思想。比较面向对象语言比较面向对象语言/开发环境时需要考察的特点:开发环境时需要考察的特点:12.1.2 面向对象语言的技术特点面向对象语言的技术特点61. 支持类与对象概念的机制支持类与对象概念的机制:内存管理内存管理 允许用户动态创建对象意味着系统必须处理内允许用户动态创建对象意味着系统必须处理内存管理问题。存管理问题。 有

5、两种管理内存的方法有两种管理内存的方法: : 1) 1)语言的运行机制自动管理内存,即自动回收语言的运行机制自动管理内存,即自动回收“垃圾垃圾”的机制;的机制;( (必须采用先进的垃圾收集算法必须采用先进的垃圾收集算法) ) 2) 2)由程序员编写释放内存的代码。由程序员编写释放内存的代码。 ( (例如例如: : 程序员定义析构函数程序员定义析构函数(destructor)(destructor)。每当一个对象超出范围或被显式删除时,就自动调每当一个对象超出范围或被显式删除时,就自动调用析构函数。这种机制使得程序员能够方便地构造用析构函数。这种机制使得程序员能够方便地构造和唤醒释放内存的操作和

6、唤醒释放内存的操作) )72. 实现整体实现整体-部分部分(即聚集即聚集)结构的机制结构的机制两种实现关联方法两种实现关联方法: 指针和独立的关联对象指针和独立的关联对象 大多数现有的面向对象语言并不显式支持独立大多数现有的面向对象语言并不显式支持独立的关联对象,在这种情况下,使用指针是最容易的的关联对象,在这种情况下,使用指针是最容易的实现关联的方法。实现关联的方法。83. 实现一般实现一般-特殊特殊(即泛化即泛化)结构的机制结构的机制实现继承实现继承 + 解决名字冲突。解决名字冲突。 名字冲突指的是继承多个基类可能出现的重名名字冲突指的是继承多个基类可能出现的重名问题。问题。n某些语言拒绝

7、接受有名字冲突的程序,另一些语某些语言拒绝接受有名字冲突的程序,另一些语言提供了解决冲突的协议。言提供了解决冲突的协议。n程序员应该尽力避免出现名字冲突。程序员应该尽力避免出现名字冲突。94. 实现属性和服务的机制实现属性和服务的机制属性的机制:属性的机制: 支持实例连接;支持实例连接;属性的可见性控制;属性的可见性控制;对属性值的约束。对属性值的约束。服务的机制:服务的机制: 支持消息连接支持消息连接(即表达对象交互关系即表达对象交互关系) ;控制服务可见性;控制服务可见性;动态联编。动态联编。105. 类型检查类型检查强强/弱类型弱类型: 语法规定变量语法规定变量/属性分类的严格性。属性分

8、类的严格性。强类型优点:强类型优点: u一是在编译时能发现程序错误,一是在编译时能发现程序错误,u二是增加了优化的可能性。二是增加了优化的可能性。强类型有助于提高软件的可靠性和运行效率。强类型有助于提高软件的可靠性和运行效率。强类型宜用于开发软件产品,强类型宜用于开发软件产品,弱类型适于快速开发原型。弱类型适于快速开发原型。116. 类库类库n类库类库:编译编译/开发环境提供的重用类构件。开发环境提供的重用类构件。n类库包含实现通用数据结构类库包含实现通用数据结构(例如,动态数组、表、例如,动态数组、表、队列、栈、树等等队列、栈、树等等)的类,的类,GUI用户界面类。用户界面类。7. 效率效率

9、n面向对象语言的主要缺点是效率低:早期解释型面向对象语言的主要缺点是效率低:早期解释型语言语言, 动态联编。动态联编。n类库中提供的算法和数据结构更高效。类库中提供的算法和数据结构更高效。n与结构化语言的效率差别可以忽略,总体上利大与结构化语言的效率差别可以忽略,总体上利大于弊。于弊。128. 持久保存对象持久保存对象 不依赖于程序执行的生命期而长时间保存数据不依赖于程序执行的生命期而长时间保存数据对象的两个原因:对象的两个原因: (1) (1) 实现不同时运行程序间传递数据实现不同时运行程序间传递数据(2) (2) 恢复被中断了的程序的运行恢复被中断了的程序的运行 理想情况下,应该使程序设计

10、语言语法与对象理想情况下,应该使程序设计语言语法与对象存储管理语法实现无缝集成。存储管理语法实现无缝集成。139. 参数化类参数化类n类的数据类的数据(属性属性)类型可以由参数给定。类型可以由参数给定。n一个类可以对不同的数据类型施以同样的操作。一个类可以对不同的数据类型施以同样的操作。如对整数和实数排序。如对整数和实数排序。nEiffel 和和C+语言提供了参数化类语言提供了参数化类/类模板。类模板。10. 开发环境开发环境n软件工具或开发环境对软件生产率有很大影响。软件工具或开发环境对软件生产率有很大影响。n一个语言可有不同的编译程序。一个语言可有不同的编译程序。nCASE工具与语言的兼容

11、性。工具与语言的兼容性。14选择面向对象语言应考虑的因素选择面向对象语言应考虑的因素:1. 将来能否占主导地位将来能否占主导地位语言的生命力及稳定性:维护的考虑。语言的生命力及稳定性:维护的考虑。2. 可重用性可重用性影响重用的要素:封装、继承、多态。影响重用的要素:封装、继承、多态。3. 类库和开发环境类库和开发环境n语言、开发环境和类库这语言、开发环境和类库这3个因素共同决定可重用性。个因素共同决定可重用性。n类库是否提供有价值的类?类库是否提供有价值的类?n开发环境是否提供使用方便的类库编辑和浏览工具。开发环境是否提供使用方便的类库编辑和浏览工具。12.1.3 选择面向对象语言选择面向对

12、象语言154. 其他因素其他因素u在选择编程语言时,应该考虑的其他因素还有:在选择编程语言时,应该考虑的其他因素还有:对用户学习面向对象分析、设计和编码技术所能提对用户学习面向对象分析、设计和编码技术所能提供的培训服务;供的培训服务;u在使用这个面向对象语言期间能提供的技术支持;在使用这个面向对象语言期间能提供的技术支持;能提供给开发人员使用的开发工具、开发平台、发能提供给开发人员使用的开发工具、开发平台、发行平台;行平台;u对机器性能和内存的需求;对机器性能和内存的需求;u集成已有软件的容易程度集成已有软件的容易程度(调用其它语言的模块调用其它语言的模块)。16 为适应面向对象方法所特有的概

13、念为适应面向对象方法所特有的概念( (例如,继例如,继承性承性) )而必须遵循的一些新准则。而必须遵循的一些新准则。12.2 程序设计风格程序设计风格17 两种代码重用:两种代码重用: 1) 本项目内的代码重用本项目内的代码重用 2) 重用旧重用旧/外项目的代码。外项目的代码。内部重用内部重用:利用继承机制共享相同或相似的部分利用继承机制共享相同或相似的部分12.2.1 提高可重用性提高可重用性实现两类重用的程序设计准则:实现两类重用的程序设计准则:1. 提高方法的内聚提高方法的内聚一个方法一个方法(即服务即服务)只完成单个功能只完成单个功能, 否则把它分解否则把它分解成几个更小的方法。成几个

14、更小的方法。2. 减小方法的规模减小方法的规模把规模过大的方法把规模过大的方法(代码长度超过一页纸代码长度超过一页纸),分解成,分解成几个更小的方法。几个更小的方法。3. 保持方法的一致性保持方法的一致性功能相似的方法应该有一致的名字、参数特征功能相似的方法应该有一致的名字、参数特征(包包括参数个数、类型和次序括参数个数、类型和次序)、返回值类型、使用条、返回值类型、使用条件及出错条件等。件及出错条件等。184. 把策略与实现分开把策略与实现分开两种不同类型的方法:策略与实现。两种不同类型的方法:策略与实现。n策略方法策略方法(拼积木拼积木)调用实现方法调用实现方法(积木积木)来完成任务来完成

15、任务(实现图案实现图案)。n策略方法通常紧密依赖于具体应用。策略方法通常紧密依赖于具体应用。n实现方法针对具体数据完成特定处理,用于实现实现方法针对具体数据完成特定处理,用于实现复杂的算法。相对独立于应用,因此,较可能被重复杂的算法。相对独立于应用,因此,较可能被重用。用。这是软件具有柔性、可装配性的基础这是软件具有柔性、可装配性的基础195. 全面覆盖全面覆盖 方法的实现不仅满足当前应用而且应该考虑其方法的实现不仅满足当前应用而且应该考虑其它应用的潜在需要。它应用的潜在需要。 此外,方法对空值、极限值及界外值等异常情此外,方法对空值、极限值及界外值等异常情况也应该能够作出有意义的响应。况也应

16、该能够作出有意义的响应。6. 尽量不使用全局信息尽量不使用全局信息 应该尽量降低方法与外界的耦合程度,不使用应该尽量降低方法与外界的耦合程度,不使用全局信息,如类变量。全局信息,如类变量。207. 利用继承机制利用继承机制继承是实现共享和提高重用的主要途径。继承是实现共享和提高重用的主要途径。(1) 调用子过程:把公共的代码分离出来,构成一个调用子过程:把公共的代码分离出来,构成一个被其他方法调用的公用方法,被其他方法调用的公用方法, 并在基类中定义它。并在基类中定义它。(2) 分解因子。从不同类的相似方法中分解出不同的分解因子。从不同类的相似方法中分解出不同的“因子因子”(即不同的代码即不同

17、的代码),把余下的代码作为公用方,把余下的代码作为公用方法中的公共代码,把分解出的因子作为法中的公共代码,把分解出的因子作为名字相同名字相同(多多态性机制态性机制)算法不同的方法,放在不同类中定义,并算法不同的方法,放在不同类中定义,并被这个公用方法调用,如图所示。被这个公用方法调用,如图所示。21(3) 使用委托。仅当确实存在一般使用委托。仅当确实存在一般-特殊关系时,使特殊关系时,使用继承才是恰当的,否则,可以利用委托机制,如用继承才是恰当的,否则,可以利用委托机制,如本书本书11.11.3小节所述。小节所述。(4) 把代码封装在类中。把代码封装在类中。(与继承无关,典型用于封装(与继承无

18、关,典型用于封装其他软件包功能)其他软件包功能)把被重用的代码封装在类中比较安全和易于修改。把被重用的代码封装在类中比较安全和易于修改。22 提高可重用性的准则,也能提高程序的可扩充提高可重用性的准则,也能提高程序的可扩充性。此外,下列准则也有助于提高可扩充性:性。此外,下列准则也有助于提高可扩充性: 1. 1. 封装实现策略封装实现策略 把类的实现策略把类的实现策略( (包括描述属性的数据结构、包括描述属性的数据结构、修改属性的算法等修改属性的算法等) )封装起来,将提高今后修改数封装起来,将提高今后修改数据结构或算法的自由度。据结构或算法的自由度。12.2.2 提高可扩充性提高可扩充性23

19、2. 不要用一个方法遍历多条关联链不要用一个方法遍历多条关联链 一个方法应该只包含对象模型中的有限内容。一个方法应该只包含对象模型中的有限内容。否则将导致方法过分复杂,既不易理解,也不易修否则将导致方法过分复杂,既不易理解,也不易修改扩充。改扩充。3. 避免使用多分支语句避免使用多分支语句 可以利用可以利用DO_CASEDO_CASE语句测试对象的内部状态,语句测试对象的内部状态,而不要用来根据对象类型选择应有的行为而不要用来根据对象类型选择应有的行为( (强耦合强耦合) ),否则在增添新类时将不得不修改原有的代码。应该否则在增添新类时将不得不修改原有的代码。应该利用多态性机制,根据对象当前类

20、型,自动决定应利用多态性机制,根据对象当前类型,自动决定应有的行为。有的行为。244. 精心确定公有方法精心确定公有方法 公有方法是向公众公布的接口。对这类方法的公有方法是向公众公布的接口。对这类方法的修改往往会涉及许多其他类。为提高稳定性,可修修改往往会涉及许多其他类。为提高稳定性,可修改性,降低维护成本,必须精心选择和定义公有方改性,降低维护成本,必须精心选择和定义公有方法。法。 删除、增加或修改私有方法所涉及的面要窄得删除、增加或修改私有方法所涉及的面要窄得多,因此代价也比较低。多,因此代价也比较低。25 既应该考虑效率,也应该考虑健壮性。需要在既应该考虑效率,也应该考虑健壮性。需要在健

21、壮性与效率之间做出适当的折衷。健壮性与效率之间做出适当的折衷。 为提高健壮性应该遵守以下几条准则:为提高健壮性应该遵守以下几条准则:1. 1. 预防用户的操作错误预防用户的操作错误 软件系统必须具有处理用户操作错误的能力。软件系统必须具有处理用户操作错误的能力。任何一个接收用户输入数据的方法,对其接收到的任何一个接收用户输入数据的方法,对其接收到的数据都必须进行检查,发现了错误,应该给出恰当数据都必须进行检查,发现了错误,应该给出恰当的提示信息,并准备再次接收用户的输入。的提示信息,并准备再次接收用户的输入。12.2.3 提高健壮性提高健壮性262. 2. 检查参数的合法性检查参数的合法性 对

22、公有方法,尤其应该着重检查其参数的合法对公有方法,尤其应该着重检查其参数的合法性,因为调用公有方法时可能违反参数的约束条件。性,因为调用公有方法时可能违反参数的约束条件。3. 3. 不要轻易限定数据容量不要轻易限定数据容量 在设计阶段,很难准确地预测出应用系统中数在设计阶段,很难准确地预测出应用系统中数据结构的最大容量需求。如果有必要和可能,应该据结构的最大容量需求。如果有必要和可能,应该使用动态内存分配机制。使用动态内存分配机制。274. 4. 先测试后优化先测试后优化 测试程序的性能以确定是否为提高效率而进行测试程序的性能以确定是否为提高效率而进行优化。优化。 如果实现某个操作的算法有许多

23、种,则应该综如果实现某个操作的算法有许多种,则应该综合考虑内存需求、速度及实现的简易程度等因素,合考虑内存需求、速度及实现的简易程度等因素,经合理折衷选定适当的算法。经合理折衷选定适当的算法。28 测试面向对象软件的策略与与面向过程的策略测试面向对象软件的策略与与面向过程的策略基本相同,但也有许多新特点。基本相同,但也有许多新特点。12.3 测试策略测试策略29n最小的可测试单元是单个封装起来的类和对象最小的可测试单元是单个封装起来的类和对象n测试一个类就是测试它的对象子集测试一个类就是测试它的对象子集(不可穷尽不可穷尽)n测试对象主要是测试它的操作测试对象主要是测试它的操作n不能孤立地测试单

24、个操作不能孤立地测试单个操作同一个操作在不同状态下行为不同同一个操作在不同状态下行为不同同一个操作在不同类中有不同的实现同一个操作在不同类中有不同的实现(多态性多态性)有必要在每个子类的语境中测试操作有必要在每个子类的语境中测试操作比面向过程更复杂比面向过程更复杂12.3.1 面向对象的单元测试面向对象的单元测试30集成集成=组装有关联的类组装有关联的类不存在层次的控制结构不存在层次的控制结构(隐含在类中隐含在类中)传统的自顶向下传统的自顶向下/自底向上的集成策略无意义。自底向上的集成策略无意义。12.3.2 面向对象的集成测试面向对象的集成测试31面向对象软件的集成测试的两种策略面向对象软件

25、的集成测试的两种策略:(1) 基于线程的测试基于线程的测试(thread based testing): 把把响应系统的一个输入或一个事件所需要的那些类响应系统的一个输入或一个事件所需要的那些类(线程线程)集成起来。集成起来。(2) 基于使用的测试基于使用的测试(use based testing): 首先测首先测试独立类试独立类(几乎不使用其它类的类几乎不使用其它类的类),再测试使用独,再测试使用独立类的下一个层次的类(称为依赖类)。据此依赖立类的下一个层次的类(称为依赖类)。据此依赖关系持续下去,直至把整个软件系统构造完为止。关系持续下去,直至把整个软件系统构造完为止。集群测试(集群测试(

26、cluster testing):用精心设计的测试用:用精心设计的测试用例检查一群相互协作的类(通过研究对象模型可以例检查一群相互协作的类(通过研究对象模型可以确定协作类),以发现不同的类之间的协作错误。确定协作类),以发现不同的类之间的协作错误。32 和传统的确认测试一样,面向对象软件的确认和传统的确认测试一样,面向对象软件的确认测试也集中检查用户可见的动作和用户可识别的输测试也集中检查用户可见的动作和用户可识别的输出。出。 从动态模型和描述系统行为的脚本可导出确认从动态模型和描述系统行为的脚本可导出确认测试用例,以发现用户交互需求可能错误的情景。测试用例,以发现用户交互需求可能错误的情景。

27、 黑盒测试方法可用于设计确认测试用例。黑盒测试方法可用于设计确认测试用例。12.3.3 面向对象的确认测试面向对象的确认测试33 与传统软件测试不同,面向对象测试关注设计与传统软件测试不同,面向对象测试关注设计适当的操作序列以检查类的状态。适当的操作序列以检查类的状态。 传统方法的可用性:传统方法的可用性:n 白盒测试:用于类级别的测试。测试类中封装的白盒测试:用于类级别的测试。测试类中封装的操作,检查类的状态以确定是否存在错误。操作,检查类的状态以确定是否存在错误。n 黑盒测试:用于集成测试、确认测试。黑盒测试:用于集成测试、确认测试。12.4 设计测试用例设计测试用例34 着重测试单个类和

28、类中封装的方法,主要有:着重测试单个类和类中封装的方法,主要有:随机测试、划分测试和基于故障的测试等随机测试、划分测试和基于故障的测试等3 3种。种。12.4.1 测试类(单元)的方法测试类(单元)的方法1. 随机测试随机测试随机选取测试随机选取测试类操作类操作序列以测试该类对象不同的序列以测试该类对象不同的生命历史生命历史问题的性质隐含了一些限制问题的性质隐含了一些限制 例:银行应用系统的例:银行应用系统的account(account(账户)类有下列账户)类有下列操作:操作: open(open(打开),打开),setup(setup(建立),建立),deposit(deposit(存款)

29、,存款),withdraw(withdraw(取款),取款),balance(balance(余余额),额),summarize(summarize(清单),清单),creditLimit(creditLimit(透支限额)透支限额)和和close(close(关闭)。关闭)。限制:限制:必须在其他操作前打开账户,完成了必须在其他操作前打开账户,完成了全部全部操操作之后作之后才能才能(/必须必须)关闭账户。关闭账户。35一个一个account类实例的最小类实例的最小(正常正常)行为历史包含下列操行为历史包含下列操作:作: opensetupdepositwithdrawclose可能发生许多其

30、他行为:可能发生许多其他行为: Opensetupdeposit deposit|withdraw|balance|summarize|creditLimitn.withdrawclose从上列序列可以随机地产生一系列不同的操作序列:从上列序列可以随机地产生一系列不同的操作序列: #r1:opensetupdepositdepositbalancesummarize.withdrawclose#r2:opensetupdepositcreditLimitwithdrawclose也要考虑异常(用户或编程也要考虑异常(用户或编程)序列:序列:opensetup.withdrawclosesetu

31、pdeposit.withdrawclose362. 划分测试划分测试 划分测试(划分测试(partition testingpartition testing)可以减少测)可以减少测试用例的数量。试用例的数量。 3 3种划分:状态、属性、功能。种划分:状态、属性、功能。(1) 基于状态的划分基于状态的划分 根据类操作是否改变类状态来划分。根据类操作是否改变类状态来划分。 考虑考虑accountaccount类,状态操作包括类,状态操作包括depositdeposit和和withdrawwithdraw,而非状态操作有,而非状态操作有balance, summarizebalance, sum

32、marize和和creditLimitcreditLimit。 然后为每个类别设计测试序列。用例应覆盖各然后为每个类别设计测试序列。用例应覆盖各类操作的每一操作。类操作的每一操作。37(2) 基于属性的划分基于属性的划分 根据类操作使用的属性来划分。根据类操作使用的属性来划分。 对于对于accountaccount类来说,可使用属性类来说,可使用属性balance(balance(余余额额= =状态状态) ) 把操作划分成把操作划分成3 3个类别:个类别: 使用使用balance的操作;的操作; 修改修改balance的操作;的操作; 不使用也不修改不使用也不修改balance的操作。的操作。

33、 用重要属性(状态)而非每个属性来划分。用重要属性(状态)而非每个属性来划分。38(3) 基于功能的划分基于功能的划分 根据类操作所完成的功能来划分。根据类操作所完成的功能来划分。 例如,可以把例如,可以把accountaccount类中的操作分类为初始类中的操作分类为初始化操作(化操作(open,setupopen,setup),计算操作(),计算操作(deposit, deposit, withdrawwithdraw),查询操作(),查询操作(balance, balance, summarize,creditLimitsummarize,creditLimit)和终止操作()和终止操作

34、(closeclose)。)。393. 基于故障的测试基于故障的测试 Fault based testing Fault based testing与传统的错误推测法类与传统的错误推测法类似,首先推测软件中可能有的错误,然后设计出最似,首先推测软件中可能有的错误,然后设计出最可能发现这些错误的测试用例。可能发现这些错误的测试用例。 它的效率依靠测试人员的经验和直觉。它的效率依靠测试人员的经验和直觉。 它与面向对象的方法无关。它与面向对象的方法无关。40 集成测试用例主要针对集成测试用例主要针对类间协作进行测试。进行测试。 测试类间协作测试类间协作可运用基于使用的测试策略可运用基于使用的测试策略

35、, , 找找出相互依赖的类出相互依赖的类. . 然后设计用例触发类间的各种交然后设计用例触发类间的各种交互序列。互序列。 测试类协作可以测试类协作可以使用随机测试方法和划分测试使用随机测试方法和划分测试方法方法,以及,以及基于情景基于情景/ /脚本的测试和行为测试脚本的测试和行为测试来完来完成。成。 UMLUML的协作图的协作图能帮助我们找出相互依赖的类和能帮助我们找出相互依赖的类和交互序列。交互序列。 下图展示了一个银行系统的类协作图。下图展示了一个银行系统的类协作图。12.4.2 集成测试方法集成测试方法41图图12.3 银行系统的类银行系统的类-协作图协作图42箭头线上的标注箭头线上的标

36、注:协作而调用的操作协作而调用的操作1. 多类测试多类测试生成多个类的测试用例步骤:生成多个类的测试用例步骤:1) 对每个客户对每个客户/UI类,为其生成一系列测试序列来类,为其生成一系列测试序列来覆盖所有操作。覆盖所有操作。2) 对这些操作所生成的每个消息,确定接收消息的对这些操作所生成的每个消息,确定接收消息的协作类协作类/服务器对象中的对应操作。服务器对象中的对应操作。3)把每个)把每个2)的操作,结合进测试序列中。对每个)的操作,结合进测试序列中。对每个产生消息的操作,继续产生消息的操作,继续2)43例,储户存款,操作序列:例,储户存款,操作序列: ATM:cardInserted.p

37、assword.depositBank: verifyAcctverifyPINdepositReqValidationInfo : validAcct validPINAccount: deposit对对Bank类的一个测试用例设计如下:类的一个测试用例设计如下:#r4:verifyAcctBankvalidAcctValidationInfoverifyPINBankvalidPINvalidationInfodepositReqdepositaccount44 多个类的划分测试方法类似于单个类。多个类的划分测试方法类似于单个类。 另一种划分测试方法,根据与特定类的接口来另一种划分测试方法

38、,根据与特定类的接口来划分类操作。划分类操作。nBank类接收来自类接收来自ATM类和类和Cashier类的消息,类的消息,n可以把可以把Bank类中的方法划分成服务于类中的方法划分成服务于ATM和和Cashier的两类来测试它们。的两类来测试它们。452. 从动态模型导出测试用例从动态模型导出测试用例 类的状态图可以帮助我们导出测试该类(及与类的状态图可以帮助我们导出测试该类(及与其协作的那些类)的动态行为的测试用例。其协作的那些类)的动态行为的测试用例。46设计出的测试用例至少应该覆盖所有状态:设计出的测试用例至少应该覆盖所有状态: #s1:opensetupAccntdeposit(in

39、itial)withdraw(final)close导出更多测试用例,以保证所有行为都被测试:导出更多测试用例,以保证所有行为都被测试:#s2:opensetupAccntdeposit(initial)depositbalancecreditwithdraw(final)close#s3:opensetupAccntdeposit(initial)depositwithdrawaccntInfowithdraw(final)close类似于传统方法中的路径覆盖类似于传统方法中的路径覆盖在多个类协作的情况下,应该使用多个状态图。在多个类协作的情况下,应该使用多个状态图。47n面向对象设计原则上

40、不依赖于特定的实现环境,面向对象设计原则上不依赖于特定的实现环境,n但实现结果和成本却取决于实现环境。但实现结果和成本却取决于实现环境。n支持面向对象设计范式的程序语言、开发环境及支持面向对象设计范式的程序语言、开发环境及类库,对于面向对象的实现非常重要。类库,对于面向对象的实现非常重要。n具有方便的开发环境和丰富的类库的面向对象程具有方便的开发环境和丰富的类库的面向对象程序设计语言,是实现面向对象设计的最佳选择。序设计语言,是实现面向对象设计的最佳选择。n良好的程序设计风格对于面向对象实现来说同样良好的程序设计风格对于面向对象实现来说同样重要。重要。n传统的程序设计风格准则依然成立,面向对象

41、方传统的程序设计风格准则依然成立,面向对象方法还有一些新准则。法还有一些新准则。12.5 小结小结48n面向对象测试的策略和技术与传统测试有所不同,面向对象测试的策略和技术与传统测试有所不同,对象类成为测试的焦点。对象类成为测试的焦点。n测试类时使用的方法主要有随机测试、划分测试测试类时使用的方法主要有随机测试、划分测试和基于故障的测试。每种方法都测试类中封装的操和基于故障的测试。每种方法都测试类中封装的操作。每种操作要在不同的对象状态(由对象的属性作。每种操作要在不同的对象状态(由对象的属性值表示)下测试。值表示)下测试。n可以采用基于线程或基于使用的策略完成集成测可以采用基于线程或基于使用

42、的策略完成集成测试。试。n从动态模型导出的测试用例,可以测试指定的类从动态模型导出的测试用例,可以测试指定的类及其协作者。及其协作者。n面向对象系统的确认测试可以用传统的黑盒方法面向对象系统的确认测试可以用传统的黑盒方法完成。完成。n情景情景/脚本为系统确认测试提供了用例。脚本为系统确认测试提供了用例。49Test Tools CASE tool index - Quite a comprehensive list of CASE Tools Old site: http:/www.cs.queensu.ca/Software-Engineering/toolcat.html 400 categories; 10% for test List of Test related tools50LOGISCOPE LOGISCOPE: Software Quality, Testing, Maintenance and Reverse-Engineering http:/ VERILOG IBM Rational Performance Tester 和和 HP Mercury LoadRunner 的比较的比较 http:/ 51Mercury Inter

温馨提示

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

评论

0/150

提交评论