




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 n面向对象实现主要包括面向对象实现主要包括两项两项工作:工作: q把把面向对象设计结果面向对象设计结果翻译成翻译成用某种程序语言书写的用某种程序语言书写的面向面向对象程序;对象程序;q测试测试并并调试调试面向对象的程序面向对象的程序。n面向对象程序的面向对象程序的质量质量基本上由基本上由面向对象设计的质量面向对象设计的质量决决定定,所采用的,所采用的程序语言的特点程序语言的特点和和程序设计风格程序设计风格也将对也将对程序的可靠性、程序的可靠性、可重用性可重用性及及可维护性可维护性产生深远影响。产生深远影响。n软件测试软件测试仍然是保证软件可靠性的主要措施。但是,仍然是保证软件可靠性的主要措
2、施。但是,面向对象程序中特有的面向对象程序中特有的封装封装、继承继承和和多态多态等等机制机制,也,也给面向对象给面向对象测试带来一些新特点测试带来一些新特点,增加了增加了测试和调试测试和调试的难度的难度。 第第12章章 面向对象实现面向对象实现2 第第12章章 面向对象实现面向对象实现12.1 程序设计语言程序设计语言12.2 程序设计风格程序设计风格12.3 测试策略测试策略12.4 设计测试用例设计测试用例3 n使用使用面向对象语言面向对象语言时,由于语言本身充分时,由于语言本身充分支持面向对支持面向对象概念的实现象概念的实现,因此,编译程序可以自动把,因此,编译程序可以自动把面向对象面向
3、对象概念概念映射映射到到目标程序中目标程序中。n使用使用非面向对象语言非面向对象语言编写面向对象程序,则必须由编写面向对象程序,则必须由程程序员序员自己把自己把面向对象概念面向对象概念映射到映射到目标程序中目标程序中。 面向对象面向对象设计的结果设计的结果既可以用既可以用面向对象语言面向对象语言、也可、也可以用以用非面向对象语言非面向对象语言实现实现。例如,例如,C语言语言并不直接支持类或对象的概念,程序员只能在结构并不直接支持类或对象的概念,程序员只能在结构(struct)中中定义变量和相应的函数定义变量和相应的函数(事实上,不能直接在结构中定义事实上,不能直接在结构中定义函数而是要利用指针
4、间接定义函数而是要利用指针间接定义)。12.1 程序设计语言程序设计语言4 12.1. 程序设计语言程序设计语言 所有所有非面向对象语言非面向对象语言都都不支持不支持一般一般-特殊特殊结构的实现,结构的实现,使用这类语言编程时使用这类语言编程时要么完全回避继承的概念要么完全回避继承的概念,要么在,要么在声明声明特殊化类特殊化类时,把时,把对一般化类的引用嵌套在它里面对一般化类的引用嵌套在它里面。到底应该选用面向对象语言还是非面向对象语言关键不在于语言功能强弱,关键不在于语言功能强弱,即选择哪个语言能最好地即选择哪个语言能最好地表达问题域语义表达问题域语义5 12.1. 程序设计语言程序设计语言
5、 从原理上说,使用任何一种从原理上说,使用任何一种通用语言通用语言都可以都可以实现面实现面向对象概念向对象概念。 使用使用面向对象语言面向对象语言,实现面向对象概念,远比使用,实现面向对象概念,远比使用非面向对象语言非面向对象语言方便方便,但是,但是,方便性也并不是方便性也并不是决定决定选择选择何种语言何种语言的的关键因素关键因素。 选择编程语言的选择编程语言的关键因素关键因素,是语言的,是语言的一致的表达能一致的表达能力力、可重用性可重用性及及可维护性可维护性,面向对象语言,面向对象语言具备具备这这3个优个优点点:6 12.1.1 面向对象语言的优点面向对象语言的优点1. 一致的表示方法一致
6、的表示方法 这种表示方法应该从这种表示方法应该从问题域问题域到到OOA,从,从OOA到到OOD,最后从最后从OOD到面向对象编程到面向对象编程(OOP),始终稳定不变。,始终稳定不变。 一致的表示方法一致的表示方法既有利于在软件开发过程中既有利于在软件开发过程中始终使用统始终使用统一的概念一的概念,也有利于,也有利于维护人员维护人员理解理解软件的软件的各种配置成分各种配置成分。2. 可重用性可重用性 为了能带来可观的商业利益,必须在更广泛的范围中运为了能带来可观的商业利益,必须在更广泛的范围中运用重用机制用重用机制。3. 可维护性可维护性 可维护性强。可维护性强。 7 12.1.2 面向对象语
7、言的技术特点面向对象语言的技术特点1. 支持支持类与对象类与对象概念的概念的机制机制n所有所有面向对象语言面向对象语言都都允许允许用户用户动态创建对象动态创建对象,并且可以,并且可以用用指针指针引用引用动态创建的对象动态创建的对象。2. 实现实现整体整体-部分部分(即聚集即聚集)结构的机制结构的机制n分别使用分别使用指针和独立的关联对象指针和独立的关联对象实现实现整体整体-部分结构部分结构。3. 实现实现一般一般-特殊特殊(即泛化即泛化)结构的机制结构的机制n既包括实现既包括实现继承的机制继承的机制也包括解决也包括解决名字冲突名字冲突的机制。的机制。8 4. 实现实现属性属性和和服务服务的机制
8、的机制n对于实现对于实现属性的机制属性的机制应该着重考虑以下几个方面:支持应该着重考虑以下几个方面:支持实实例连接的机制例连接的机制;属性的可见性控制属性的可见性控制;对;对属性值的约束属性值的约束。n对于对于服务服务来说主要应该考虑下列因素:支持来说主要应该考虑下列因素:支持消息连接的机消息连接的机制制;控制服务可见性的机制控制服务可见性的机制;动态联编动态联编。5. 类型类型检查检查n如果语言仅要求每个如果语言仅要求每个变量或属性变量或属性隶属隶属于于一个对象一个对象,则是弱,则是弱类型的,如类型的,如Smalltalk;n如果如果语法规定语法规定每个变量或属性每个变量或属性必须准确必须准
9、确地属于某个特定的地属于某个特定的类,则这样的语言是类,则这样的语言是强类型强类型的,如的,如C+。9 6. 类库类库n大多数面向对象语言都提供一个大多数面向对象语言都提供一个实用的类库实用的类库。存在类库,。存在类库,许多许多软构件软构件就就不必由程序员重头编写不必由程序员重头编写了,这为实现软件重了,这为实现软件重用带来很大方便。用带来很大方便。7. 效率效率n使用拥有完整类库的面向对象语言,有时能比使用非面向使用拥有完整类库的面向对象语言,有时能比使用非面向对象语言得到对象语言得到运行更快的代码运行更快的代码。n绝大多数面向对象语言都优化了查找继承树的过程,从而绝大多数面向对象语言都优化
10、了查找继承树的过程,从而实现了实现了高效率查找高效率查找。10 8. 持久保存对象持久保存对象n任何应用程序都对数据进行处理,如果希望任何应用程序都对数据进行处理,如果希望数据数据能够能够不依不依赖于程序执行赖于程序执行的生命期而的生命期而长时间保存下来长时间保存下来,则需要提供某,则需要提供某种保存数据的方法种保存数据的方法。n希望长期保存数据主要出于以下两个原因:希望长期保存数据主要出于以下两个原因: (1) 为实现在为实现在不同程序之间传递数据不同程序之间传递数据,需要保存数据;,需要保存数据;(2) 为为恢复被中断了的程序的运行恢复被中断了的程序的运行,首先需要保存数据。,首先需要保存
11、数据。n通过在类库中增加通过在类库中增加对象存储管理功能对象存储管理功能,可以在不改变语言,可以在不改变语言定义或不增加关键字的情况下,就在开发环境中提供这种定义或不增加关键字的情况下,就在开发环境中提供这种功能功能。11 9. 参数化类参数化类n所谓所谓参数化类参数化类,就是使用,就是使用一个一个或或多个多个类型去类型去参数化参数化一个类一个类的机制;的机制;n有了这种机制,程序员就可以先定义一个有了这种机制,程序员就可以先定义一个参数化的类模板参数化的类模板,然后把然后把数据类型作数据类型作为为参数传递进来参数传递进来;n从而把这个从而把这个类模板类模板应用在应用在不同的应用程序中不同的应
12、用程序中,或用在同一,或用在同一应用程序的不同部分。应用程序的不同部分。10. 开发环境开发环境n软件工具和软件工程环境对软件生产率有很大影响;软件工具和软件工程环境对软件生产率有很大影响;n至少应该包括下列一些最基本的软件工具:至少应该包括下列一些最基本的软件工具:编辑程序编辑程序,编译程序编译程序或或解释程序解释程序,浏览工具浏览工具,调试器调试器等。等。12 开发人员在开发人员在选择面向对象语言选择面向对象语言时,还应该着重考虑以下时,还应该着重考虑以下一些一些实际因素实际因素。1. 将来能否占主导地位将来能否占主导地位n为了使自己的产品在为了使自己的产品在若干年后仍然具有很强的生命力若
13、干年后仍然具有很强的生命力,人们可能希望人们可能希望采用将来占主导地位的语言编程采用将来占主导地位的语言编程。n根据目前根据目前占有占有的的市场份额市场份额,以及专业书刊和学术会议上,以及专业书刊和学术会议上所做的所做的分析、评价分析、评价,对,对未来哪种面向对象语言将占据主未来哪种面向对象语言将占据主导地位导地位做出做出预测预测。n但是,最终决定选用哪种面向对象语言的但是,最终决定选用哪种面向对象语言的实际因素实际因素,往,往往往是诸如成本之类的经济因素是诸如成本之类的经济因素而而不是技术因素不是技术因素。12.1.3 选择面向对象语言选择面向对象语言13 2. 可重用性可重用性n语言语言、
14、开发环境开发环境和和类库类库这这3个因素综合起来,个因素综合起来,共同共同决定了决定了可重用性。可重用性。n采用面向对象方法开发软件的采用面向对象方法开发软件的基本目的基本目的和和主要优点主要优点,是,是通过重用提高软件生产率通过重用提高软件生产率。n因此,因此,应该优先选用应该优先选用能够能够最完整最完整、最准确最准确地地表达问题域表达问题域语义语义的的面向对象语言面向对象语言。12.1.3 选择面向对象语言选择面向对象语言14 3. 类库和开发环境类库和开发环境n考虑类库的时候,不仅应该考虑考虑类库的时候,不仅应该考虑是否提供了类库是否提供了类库,还应,还应该考虑该考虑类库中提供了哪些有价
15、值的类类库中提供了哪些有价值的类。n为便于为便于积累可重用的类积累可重用的类和重和重用已有的类用已有的类,在开发环境中,在开发环境中,除了提供前述的除了提供前述的基本软件工具基本软件工具外,还外,还应该提供应该提供使用方便使用方便的的类库编辑工具类库编辑工具和和浏览工具浏览工具。12.1.3 选择面向对象语言选择面向对象语言15 4. 其他因素其他因素在选择编程语言时,应该考虑的其他因素还有:在选择编程语言时,应该考虑的其他因素还有: n对对用户学习用户学习面向对象分析、设计和编码技术所能面向对象分析、设计和编码技术所能提供的提供的培训服务培训服务;n在在使用使用这个面向对象语言这个面向对象语
16、言期间期间能能提供的技术支持提供的技术支持;n能能提供给开发人员使用提供给开发人员使用的的开发工具开发工具、开发平台开发平台;n对对机器机器性能性能和和内存内存的需求;的需求;n集成集成已有软件已有软件的的容易程度容易程度等。等。12.1.3 选择面向对象语言选择面向对象语言16 12.2 程序设计风格程序设计风格良好的面向对象程序设计风格良好的面向对象程序设计风格n 既包括既包括传统的程序设计传统的程序设计风格准则风格准则,n 也包括为适应面向对象方法所特有的概念也包括为适应面向对象方法所特有的概念(例如,继承例如,继承性性)而必须而必须遵循的一些新准则遵循的一些新准则。良好的程序设计风格良
17、好的程序设计风格n 不仅能明显不仅能明显减少维护或扩充的开销减少维护或扩充的开销,n 而且有助于在新项目中而且有助于在新项目中重用已有的程序代码重用已有的程序代码。良好的程序设计风格对保证程序质量是非常重要性的良好的程序设计风格对保证程序质量是非常重要性的。17 软件重用有软件重用有多个层次多个层次,在,在编码阶段编码阶段主要涉及代码重用问题。主要涉及代码重用问题。代码重用一般有两种:代码重用一般有两种:n 一种是一种是本项目内本项目内的的代码重用代码重用,n 另一种是另一种是新项目新项目重用重用旧项目旧项目的代码的代码。n 内部重用主要是找出内部重用主要是找出设计中相同或相似的部分设计中相同
18、或相似的部分,然后利,然后利用用继承机制共享它们继承机制共享它们。12.2.1 提高可重用性提高可重用性18 提高可重用性准则提高可重用性准则1. 提高方法的内聚提高方法的内聚n一个方法一个方法(即服务即服务)应该只完成应该只完成单个功能单个功能。如果某个方法涉。如果某个方法涉及及两个或多个不相关的功能两个或多个不相关的功能,则应该把它,则应该把它分解成几个更小分解成几个更小的方法的方法。2. 减小方法的规模减小方法的规模n应该减小方法的规模,如果某个方法规模过大,则应该把应该减小方法的规模,如果某个方法规模过大,则应该把它它分解成几个更小的方法分解成几个更小的方法。 3. 保持方法的一致性保
19、持方法的一致性n一般说来,一般说来,功能相似的方法功能相似的方法应该应该有一致的名字有一致的名字、参数特征参数特征、返回值类型、使用条件及出错条件等。返回值类型、使用条件及出错条件等。19 4. 把策略与实现分开把策略与实现分开 为提高可重用性,在编程时不要把为提高可重用性,在编程时不要把策略策略和和实现实现放在同一个方法中,应放在同一个方法中,应该把该把算法的核心部分算法的核心部分放在一个单独的具体放在一个单独的具体实现方法实现方法中。为此需要从中。为此需要从策策略方法略方法中提取出具体参数,作为调用中提取出具体参数,作为调用实现方法实现方法的变元的变元。什么是策略方什么是策略方法和实现方法
20、和实现方法?法?n一类方法负责做出决策,提供变元,并且管理全局资源,可称为一类方法负责做出决策,提供变元,并且管理全局资源,可称为策策略方法略方法。n另一类方法负责完成具体的操作,但却并不做出是否执行这个操作另一类方法负责完成具体的操作,但却并不做出是否执行这个操作的决定,也不知道为什么执行这个操作,可称为的决定,也不知道为什么执行这个操作,可称为实现方法实现方法。n 策略方法应该检查系统运行状态,并处理出错情况,它们并不直接完成计策略方法应该检查系统运行状态,并处理出错情况,它们并不直接完成计算或实现复杂的算法。策略方法通常紧密依赖于具体应用,这类方法比较容算或实现复杂的算法。策略方法通常紧
21、密依赖于具体应用,这类方法比较容易编写,也比较容易理解。易编写,也比较容易理解。n 实现方法仅仅针对具体数据完成特定处理,通常用于实现复杂的算法。实实现方法仅仅针对具体数据完成特定处理,通常用于实现复杂的算法。实现方法并不制定决策,也不管理全局资源,如果在执行过程中发现错误,它现方法并不制定决策,也不管理全局资源,如果在执行过程中发现错误,它们应该只返回执行状态而不对错误采取行动。由于实现方法是自含式算法,们应该只返回执行状态而不对错误采取行动。由于实现方法是自含式算法,相对独立于具体应用,因此,在其他应用系统中也可能重用它们。相对独立于具体应用,因此,在其他应用系统中也可能重用它们。20 5
22、. 全面覆盖全面覆盖n针对针对输入条件的所有组合输入条件的所有组合写出方法。写出方法。n对对空值空值、极限值极限值及及界外值界外值等等异常情异常情况也应该能够作出有况也应该能够作出有意义的响应意义的响应。6. 尽量不使用全局信息尽量不使用全局信息n应该尽量降低应该尽量降低方法与外界方法与外界的的耦合程度耦合程度,不使用全局信息,不使用全局信息是降低耦合度的一项主要措施是降低耦合度的一项主要措施。21 7. 利用继承机制利用继承机制n调用子过程。调用子过程。 n分解因子。分解因子。n使用委托。使用委托。n把代码封装在类中把代码封装在类中。(1)调用子过程)调用子过程 最简单的做法是把最简单的做法
23、是把公共的代码分离出来公共的代码分离出来,构成一个构成一个被被其他方法调用的公用方法其他方法调用的公用方法。如下图所示:。如下图所示:22 7. 利用继承机制利用继承机制 (2)分解因子分解因子 从从不同类不同类的的相似方法相似方法中中分解出分解出不同的不同的“因子因子”(即即不同的不同的代码代码),把余下的代码作为,把余下的代码作为公用方法公用方法中的中的公共代码公共代码,把分,把分解出的因子作为解出的因子作为名字相同算法不同的方法名字相同算法不同的方法,在不同类中,在不同类中定义,并被这个公用方法调用定义,并被这个公用方法调用。 如图所示如图所示:使用这种途径通常额外定义一个抽象基类,使用
24、这种途径通常额外定义一个抽象基类,并在这个抽象基类中定义公用方法。并在这个抽象基类中定义公用方法。23 7. 利用继承机制利用继承机制 (3)使用委托使用委托n当确实存在当确实存在一般一般-特殊特殊关系时,使用关系时,使用继承继承才是恰当的。继才是恰当的。继承机制使用不当将造成程序难于理解、修改和扩充。承机制使用不当将造成程序难于理解、修改和扩充。n当逻辑上不存在一般当逻辑上不存在一般-特殊关系时,为重用已有的代码,特殊关系时,为重用已有的代码,可以利用可以利用委托机制委托机制。(4)把代码封装在类中把代码封装在类中 程序员往往希望重用用其他方法编写的、解决同一程序员往往希望重用用其他方法编写
25、的、解决同一类应用问题的程序代码。重用这类代码的一个比较安类应用问题的程序代码。重用这类代码的一个比较安全的途径,是把被全的途径,是把被重用的代码封装在类重用的代码封装在类中。中。24 12.2.2 提高可扩充性提高可扩充性n封装实现策略封装实现策略n不要用一个方法遍历多条关联链不要用一个方法遍历多条关联链n避免使用多分支语句避免使用多分支语句n精心确定公有方法精心确定公有方法 提高可重用性的准则,也能提高提高可重用性的准则,也能提高程序的可扩充性程序的可扩充性,下,下列的面向对象程序列的面向对象程序设计准则设计准则也有助于提高可扩充性。也有助于提高可扩充性。1. 封装实现策略封装实现策略 应
26、该把类的实现策略应该把类的实现策略(包括描述属性的数据结构、包括描述属性的数据结构、修改属性的算法等修改属性的算法等)封装起来,对外只提供公有的接口,封装起来,对外只提供公有的接口,否则将降低今后修改数据结构或算法的自由度。否则将降低今后修改数据结构或算法的自由度。25 12.2.2 提高可扩充性提高可扩充性2. 不要用一个方法遍历多条关联链不要用一个方法遍历多条关联链 一个方法应该只包含对象模型中的有限内容。违一个方法应该只包含对象模型中的有限内容。违反这条准则将导致方法过分复杂,既不易理解,也不反这条准则将导致方法过分复杂,既不易理解,也不易修改扩充。易修改扩充。3.避免使用多分支语句避免
27、使用多分支语句 一般说来,可以利用一般说来,可以利用DO_CASE语句测试对象的语句测试对象的内部状态,而不要用来根据内部状态,而不要用来根据对象类型对象类型选择选择应有的行为应有的行为,否则在增添新类时将不得不修改原有的代码。应该合否则在增添新类时将不得不修改原有的代码。应该合理地利用理地利用多态性机制多态性机制,根据对象当前类型,自动决定,根据对象当前类型,自动决定应有的行为。应有的行为。26 12.2.2 提高可扩充性提高可扩充性4.精心确定精心确定公有方法公有方法n 公有方法公有方法是向公众公布的接口。对这类方法的修改是向公众公布的接口。对这类方法的修改往往会涉及许多其他类,因此,修改
28、公有方法的代价往往会涉及许多其他类,因此,修改公有方法的代价通常都比较高。通常都比较高。n 为提高可修改性,降低维护成本,必须精心选择和为提高可修改性,降低维护成本,必须精心选择和定义公有方法。定义公有方法。n 私有方法私有方法是仅在类内使用的方法,通常利用私有方是仅在类内使用的方法,通常利用私有方法来实现公有方法。法来实现公有方法。n 删除、增加或修改私有方法所涉及的面要窄得多,删除、增加或修改私有方法所涉及的面要窄得多,因此代价也比较低。因此代价也比较低。27 12.2.3 提高健壮性提高健壮性n预防用户的操作错误预防用户的操作错误n检查参数的合法性检查参数的合法性n不要预先确定限制条件不
29、要预先确定限制条件n先测试后优化先测试后优化 必须认识到,对于任何一个实用软件来说,健壮性必须认识到,对于任何一个实用软件来说,健壮性都是都是不可忽略的质量指标不可忽略的质量指标。 为了提高健壮性,应遵循如下为了提高健壮性,应遵循如下4条规则:条规则: 所谓所谓健壮性健壮性就是在硬件故障、输入的数据无效或操作就是在硬件故障、输入的数据无效或操作错误等意外环境下,系统能做出适当响应的程度。错误等意外环境下,系统能做出适当响应的程度。28 1. 预防用户的操作错误预防用户的操作错误n软件系统必须具有处理用户操作错误的能力。软件系统必须具有处理用户操作错误的能力。n任何一个接收用户输入数据的方法,对
30、其接收到的任何一个接收用户输入数据的方法,对其接收到的数据都必须进行检查,即使发现了非常严重的错误,数据都必须进行检查,即使发现了非常严重的错误,也应该给出恰当的提示信息,并准备再次接收用户也应该给出恰当的提示信息,并准备再次接收用户的输入,不能运行中断或的输入,不能运行中断或“死机死机”。2.检查参数的合法性检查参数的合法性 对公有方法,尤其应该着重检查其参数的对公有方法,尤其应该着重检查其参数的合法性合法性,因,因为用户在使用公有方法时可能违反参数的约束条件。为用户在使用公有方法时可能违反参数的约束条件。12.2.3 提高健壮性提高健壮性29 3.不要预先确定限制条件不要预先确定限制条件n
31、在设计阶段,往往很难准确地预测出应用系统中使在设计阶段,往往很难准确地预测出应用系统中使用的用的数据结构数据结构的最大容量需求。因此不的最大容量需求。因此不应该预先设应该预先设定限制条件定限制条件。n如果有必要和可能,则应该使用如果有必要和可能,则应该使用动态内存分动态内存分配机制,配机制,创建未预先设定限制条件的数据结构。创建未预先设定限制条件的数据结构。4.先测试后优化先测试后优化n为在为在效率效率与与健壮性健壮性之间做出之间做出合理的折衷合理的折衷,应该在为,应该在为提高效率而进行优化之前,先测试程序的性能。提高效率而进行优化之前,先测试程序的性能。n经过测试,合理地确定为经过测试,合理
32、地确定为提高性能提高性能应该应该着重优化的着重优化的关键部分关键部分。30 12.3 测试策略测试策略n测试软件的测试软件的经典策略经典策略是:从是:从单元测试单元测试开始,逐步进入开始,逐步进入集成集成测试测试,最后进行,最后进行确认测试确认测试和和系统测试系统测试。n测试面向对象软件的策略与上述策略基本相同,但也有测试面向对象软件的策略与上述策略基本相同,但也有许许多新特点多新特点。 31 12.3.1 面向对象的单元测试面向对象的单元测试n考虑面向对象的软件时,单元的考虑面向对象的软件时,单元的概念概念改变了。改变了。n最小的可最小的可测试单元测试单元是是封装起来的封装起来的类和对象类和
33、对象。n一个类可以包含一组不同的操作,而一个特定的操作也可一个类可以包含一组不同的操作,而一个特定的操作也可能存在于一组不同的类中。因此,对于面向对象的软件来能存在于一组不同的类中。因此,对于面向对象的软件来说,说,单元测试的含义发生了很大变化单元测试的含义发生了很大变化。n测试面向对象软件时,不能再孤立地测试单个操作,而应测试面向对象软件时,不能再孤立地测试单个操作,而应该把该把操作作为类的一部分来测试操作作为类的一部分来测试。32 基类:操作基类:操作A:X子类:操作子类:操作A1:XA2:XA3:X有必要有必要在每个在每个子类中子类中测试操测试操作作 X 不孤立地测试单个操作(函数),而
34、是把操作作为类不孤立地测试单个操作(函数),而是把操作作为类的一部分进行测试。的一部分进行测试。例如,假设有例如,假设有一个类层次一个类层次,操作操作X在超类中定义并被一组子在超类中定义并被一组子类继承,每个子类都使类继承,每个子类都使用操作用操作X,但是,但是,X调用子类中定义调用子类中定义的操作并的操作并处理子类的私有属性处理子类的私有属性。由于在不同的子类中使用操。由于在不同的子类中使用操作作X的环境有微妙的差别,因此有必要在每个子类的语境中的环境有微妙的差别,因此有必要在每个子类的语境中测试操作测试操作X。33 12.3.2 面向对象的集成测试面向对象的集成测试n在面向对象的软件中在面
35、向对象的软件中不存在不存在层次的控制结构层次的控制结构,传统的,传统的自顶自顶向下向下或或自底向上自底向上的集成策略就的集成策略就没有意义没有意义了。了。n面向对象软件的面向对象软件的集成测试集成测试主要有下述主要有下述两种不同的策略两种不同的策略。q基于基于线程的测试线程的测试(thread based testing)这种策略把这种策略把响应系统响应系统的的一个输入一个输入或或一个事件一个事件所需要的那所需要的那些类集成起来些类集成起来。分。分别集成并测试每个线程,同时应用回归测试以保证没有产生副作用别集成并测试每个线程,同时应用回归测试以保证没有产生副作用。q基于基于使用的测试使用的测试
36、(use based testing)首先测试几乎不使用服务器类的那些类(称为独立类),把独立类都测试首先测试几乎不使用服务器类的那些类(称为独立类),把独立类都测试完之后,再测试使用独立类的下一个层次的类(称为依赖类)。对依赖类完之后,再测试使用独立类的下一个层次的类(称为依赖类)。对依赖类的测试一个层次一个层次地持续进行下去,直至把整个软件系统构造完为的测试一个层次一个层次地持续进行下去,直至把整个软件系统构造完为止。止。n集群测试(集群测试(cluster testing)是面向对象软件集成测试的)是面向对象软件集成测试的一个步骤,检查一群相互协作的类,力图发现协作错误。一个步骤,检查一
37、群相互协作的类,力图发现协作错误。34 12.3.3 面向对象的确认测试面向对象的确认测试n在在确认测试确认测试或或系统测试系统测试层次,层次,不再考虑不再考虑类之间相类之间相互连接的互连接的细节。细节。n和传统的确认测试一样,面向对象软件的确认测试也和传统的确认测试一样,面向对象软件的确认测试也集中集中检查用户可见的动作检查用户可见的动作和和用户可识别的输出用户可识别的输出。n传统的传统的黑盒测试方法黑盒测试方法也可用于设计确认测试用例,但是,也可用于设计确认测试用例,但是,对于面向对象的软件来说,主要还是根据对于面向对象的软件来说,主要还是根据动态模型动态模型和和描述描述系统行为的脚本系统
38、行为的脚本来设计来设计确认测试用例确认测试用例。 35 12.4 设计测试用例设计测试用例 目前,面向对象软件的测试用例的设计方法,还处目前,面向对象软件的测试用例的设计方法,还处于于研究、发展阶段研究、发展阶段。 与与传统软件测试不同传统软件测试不同,面向对象测试关注于设计适,面向对象测试关注于设计适当的当的操作序列操作序列以以检查类检查类的的状态状态。12.4.1 12.4.1 测试类的方法测试类的方法 对面向对象的软件来说,对面向对象的软件来说,小型测试小型测试着重测试着重测试单个单个类类和和类中封装类中封装的的方法方法。测试单个类的方法主要有。测试单个类的方法主要有3种种:n 随机测试
39、;随机测试;n 划分测试;划分测试;n 基于故障的测试基于故障的测试。36 1. 随机测试随机测试n随机地产生随机地产生一系列一系列不同的操作序列不同的操作序列,执行这些测试用例,执行这些测试用例,可以测试可以测试类实例类实例的的不同生存历史不同生存历史。 ATM系统中系统中account(帐户)类的操作有:帐户)类的操作有:Open(打开)、打开)、Setup(建立)、建立)、Deposit(存款)、存款)、Withdraw(取款)、取款)、Balance(余额)、余额)、Summarize(清单)、清单)、CreditLimit(透支限透支限额)、额)、Close(关闭)。关闭)。 可以随
40、机地产生可以随机地产生一系列不同的操作序列一系列不同的操作序列进行测试进行测试:n测试用例测试用例1:Open.Setup.Deposit.Balance.Summarize.Withdraw.Closen测试用例测试用例2: Open.Setup.Withdraw.Deposit.Balance.CreditLimit.Close37 2. 划分测试划分测试 与测试与测试传统软件传统软件时采用时采用等价划分方法类似等价划分方法类似,采用划分测,采用划分测试方法可以减少试方法可以减少测试类时测试类时所需要的所需要的测试用例的数量测试用例的数量。n首先,把首先,把输入输入和和输出输出分类;分类;
41、n然后,然后,设计测试用例设计测试用例以以测试测试划分出的划分出的每个类别每个类别。 划分类别的方法有划分类别的方法有3种:种:q基于基于状态状态的划分的划分q基于基于属性属性的划分的划分q基于基于功能功能的划分的划分38 (1)基于状态的划分基于状态的划分 考虑考虑account类,类,状态操作状态操作包括包括deposit和和withdraw; 而而非状态操作非状态操作有有balance, summarize和和creditLimit。 设计测试用例,以分别测试设计测试用例,以分别测试改变状态改变状态的操作和的操作和不改变状态不改变状态的操作。例如,用这种方法可以设计出如下的测试用例的操作。例如,用这种方法可以设计出如下的测试用例: 测试用例测试用例#p1:opensetupdepositdepositwithdrawwithdrawclose测试用例测试用例#p2:opensetupdepositsummarizecreditLimitwithdrawclose操作改变操作改变状态状态操作不改操作不改变状态变状态这种方法根据这种方法根据类操作类操作改变类状态改变类状态的的能力能力来来划分类操作划分类操作。39 (2)基于属性的划分基于属性的划分对于对于account类来说,可以使用类来说,可以
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国豆浆消泡剂行业市场运行分析及竞争格局与投资发展研究报告
- 2025-2030中国药用食品行业供需分析及发展前景研究报告
- 2025-2030中国膨胀聚丙烯行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国电动浴台行业市场发展趋势与前景展望战略研究报告
- 胰腺囊腺瘤的临床护理
- 2025年电子商务师职业资格考试题库:电子商务平台用户体验设计试题
- 2025年初中学业水平考试地理模拟卷地理国情认知地理信息系统在交通管理中的应用试题
- 2025年专升本艺术概论考试模拟卷:艺术创作分析能力培养策略试题
- 2025年中学教师资格考试《综合素质》易错易混题集(含答案)实战经验分享
- 2025年小学英语毕业考试模拟卷:英语阅读理解技巧与阅读速度提升方法解析试题
- 中药学习题集(总论-第二十章,附标准答案)
- X线腰椎临床意义
- 2012年7月国家开放大学专本科《法律文书》期末纸质考试试题及答案
- 统编版语文六年级下册第一单元“民风民俗”作业设计
- 中国银行课件模板7
- DB3301T 1118-2023 秀珍菇设施栽培技术规程
- 双全日培训课件
- 甲油胶行业报告
- 医务人员职业暴露与防护讲课
- 山东省莱西市2024-2025学年高一语文下学期3月月考试题含解析
- 康复科人员岗位考核制度(3篇)
评论
0/150
提交评论