《【教学课件】第12章面向对象实现.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第12章面向对象实现.ppt(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第12章章 面向对象实现面向对象实现12.1 程序设计语言程序设计语言12.2 程序设计风格程序设计风格12.3 测试策略测试策略12.4 设计测试用例设计测试用例12.5 小结小结1面向对象实现与面向过程的一样应包括:面向对象实现与面向过程的一样应包括:编码,测试。编码,测试。面向对象的分析和设计共同的模型使它们难于分开。面向对象的分析和设计共同的模型使它们难于分开。面向对象编程面向对象编程(OOP)需要需要OOP语言语言OOLOOL具有自己的特点和风格。具有自己的特点和风格。面向对象程序中的封装、继承和多态等机制,给测面向对象程序中的封装、继承和多态等机制,给测试带来新特点,增加了测试和
2、调试的难度。试带来新特点,增加了测试和调试的难度。2应用的实现应用的实现应用的实现是在所有的类都被实现之应用的实现是在所有的类都被实现之后的事情。后的事情。实际上,当把类开发出来时就已经实实际上,当把类开发出来时就已经实现了应用。现了应用。每个类提供了完成应用所需要的某种每个类提供了完成应用所需要的某种功能。功能。在在C+和和C中有一个中有一个main()函数。可函数。可以使用这个过程来说明构成应用的主以使用这个过程来说明构成应用的主要对象的那些类的实例。要对象的那些类的实例。3面向对象的设计适宜用面向对象的设计适宜用OOL来实现,来实现,理论上也可理论上也可以用非以用非OOL实现但不可取。实
3、现但不可取。若用非若用非OOL编写面向对象程序,则程序员必须自己编写面向对象程序,则程序员必须自己实现实现OOL编译程序自动提供的面向对象的概念和机编译程序自动提供的面向对象的概念和机制:类,继承,封装。制:类,继承,封装。若有可能,应选用若有可能,应选用OOL,因为它的下述重要优点。,因为它的下述重要优点。12.1 程序设计语言程序设计语言 12.1.1 面向对象语言面向对象语言OOL的优点的优点41.一致的表示方法一致的表示方法面向对象开发基于不随时间变化的、一致的表示方面向对象开发基于不随时间变化的、一致的表示方法法OO模型:模型:OOA,OOD,OOP。2.可重用性可重用性软件开发组织
4、可重用软件开发组织可重用OOA,OOD和和OOP结果。结果。3.可维护性可维护性保持文档与源程序一致的完全一致几乎不可能。保持文档与源程序一致的完全一致几乎不可能。OOL的可读性的可读性(对象名等对象名等)=可维护性可维护性。5两大类面向对象语言两大类面向对象语言:纯面向对象语言纯面向对象语言:Smalltalk和和Eiffel等等混合型面向对象语言混合型面向对象语言:过程语言过程语言+OO,如,如C+纯面向对象语言着重支持面向对象方法研究和快速纯面向对象语言着重支持面向对象方法研究和快速原型的实现,原型的实现,混合型面向对象语言的目标则是提高运行速度和使混合型面向对象语言的目标则是提高运行速
5、度和使传统程序员容易接受面向对象思想。传统程序员容易接受面向对象思想。比较面向对象语言比较面向对象语言/开发环境时需要考察的特点:开发环境时需要考察的特点:12.1.2 面向对象语言的技术特点面向对象语言的技术特点61.支持类与对象概念的机制支持类与对象概念的机制:内存管理内存管理允许用户动态创建对象意味着系统必须处理内存管允许用户动态创建对象意味着系统必须处理内存管理问题。理问题。有两种管理内存的方法有两种管理内存的方法:1)语言的运行机制自动管理内存,即自动回收语言的运行机制自动管理内存,即自动回收“垃垃圾圾”的机制;的机制;(必须采用先进的垃圾收集算法必须采用先进的垃圾收集算法)2)由程
6、序员编写释放内存的代码。由程序员编写释放内存的代码。(例如例如:程序员定义析构函数程序员定义析构函数(destructor)。每当一个。每当一个对象超出范围或被显式删除时,就自动调用析构函对象超出范围或被显式删除时,就自动调用析构函数。这种机制使得程序员能够方便地构造和唤醒释数。这种机制使得程序员能够方便地构造和唤醒释放内存的操作放内存的操作)72.实现整体实现整体-部分部分(即聚集即聚集)结构的机制结构的机制两种实现关联方法两种实现关联方法:指针和独立的关联对象指针和独立的关联对象大多数现有的面向对象语言并不显式支持独立的关大多数现有的面向对象语言并不显式支持独立的关联对象,在这种情况下,使
7、用指针是最容易的实现联对象,在这种情况下,使用指针是最容易的实现关联的方法。关联的方法。83.实现一般实现一般-特殊特殊(即泛化即泛化)结构的机制结构的机制实现继承实现继承+解决名字冲突。解决名字冲突。名字冲突指的是继承多个基类可能出现的重名问题。名字冲突指的是继承多个基类可能出现的重名问题。某些语言拒绝接受有名字冲突的程序,另一些语言某些语言拒绝接受有名字冲突的程序,另一些语言提供了解决冲突的协议。提供了解决冲突的协议。程序员应该尽力避免出现名字冲突。程序员应该尽力避免出现名字冲突。94.实现属性和服务的机制实现属性和服务的机制属性的机制:属性的机制:支持实例连接;支持实例连接;属性的可见性
8、控制;属性的可见性控制;对属性值的约束。对属性值的约束。服务的机制:服务的机制:支持消息连接支持消息连接(即表达对象交互关系即表达对象交互关系);控制服务可见性;控制服务可见性;动态联编。动态联编。105.类型检查类型检查强强/弱类型弱类型:语法规定变量语法规定变量/属性分类的严格性。属性分类的严格性。强类型优点:强类型优点:一是在编译时能发现程序错误,一是在编译时能发现程序错误,二是增加了优化的可能性。二是增加了优化的可能性。强类型有助于提高软件的可靠性和运行效率强类型有助于提高软件的可靠性和运行效率.强类型宜用于开发软件产品,强类型宜用于开发软件产品,弱类型适于快速开发原型。弱类型适于快速
9、开发原型。116.类库类库类库类库:编译编译/开发环境提供的重用类构件。开发环境提供的重用类构件。类库包含实现通用数据结构类库包含实现通用数据结构(例如,动态数组、表、例如,动态数组、表、队列、栈、树等等队列、栈、树等等)的类,的类,GUI用户界面类。用户界面类。7.效率效率面向对象语言的主要缺点是效率低面向对象语言的主要缺点是效率低:解释型语言解释型语言,动态联编动态联编.类库中提供的算法和数据结构更高效类库中提供的算法和数据结构更高效.差别可以忽略,利大于弊。差别可以忽略,利大于弊。128.持久保存对象持久保存对象不依赖于程序执行的生命期而长时间保存数据对象不依赖于程序执行的生命期而长时间
10、保存数据对象的两个原因:的两个原因:(1)实现不同时运行程序间传递数据实现不同时运行程序间传递数据(2)恢复被中断了的程序的运行恢复被中断了的程序的运行理想情况下,应该使程序设计语言语法与对象存储理想情况下,应该使程序设计语言语法与对象存储管理语法实现无缝集成。管理语法实现无缝集成。139.参数化类参数化类类的数据类的数据(属性属性)类型可以由参数给定。类型可以由参数给定。一个类可以对不同的数据类型施以同样的操作。如一个类可以对不同的数据类型施以同样的操作。如对整数和实数排序。对整数和实数排序。Eiffel 和和C+语言提供了参数化类语言提供了参数化类/类模板。类模板。10.开发环境开发环境软
11、件工具或开发环境对软件生产率有很大影响。软件工具或开发环境对软件生产率有很大影响。一个语言可有不同的编译程序。一个语言可有不同的编译程序。CASE工具与语言的兼容性。工具与语言的兼容性。14选择面向对象语言应考虑的因素选择面向对象语言应考虑的因素:1.将来能否占主导地位将来能否占主导地位语言的生命力及稳定性:维护的考虑。语言的生命力及稳定性:维护的考虑。2.可重用性可重用性影响重用的要素:封装,继承,多态。影响重用的要素:封装,继承,多态。3.类库和开发环境类库和开发环境语言、开发环境和类库这语言、开发环境和类库这3个因素共同决定可重用个因素共同决定可重用性。性。类库是否提供有价值的类?类库是
12、否提供有价值的类?开发环境是否提供使用方便的类库编辑和浏览工具。开发环境是否提供使用方便的类库编辑和浏览工具。12.1.3 选择面向对象语言选择面向对象语言154.其他因素其他因素在选择编程语言时,应该考虑的其他因素还有:在选择编程语言时,应该考虑的其他因素还有:对对用户学习面向对象分析、设计和编码技术所能提供用户学习面向对象分析、设计和编码技术所能提供的培训服务;的培训服务;在使用这个面向对象语言期间能提供的技术支持;在使用这个面向对象语言期间能提供的技术支持;能提供给开发人员使用的开发工具、开发平台、发能提供给开发人员使用的开发工具、开发平台、发行平台;行平台;对机器性能和内存的需求;对机
13、器性能和内存的需求;集成已有软件的容易程度集成已有软件的容易程度(调用其它语言的模块调用其它语言的模块)。16为适应面向对象方法所特有的概念为适应面向对象方法所特有的概念(例如,继承性例如,继承性)而必须遵循的一些新准则。而必须遵循的一些新准则。12.2 程序设计风格程序设计风格17两种代码重用:两种代码重用:1)本项目内的代码重用,本项目内的代码重用,2)重用重用旧旧/外项目的代码。外项目的代码。1)内部重用内部重用:利用继承机制共享相同或相似的部分利用继承机制共享相同或相似的部分12.2.1 提高可重用性提高可重用性17两种代码重用:两种代码重用:1)本项目内的代码重用,本项目内的代码重用
14、,2)重用重用旧旧/外项目的代码。外项目的代码。1)内部重用内部重用:利用继承机制共享相同或相似的部分利用继承机制共享相同或相似的部分12.2.1 提高可重用性提高可重用性18实现两类重用的程序设计准则:实现两类重用的程序设计准则:1.提高方法的内聚提高方法的内聚一个方法一个方法(即服务即服务)只完成单个功能只完成单个功能,否则把它分解成否则把它分解成几个更小的方法。几个更小的方法。2.减小方法的规模减小方法的规模把规模过大的方法把规模过大的方法(代码长度超过一页纸代码长度超过一页纸),分解成,分解成几个更小的方法。几个更小的方法。3.保持方法的一致性保持方法的一致性功能相似的方法应该有一致的
15、名字、参数特征功能相似的方法应该有一致的名字、参数特征(包包括参数个数、类型和次序括参数个数、类型和次序)、返回值类型、使用条、返回值类型、使用条件及出错条件等。件及出错条件等。194.把策略与实现分开把策略与实现分开两种不同类型的方法:策略与实现。两种不同类型的方法:策略与实现。策略方法策略方法(拼积木拼积木)调用实现方法调用实现方法(积木积木)来完成任务来完成任务(实现图案实现图案)。策略方法通常紧密依赖于具体应用。策略方法通常紧密依赖于具体应用。实现方法针对具体数据完成特定处理,用于实现复实现方法针对具体数据完成特定处理,用于实现复杂的算法。相对独立于应用,因此,较可能被重用。杂的算法。
16、相对独立于应用,因此,较可能被重用。205.全面覆盖全面覆盖方法的实现不仅满足当前应用而且应该考虑其它应方法的实现不仅满足当前应用而且应该考虑其它应用的潜在需要。用的潜在需要。此外,方法对空值、极限值及界外值等异常情况也此外,方法对空值、极限值及界外值等异常情况也应该能够作出有意义的响应。应该能够作出有意义的响应。6.尽量不使用全局信息尽量不使用全局信息应该尽量降低方法与外界的耦合程度,不使用全局应该尽量降低方法与外界的耦合程度,不使用全局信息,如类变量。信息,如类变量。217.利用继承机制利用继承机制继承是实现共享和提高重用的主要途径。继承是实现共享和提高重用的主要途径。(1)调用子过程:把
17、公共的代码分离出来,构成一个调用子过程:把公共的代码分离出来,构成一个被其他方法调用的公用方法,被其他方法调用的公用方法,并在基类中定义它。并在基类中定义它。(2)分解因子。从不同类的相似方法中分解出不同的分解因子。从不同类的相似方法中分解出不同的“因子因子”(即不同的代码即不同的代码),把余下的代码作为公用方,把余下的代码作为公用方法中的公共代码,把分解出的因子作为法中的公共代码,把分解出的因子作为名字相同名字相同(多多态性机制态性机制)算法不同的方法,放在不同类中定义,并算法不同的方法,放在不同类中定义,并被这个公用方法调用,如图所示。被这个公用方法调用,如图所示。22(3)使用委托。仅当
18、确实存在一般使用委托。仅当确实存在一般-特殊关系时,使特殊关系时,使用继承才是恰当的,否则,可以利用委托机制,如用继承才是恰当的,否则,可以利用委托机制,如本书小节所述。本书小节所述。(4)把代码封装在类中。把代码封装在类中。(与继承无关)(与继承无关)把被重用的代码封装在类中比较安全和修改。把被重用的代码封装在类中比较安全和修改。23提高可重用性的准则,也能提高程序的可扩充性。提高可重用性的准则,也能提高程序的可扩充性。此外,下列准则也有助于提高可扩充性:此外,下列准则也有助于提高可扩充性:1.封装实现策略封装实现策略把类的实现策略把类的实现策略(包括描述属性的数据结构、修改包括描述属性的数
19、据结构、修改属性的算法等属性的算法等)封装起来,将提高今后修改数据结封装起来,将提高今后修改数据结构或算法的自由度。构或算法的自由度。12.2.2 提高可扩充性提高可扩充性242.不要用一个方法遍历多条关联链不要用一个方法遍历多条关联链一个方法应该只包含对象模型中的有限内容,一个方法应该只包含对象模型中的有限内容,除非除非内容与方法无关。否则将导致方法过分复杂,既不内容与方法无关。否则将导致方法过分复杂,既不易理解,也不易修改扩充。易理解,也不易修改扩充。3.避免使用多分支语句避免使用多分支语句可以利用可以利用DO_CASE语句测试对象的内部状态,而语句测试对象的内部状态,而不要用来根据对象类
20、型选择应有的行为不要用来根据对象类型选择应有的行为(强耦合强耦合),否则在增添新类时将不得不修改原有的代码。应该否则在增添新类时将不得不修改原有的代码。应该利用多态性机制,根据对象当前类型,自动决定应利用多态性机制,根据对象当前类型,自动决定应有的行为。有的行为。254.精心确定公有方法精心确定公有方法公有方法是向公众公布的接口。对这类方法的修改公有方法是向公众公布的接口。对这类方法的修改往往会涉及许多其他类。为提高稳定性,可修改性,往往会涉及许多其他类。为提高稳定性,可修改性,降低维护成本,必须精心选择和定义公有方法。降低维护成本,必须精心选择和定义公有方法。删除、增加或修改私有方法所涉及的
21、面要窄得多,删除、增加或修改私有方法所涉及的面要窄得多,因此代价也比较低。因此代价也比较低。26既应该考虑效率,也应该考虑健壮性。需要在健壮既应该考虑效率,也应该考虑健壮性。需要在健壮性与效率之间做出适当的折衷。性与效率之间做出适当的折衷。为提高健壮性应该遵守以下几条准则:为提高健壮性应该遵守以下几条准则:1.预防用户的操作错误预防用户的操作错误软件系统必须具有处理用户操作错误的能力。任何软件系统必须具有处理用户操作错误的能力。任何一个接收用户输入数据的方法,对其接收到的数据一个接收用户输入数据的方法,对其接收到的数据都必须进行检查,发现了错误,应该给出恰当的提都必须进行检查,发现了错误,应该
22、给出恰当的提示信息,并准备再次接收用户的输入。示信息,并准备再次接收用户的输入。12.2.3 提高健壮性提高健壮性272.检查参数的合法性检查参数的合法性对公有方法,尤其应该着重检查其参数的合法性,对公有方法,尤其应该着重检查其参数的合法性,因为调用公有方法时可能违反参数的约束条件。因为调用公有方法时可能违反参数的约束条件。3.不要轻易限定数据容量不要轻易限定数据容量在设计阶段,很难准确地预测出应用系统中数据结在设计阶段,很难准确地预测出应用系统中数据结构的最大容量需求。如果有必要和可能,应该使用构的最大容量需求。如果有必要和可能,应该使用动态内存分配机制。动态内存分配机制。284.先测试后优
23、化先测试后优化测试程序的性能以确定是否为提高效率而进行优化。测试程序的性能以确定是否为提高效率而进行优化。如果实现某个操作的算法有许多种,则应该综合考如果实现某个操作的算法有许多种,则应该综合考虑内存需求、速度及实现的简易程度等因素,经合虑内存需求、速度及实现的简易程度等因素,经合理折衷选定适当的算法。理折衷选定适当的算法。29测试面向对象软件的策略与与面向过程的策略基本测试面向对象软件的策略与与面向过程的策略基本相同,但也有许多新特点。相同,但也有许多新特点。12.3 测试策略测试策略30最小的可测试单元是单个封装起来的类和对象。最小的可测试单元是单个封装起来的类和对象。测试一个类就是测试它
24、的对象子集测试一个类就是测试它的对象子集(不可穷尽不可穷尽).测试对象主要是测试它的操作测试对象主要是测试它的操作.不能孤立地测试单个操作不能孤立地测试单个操作:同一个操作在不同状态下行为不同同一个操作在不同状态下行为不同.同一个操作在不同类中有不同的实现同一个操作在不同类中有不同的实现(多态性多态性).有必要在每个子类的语境中测试操作有必要在每个子类的语境中测试操作比面向过程更复杂比面向过程更复杂12.3.1 面向对象的单元测试面向对象的单元测试31集成集成=组装有关联的类组装有关联的类不存在层次的控制结构不存在层次的控制结构(隐含在类中隐含在类中)传统的自顶向下传统的自顶向下/自底向上的集
25、成策略无意义。自底向上的集成策略无意义。12.3.2 面向对象的集成测试面向对象的集成测试32面向对象软件的集成测试的两种策略面向对象软件的集成测试的两种策略:(1)基于线程的测试(基于线程的测试(thread based testing):把响把响应系统的一个输入或一个事件所需要的那些类应系统的一个输入或一个事件所需要的那些类(线线程程)集成起来。集成起来。(2)基于使用的测试(基于使用的测试(use based testing):首先测首先测试独立类试独立类(几乎不使用其它类的类几乎不使用其它类的类),再测试使用独,再测试使用独立类的下一个层次的类(称为依赖类)。据此依赖立类的下一个层次的
26、类(称为依赖类)。据此依赖关系持续下去,直至把整个软件系统构造完为止。关系持续下去,直至把整个软件系统构造完为止。集群测试(集群测试(cluster testing):用精心设计的测试用):用精心设计的测试用例检查一群相互协作的类(通过研究对象模型可以例检查一群相互协作的类(通过研究对象模型可以确定协作类),以发现不同的类之间的协作错误。确定协作类),以发现不同的类之间的协作错误。33和传统的确认测试一样,面向对象软件的确认测试和传统的确认测试一样,面向对象软件的确认测试也集中检查用户可见的动作和用户可识别的输出。也集中检查用户可见的动作和用户可识别的输出。从动态模型和描述系统行为的脚本可导出
27、确认测试从动态模型和描述系统行为的脚本可导出确认测试用例,以发现用户交互需求可能错误的情景。用例,以发现用户交互需求可能错误的情景。黑盒测试方法也可用于设计上述确认测试用例。黑盒测试方法也可用于设计上述确认测试用例。12.3.3 面向对象的确认测试面向对象的确认测试34与传统软件测试不同,面向对象测试关注设计适当与传统软件测试不同,面向对象测试关注设计适当的操作序列以检查类的状态。的操作序列以检查类的状态。(1)传统方法的可用性)传统方法的可用性 白盒测试:用于类级别的测试。测试类中封装的白盒测试:用于类级别的测试。测试类中封装的操作,检查类的状态以确定是否存在错误。操作,检查类的状态以确定是
28、否存在错误。黑盒测试:用于集成测试、确认测试。黑盒测试:用于集成测试、确认测试。12.4 设计测试用例设计测试用例35着重测试单个类和类中封装的方法主要有:随机测着重测试单个类和类中封装的方法主要有:随机测试、划分测试和基于故障的测试等试、划分测试和基于故障的测试等3种。种。12.4.1 测试类(单元)的方法测试类(单元)的方法351.随机测试随机测试随机选取测试随机选取测试类操作操作序列以测试该类对象不同的序列以测试该类对象不同的生命历史生命历史问题的性质隐含了一些限制问题的性质隐含了一些限制例:银行应用系统的例:银行应用系统的account(账户)类有下列操作:账户)类有下列操作:open
29、(打开),打开),setup(建立),建立),deposit(存款),存款),withdraw(取款),取款),balance(余额),余额),summarize(清清单),单),creditLimit(透支限额)和透支限额)和close(关闭)。关闭)。限制:必须在其他操作前打开账户,完成了限制:必须在其他操作前打开账户,完成了全部全部操操作之后作之后才能才能(/必须必须)关闭账户。关闭账户。36一个一个account类实例的最小类实例的最小(正常正常)行为历史包含下列行为历史包含下列操作:操作:opensetupdeposit.withdrawclose可能发生许多其他行为:可能发生许多其
30、他行为:Opensetupdeposit deposit|withdraw|balance|summarize|creditLimitn.withdrawclose从上列序列可以随机地产生一系列不同的操作序列:从上列序列可以随机地产生一系列不同的操作序列:#r1:opensetupdepositdepositbalancesummarize.withdrawclose#r2:opensetupdepositcreditLimitwithdrawclose也要考虑异常(用户或编程也要考虑异常(用户或编程)序列:序列:opensetup.withdrawclosesetupdeposit.with
31、drawclose372.划分测试划分测试划分测试(划分测试(partition testing)可以减少测试用例的)可以减少测试用例的数量。数量。3种划分:状态,属性,功能。种划分:状态,属性,功能。(1)基于状态的划分基于状态的划分根据类操作是否改变类状态来划分。根据类操作是否改变类状态来划分。考虑考虑account类,状态操作包括类,状态操作包括deposit和和withdraw,而非状态操作有,而非状态操作有balance,summarize和和creditLimit。然后为每个类别设计测试序列。用例应覆盖各类操然后为每个类别设计测试序列。用例应覆盖各类操作的每一操作。作的每一操作。3
32、8(2)基于属性的划分基于属性的划分根据类操作使用的属性来划分。根据类操作使用的属性来划分。对于对于account类来说,可使用属性类来说,可使用属性balance(余额余额=状状态态)把操作划分成把操作划分成3个类别:个类别:使用使用balance的操作;的操作;修改修改balance的操作;的操作;不使用也不修改不使用也不修改balance的操作。的操作。用重要属性(状态)而非每个属性来划分。用重要属性(状态)而非每个属性来划分。39(3)基于功能的划分基于功能的划分根据类操作所完成的功能来划分。根据类操作所完成的功能来划分。例如,可以把例如,可以把account类中的操作分类为初始化操类
33、中的操作分类为初始化操作(作(open,setup),计算操作(),计算操作(deposit,withdraw),查询操作(),查询操作(balance,summarize,creditLimit)和终止操作()和终止操作(close)。)。403.基于故障的测试基于故障的测试Fault based testing与传统的错误推测法类似,首先与传统的错误推测法类似,首先推测软件中可能有的错误,然后设计出最可能发现推测软件中可能有的错误,然后设计出最可能发现这些错误的测试用例。这些错误的测试用例。它的效率依靠测试人员的经验和直觉。它的效率依靠测试人员的经验和直觉。它与面向对象的方法无关。它与面向
34、对象的方法无关。41集成测试用例主要针对类间协作进行测试。集成测试用例主要针对类间协作进行测试。测试类间协作可运用基于使用的测试策略测试类间协作可运用基于使用的测试策略,找出相找出相互依赖的类互依赖的类.然后设计用例触发类间的各种交互序然后设计用例触发类间的各种交互序列列.测试类协作可以使用随机测试方法和划分测试方法,测试类协作可以使用随机测试方法和划分测试方法,以及基于情景以及基于情景/脚本的测试和行为测试来完成。脚本的测试和行为测试来完成。UML的协作图能帮助我们找出相互依赖的类和交的协作图能帮助我们找出相互依赖的类和交互序列互序列.下图展示了一个银行系统的类协作图。下图展示了一个银行系统
35、的类协作图。12.4.2 集成测试方法集成测试方法42图图12.3 银行系统的类银行系统的类-协作图协作图43箭头线上的标注:协作而调用的操作1.多类测试多类测试生成多个类的测试用例步骤:生成多个类的测试用例步骤:1)对每个客户对每个客户/UI类,为其生成一系列测试序列来类,为其生成一系列测试序列来覆盖所有操作。覆盖所有操作。2)对这些操作所生成的每个消息,确定接收消息的对这些操作所生成的每个消息,确定接收消息的协作类协作类/服务器对象中的对应操作。服务器对象中的对应操作。3)把每个)把每个2)的操作,结合进测试序列中。对每个)的操作,结合进测试序列中。对每个产生消息的操作,继续产生消息的操作
36、,继续2)44例,储户存款,操作序列:例,储户存款,操作序列:ATM:Bank:verifyAcctverifyPINdepositReqValidationInfo:validAcct validPINAccount:deposit#r4:verifyAcctBankvalidAcctValidationInfoverifyPINBankvalidPINvalidationInfodepositReqdepositaccount45多个类的划分测试方法类似于单个类。多个类的划分测试方法类似于单个类。另一种划分测试方法,根据与特定类的接口来划分另一种划分测试方法,根据与特定类的接口来划分类操作
37、。类操作。Bank类接收来自类接收来自ATM类和类和Cashier类的消息,类的消息,可以把可以把Bank类中的方法划分成服务于类中的方法划分成服务于ATM和和Cashier的两类来测试它们。的两类来测试它们。462.从动态模型导出测试用例从动态模型导出测试用例类的状态图可以帮助我们导出测试该类(及与其协类的状态图可以帮助我们导出测试该类(及与其协作的那些类)的动态行为的测试用例。作的那些类)的动态行为的测试用例。47设计出的测试用例至少应该覆盖所有状态:设计出的测试用例至少应该覆盖所有状态:#s1:opensetupAccntdeposit(initial)withdraw(final)cl
38、ose导出更多测试用例,以保证所有行为都被测试:导出更多测试用例,以保证所有行为都被测试:#s2:opensetupAccntdeposit(initial)depositbalancecreditwithdraw(final)close#s3:opensetupAccntdeposit(initial)depositwithdrawaccntInfowithdraw(final)close在多个类协作的情况下,应该使用多个状态图。在多个类协作的情况下,应该使用多个状态图。48面向对象设计原则上不依赖于特定的实现环境,面向对象设计原则上不依赖于特定的实现环境,但实现结果和成本却取决于实现环境。
39、但实现结果和成本却取决于实现环境。支持面向对象设计范式的程序语言、开发环境及类支持面向对象设计范式的程序语言、开发环境及类库,对于面向对象的实现非常重要。库,对于面向对象的实现非常重要。具有方便的开发环境和丰富的类库的面向对象程序具有方便的开发环境和丰富的类库的面向对象程序设计语言,是实现面向对象设计的最佳选择。设计语言,是实现面向对象设计的最佳选择。良好的程序设计风格对于面向对象实现来说同样重良好的程序设计风格对于面向对象实现来说同样重要。要。传统的程序设计风格准则依然成立,面向对象方法传统的程序设计风格准则依然成立,面向对象方法还有一些新准则。还有一些新准则。12.5 小结小结49面向对象
40、测试的策略和技术与传统测试有所不同,面向对象测试的策略和技术与传统测试有所不同,对象类成为测试的焦点。对象类成为测试的焦点。测试类时使用的方法主要有随机测试、划分测试和测试类时使用的方法主要有随机测试、划分测试和基于故障的测试。每种方法都测试类中封装的操作。基于故障的测试。每种方法都测试类中封装的操作。每种操作要在不同的对象状态(由对象的属性值表每种操作要在不同的对象状态(由对象的属性值表示)下测试。示)下测试。可以采用基于线程或基于使用的策略完成集成测试。可以采用基于线程或基于使用的策略完成集成测试。从动态模型导出的测试用例,可以测试指定的类及从动态模型导出的测试用例,可以测试指定的类及其协
41、作者。其协作者。面向对象系统的确认测试可以用传统的黑盒方法完面向对象系统的确认测试可以用传统的黑盒方法完成。成。情景情景/脚本为系统确认测试提供了用例。脚本为系统确认测试提供了用例。50Test ToolsCASE tool index-Quite a comprehensive list of CASE Tools 400 categories;10%for testList of Test related tools51LOGISCOPELOGISCOPE:Software Quality,Testing,Maintenance and Reverse-Engineering VERILO
42、GIBM Rational Performance Tester 和和 HP Mercury LoadRunner 的比较的比较 52Mercury Interactivewww.MWith Mercury Quality Center,you can:Standardize and manage the entire quality process.Make quality decisions based on business risks and priorities.Reduce application deployment risk.Improve application qualit
43、y and reliability.Manage application change impact through manual and automated functional testing.Track quality assets and progress across releases and test cycles.Warehouse critical application quality project data.Test service-oriented architecture services for both functionality and performance.
44、Ensure support for all environments including J2EE,.NET,Oracle and SAP.53IBM Rational quality management54Requirements and Test Management Requirements,test planning,test results,test analysis,and reports and defects Functional Testing Automated and manual functional testing and regression testing o
45、f a wide array of applications including:Java,.Net,SAP,Siebel and web services Performance Testing Load testing,performance testing and scalability testing for a wide array of applications including:Web,Java,.Net,Citrix,IBM mainframe,SAP,Siebel and web services Web Application Security Automated application security scanning,testing and reporting Web Compliance Content scanning for privacy,quality and accessibility compliance testing and reporting Code Quality and Embedded Systems Run-time analysis,memory leak detection,performance profiling,and component testing
限制150内