1、2018/3/11,第9章 面向对象实现,面向对象实现主要包括两项工作:第一项工作是把面向对象设计结果,翻译成用某种程序设计语言书写的面向对象程序;第二项工作是测试并调试面向对象的程序。 面向对象程序的质量基本上由面向对象设计的质量决定。,Page 1,2018/3/11,目前,软件测试仍然是保证软件可靠性的主要措施,对于面向对象的软件来说,情况也是如此。面向对象测试的目标,也是用尽可能低的测试成本和尽可能少的测试方案,发现尽可能多的错误。面向对象程序中特有的封装、继承和多态等机制,也给面向对象测试带来一些新特点,增加了测试和调试的难度。,第9章 面向对象实现,Page 2,2018/3/11
2、,9.1.1 面向对象语言的优点,面向对象设计结果既可以用面向对象语言也可用非面向对象语言实现. 使用面向对象语言,实现面向对象概念,远比使用非面向对象语言方便。,Page 3,2018/3/11,9.1.1 面向对象语言的优点,选择编程语言的关键因素:语言的一致的表达能力、可重用性及可维护性。 1. 一致的表示方法表示方法从问题域到OOA,从OOA到OOD,最后从OOD到面向对象编程(OOP),始终稳定不变。 2. 可重用性为了能带来可观的商业利益,必须在更广泛的范围中运用重用机制,而不仅仅在设计这个层次上进行重用。,Page 4,2018/3/11,9.1.1 面向对象语言的优点,3. 可
3、维护性在软件工程过程中强调文档与源程序一致,但在实际交付时,两个文档要保持完全一致是很难做到的。特别是在实际项目中,当涉及到进度、预算、人力资源等因素时,要想两类文档完全一致几乎是不可能的。维护人员面对的往往只有源程序本身。一般来说,应该尽量选用面向对象语言来实现面向对象分析、设计的结果。,Page 5,2018/3/11,一般说来,纯面向对象语言着重支持面向对象方法研究和快速原型的实现,而混合型面向对象语言的目标则是提高运行速度和使传统程序员容易接受面向对象思想。成熟的面向对象语言通常都提供丰富的类库和强有力的开发环境。 下面介绍在选择面向对象语言时应该着重考察的一些技术特点。,9.1.2
4、面向对象语言的技术特点,Page 6,2018/3/11,1. 支持类与对象概念的机制所有面向对象语言都允许用户动态创建对象,并且可以用指针引用动态创建的对象。允许动态的创建对象,就意味着系统必须处理内在管理问题,如果不及时释放不再需要的对象所占用的内存动态存储分配就有可能耗尽内存。有两种管理内存的方法:一种由语言的运行机制自动管理内存,即提供自动回收“垃圾”的机制。另一种是由程序员编写释放内存的代码。,9.1.2 面向对象语言的技术特点,Page 7,2018/3/11,2. 实现整体-部分结构的机制有两种方法实现,分别使用指针和独立的关联对象实现整体-部分结构。 3. 实现一般-特殊结构的
5、机制这里既包括实现继承的机制也包括解决名字冲突的机制。名字冲突:在多个基类中可能出现的重名问题;这只有在支持多重继承的语言中才会遇到。不论是何种语言,程序员都应该尽力避免出现名字冲突。,9.1.2 面向对象语言的技术特点,Page 8,2018/3/11,4. 实现属性和服务的机制对于实现属性机制应该着重考虑:支持实例连接机制;属性的可见性控制;对属性值的约束。对于服务,应该考虑:支持消息连接的机制;控制服务可见性的机制;动态联编。动态联编:指应用系统在运行过程中,当需要执行一个特定服务的时候,选择实现该服务的适当算法的能力。动态联编机制使得程序员在向对象发送消息时拥有较大自由,在发送消息前,
6、无须知道消息的对象当时属于哪个类。,9.1.2 面向对象语言的技术特点,Page 9,2018/3/11,5. 类型检查按照编译时进行类型检查的严格程度来分,程序设计语言可以分为:弱类型和强类型。弱类型:每个变量或属性隶属于于一个对象。强类型:每个变量或属性必须准确地属于某个特定的类。一个重要的区别是,弱类型的语言的东西没有明显的类型,他能随着环境的不同,自动变换类型而强类型则没这样的规定,不同类型间的操作有严格定义,只有相同类型的变量才能操作,虽然系统也有一定的默认转换,当绝没有弱类型那么随便 。,9.1.2 面向对象语言的技术特点,Page 10,2018/3/11,5. 类型检查强类型的
7、优点:一是有利于在编译时发现程序的错误;二是增加了优化的可能性。强类型用于开发软件产品,弱类型用于快速开发原型。,9.1.2 面向对象语言的技术特点,Page 11,2018/3/11,6. 类库-大数据面向对象语言都提供一个实用的类库某些语言本身并没有规定提供什么样的类库,而是由实现这种语言的编译系统自行提供类库。在类库中还可以找到实现各种关联的类。更完整的类库通常还提供独立于具体设备的接口类(如输入/输出流)。还有实现窗口系统的用户界面类,它们构成一个相对独立的图形库。,9.1.2 面向对象语言的技术特点,Page 12,2018/3/11,7. 效率人们一般认为面向对象语言的主要缺点是效
8、率低。事实上,使用拥有完整类库的面向对象语言,有时能比使用非面向对象语言得到运行更快的代码。认为面向对象语言效率低的另一个原因:运行时使用动态联编实现多态性,需要在运行时查找继承树。其实,优化查找过程后,可以实现高效查询。,9.1.2 面向对象语言的技术特点,Page 13,2018/3/11,8. 持久保存对象希望数据能够不依赖于程序执行的生命期而长时间保存下来,则需要提供某种保存数据的方法。希望长期保存数据主要出于以下两个原因:为实现在不同程序之间传递数据;为恢复被中断了的程序的运行;一些面向对象语言没有提供直接存储对象的机制,需要用户自己管理对象的输入/输出。或购买面向对象数据库系统。,
9、9.1.2 面向对象语言的技术特点,Page 14,2018/3/11,8. 持久保存对象一些面向对象语言把当前的执行状态完整地保存在磁盘上。还有些则提供了访问磁盘对象的输入/输出操作。理想:使程序设计语言语法与对象存储管理语法实现无缝集成。,9.1.2 面向对象语言的技术特点,Page 15,2018/3/11,9. 参数化类如:对于一个向量类来说,不论是整型向量、浮点型向量,还是其他类型的向量,对其数据元素的基本操作是相同的(插入、删除、检索)。当然,不同向量的数据元素的类型是不同的。如果程序语言提供一种能抽象出这类共性的机制,则对减少冗余和提高可重用性大有好处。,9.1.2 面向对象语言
10、的技术特点,Page 16,2018/3/11,9. 参数化类所谓参数化类,就是使用一个或多个类型去参数化一个类的机制。程序员就可以先定义一个参数化类的模板,然后把数据类型作为参数传递进来,从而把这个类模板用在不同的应用程序中,或用在同一应用程序的不同部分。,9.1.2 面向对象语言的技术特点,Page 17,2018/3/11,10. 开发环境软件工具和软件工程环境对软件生产率有很大影响。由于面向对象程序中继承关系和动态联编等引入的特殊复杂性,面向对象语言所提供的软件工程或开发环境就显得尤为重要。至少应该包括下列一些最基本的软件工具:编辑程序、编译程序或解释程序、浏览工具、调度器等。,9.1
11、.2 面向对象语言的技术特点,Page 18,2018/3/11,10. 开发环境在评价调试器时,首先应该弄清楚它是针对原始的面向对象源程序,还是针对中间代码进行调试。如果是针对中间代码进行调试会给调试人员带来许多不便。另外,高度器应该能够查看属性值和分析消息连接的后果。在开发大型系统的时候,需要有系统构造工具和变动控制工具。因此,应该考虑语言本身是否提供了这种工具,或者该语言能否与现有的工具很好地集成起来。,9.1.2 面向对象语言的技术特点,Page 19,2018/3/11,开发人员在选择面向对象语言时,还应该着重考虑以下一些实际因素。 1. 将来能否占主导地位2. 可重用性,9.1.3
12、 选择面向对象语言,Page 20,2018/3/11,3. 类库和开发环境语言、开发环境和类库这三个因素共同决定了可重用性。不仅考虑是否提供了类库,还应该考虑类库中提供了哪些有价值的类。另外,还应该提供使用方便的类库编辑工具和浏览工具,其中的类库浏览工具应该具有强大的联想功能。,9.1.3 选择面向对象语言,Page 21,2018/3/11,4. 其他因素对学习面向对象分析、设计和编码技术所能提供的培训服务;在使用过程期间提供的技术支持;能提供给开发人员使用的开发工具、开发平台和发行平台;对机器性能和内在的需求;集成已有软件的容易程度。,9.1.3 选择面向对象语言,Page 22,201
13、8/3/11,良好的程序设计风格对面向对象实现来说尤其重要,不仅能明显减少维护或扩充的开销,而且有助于在新项目中重用已有的程序代码。既包括传统的程序设计风格准则,也包括为适应面向对象方法所特有的概念(例如,继承性)而必须遵循的一些新准则。,9.2 程序设计风格,Page 23,2018/3/11,面向对象方法的一个主要目标,就是提高软件的可重用性。软件重用有多个层次,在编码阶段主要考虑代码重用的问题。代码重用有两种:一种是本项目内的代码重用;另一种是新项目重用旧项目的代码。,9.2.1 提高可重用性,Page 24,2018/3/11,9.2.1 提高可重用性,内部重用:利用继承机制共享。为做
14、到外部重用(即一个项目重用另一项目的代码),必须有长远眼光,需要反复考虑精心设计。虽然为实现外部重用所需要考虑的面,比为实现内部重用而需要考虑的面更广,但是,有助于实现这两类重用的程序设计准则却是相同的。下面讲述主要的准则。,Page 25,2018/3/11,1. 提高方法的内聚一个方法(服务)应该只完成单个功能。 2. 减小方法的规模如果某个方法规模过大(代码长度超过一页纸可能就太大了),则应该把它分解成几个更小的方法。 3. 保持方法的一致性一般来说,功能相似的方法应该有一致的名字、参数特征(包括参数个数、类型和次序)、返回值类型、使用条件、出错条件等。,9.2.1 提高可重用性,Pag
15、e 26,2018/3/11,4. 把策略与实现分开 有两种不同类型的方法:一类方法负责做出决策,提供变元,并且管理全局资源,可称为策略方法;另一类方法负责完成具体的操作,但却不做出是否执行这个操作的决定,也不知道为什么执行这个操作,可称为实现方法。,9.2.1 提高可重用性,Page 27,2018/3/11,策略方法负责检查系统运行状态,处理出错情况,但并直接完成计算或实现复杂算法,通常面向用户的具体应用,此类方法容易编写,也容易理解。实现方法仅针对具体数据的特定处理,通常用于实现复杂的算法。与系统决策无关,也不管理全局资源,如果在执行中发现错误,只负责返回相关状态,不对错误采取行为。其针
16、对的是具体的应用。,9.2.1 提高可重用性,Page 28,2018/3/11,为提高可重用性,在编程时不要把策略和实现放在同一个方法中,应该把算法的核心部分放在一个单独的具体实现方法中。为此需要从策略方法中提取出具体参数,作为调用实现方法的变元。,9.2.1 提高可重用性,Page 29,2018/3/11,5.全面覆盖如果输入条件的各种组合都可能出现,则应该针对所有组合写出方法,而不能仅仅针对当前用到的组合情况写方法。此外,一个方法不应该只处理正常值,对空值、极限值及界外值等异常情况也应该能够做出有意义的响应。,9.2.1 提高可重用性,Page 30,2018/3/11,6.尽量不使用
17、全局信息7.利用继承机制在面向对象程序中,使用继承机制是实现共享和提高重用程度的主要途径。,9.2.1 提高可重用性,Page 31,2018/3/11,9.2.1 提高可重用性,(1) 调用子过程最简单的做法是把公共代码分离出来,构成一个被其他方法调用的公用方法。可以在基类中定义这个共用方法,供派生类的方法调用。,图9.1 通过调用公用方法实现代码重用,Page 32,2018/3/11,9.2.1 提高可重用性,(2) 分解因子从不同类的相似方法中分解出不同的“因子”,把余下的代码作为公共代码,把分解出的因子作为名字算法不同的方法,入在不同的类中定义,并被这个公用方法调用。,图9.2 通过
18、因子分解实现代码重用,Page 33,2018/3/11,9.2.1 提高可重用性,(2) 分解因子继承关系的存在意味着子类“即是”父类,因此,父类的所有方法和属性应该都适用于子类。如果继承机制使用不当将造成程序难于理解。,图9.2 通过因子分解实现代码重用,Page 34,2018/3/11,9.2.1 提高可重用性,(3) 把代码封装在类中程序员往往希望重用其他方法编写的、解决同一类应用问题的程序代码。重用这类代码的一个比较安全的途径,是把重用代码封装在类中。,Page 35,2018/3/11,9.2.2 提高可扩充性,1. 封装实现策略把类的实现策略封装起来,对外只提供接口。 2. 不
19、要用一个方法遍历多条关联链一个方法只包含对象模型中的有限内容。,Page 36,2018/3/11,9.2.2 提高可扩充性,3. 避免使用多分支语句不要用多分支语句来根据对象类型选择应有的行为。该合理地利用多态性机制,根据对象当前类型自动决定应有的行为。 4. 精心确定公有方法公有方法是向公众公布的接口,对这类方法的修改往往会涉及许多其他类,修改时的代价比较高,而私有类则相反。,Page 37,2018/3/11,程序员在编写实现方法的代码时,既应该考虑效率,也应该考虑健壮性。通常需要在健壮性与效率之间做出适当的折中。必须认识到,对于任何一个实用软件来说,健壮性都是不可忽略的质量指标。为提高
20、健壮性应该遵守以下几条准则。,9.2.3 提高健壮性,Page 38,2018/3/11,9.2.3 提高健壮性,1. 预防用户的操作错误任何系统必须具有处理用户操作错误的能力。 2. 检查参数的合法性对公有方法,尤其应该着重检查其参数的合法性,因为用户在使用公有方法时可能违反参数的约束条件。 3. 不要预先确定限制条件在设计阶段不应该预先设定限制条件。 4. 先测试后优化为提高效率而进行优化前先测试程序的性能。,Page 39,2018/3/11,9.3 测试策略,软件测试是保证软件质量的一个重要手段,随着面向对象技术在软件工程中日益推广和使用,传统的结构化测试技术和方法受到了极大的冲击,面
21、向软件测试技术是新兴的软件测试技术,是专门针对使用面向对象技术开发的软件而提出的一种测试技术,是面向对象软件开发中的不可缺少的一环,已成为保证面向对象软件质量、提高其可靠性的关键。,Page 40,2018/3/11,9.3 测试策略,(1)测试面向对象软件的特殊性 面向对象开发技术新增了多态、继承、封装等特点,也影响了软件测试的方法和内容,增加了软件测试的难度,带来了传统软件设计技术所不存在的错误 。从程序的组织结构方面来讲,传统软件测试技术与过程式程序中数据和操作相分离的特点相适应,是从输入处理输出的角度检验函数或过程能否正确工作。,Page 41,2018/3/11,9.3 测试策略,(
22、1)测试面向对象软件的特殊性 面向对象程序设计把程序看作是相互协作而又彼此独立的对象的集合在面向对象程序中,对象是属性(数据)和方法(操作)的封装体。每个对象就像一个传统意义上的小程序,有自己的数据、操作、功能和目的。因此,传统的测试技术必须经过改造才能用于面向对象软件的测试,同时,还需要研究专门针对面向对象软件、适应面向对象软件特定的测试理论和技术 。,Page 42,2018/3/11,9.3 测试策略,(2)面向对象技术的特点及其对测试的影响 面向对象程序设计是一种全新的软件开发技术,面向对象程序的封装性、继承性、动态联编等特性使程序具有较大的灵活性,给软件测试提出了新的要求,使得面向对
23、象软件的测试更加复杂。,Page 43,2018/3/11,9.3 测试策略,信息隐蔽对测试的影响类的重要作用之一就是信息隐藏,它对类中所封装的信息的存取进行控制,从而避免类中有关实现细节的信息被错误使用。而这样的细节性信息正是软件测试所不可忽略的。对象具有一定的状态,在工作过程中对象的状态可能被修改产生新的状态。所以对于面向对象的程序测试,对象的状态是必须考虑的因素。面向对象软件测试的基本工作就是创建对象,向对象发送一系列信息后检查结果对象的状态,看其是否处于正确的状态。而对象的状态往往是隐藏的,若类中未提供足够的存取函数来表明对象的实现方式和内部状态,则测试者必须增添这样的函数。因此,类的
24、信息隐藏机制给测试带来困难。,Page 44,2018/3/11,9.3 测试策略,封装性对测试的影响 封装性(Encapsulate把数据和操作数据的方法封装在一起,限制对象属性对外的可见性和外界对它的操作权限。封装性提高了信息隐蔽的能力。 测试应涉及对象的初态、输人参数、输出参数、对象的终态。但是,对象的状态往往是隐蔽的。,Page 45,2018/3/11,9.3 测试策略,继承性对测试的影响 类的继承机制增加了软件测试的复杂性,同时也向测试用例设计者提出了新的挑战。即使是彻底复用的,对每个新的使用语境也需要重新测试。此外,多重继承增加了需要测试语境的数量,从而使测试进一步复杂化。在面向
25、对象的程序中,一个函数可能被封装在多个类中,子类不但继承了父类中的特征(数据和方法),还可以对继承的特征进行重定义。Weyuker的非外延性公理认为,若有两个功能相同而实现不同的程序,对其中一个是充分的测试数据集未必对另一个是充分的。所以,继承并未简化测试问题,反而使测试更加复杂。,Page 46,2018/3/11,9.3 测试策略,多态性对测试的影响 多态性(Polymorphism:同一消息可以根据发生消息的对象不同采取不同的处理方法它使得系统在运行时能自动为给定的消息选择合适的实现代码,这给程序员提供了高度柔性,问题抽象和易于维护但多态性所带来的不确定性,也使得传统测试实践中的静态分析
26、法遇到了不可逾越的障碍。与此同时还增加了系统运行中可能的执行路径,加大了测试用例的选取难度和数量,这种不确定性和骤然增加的路径组合给测试覆盖率的满足带来了挑战,多态性给软件测试带来的问题仍然是目前研究的重点及难点问题之一。,Page 47,2018/3/11,9.3 测试策略,(3)面向对象的软件测试策略扩大测试视角 在面向对象的程序设计中,由于相同的语义结构(如类、属性、操作和消息)出现在分析、设计和代码阶段。面向对象的分析和面向对象的设计模式提供了关于系统的结构和行为的实质性信息,所以应该重视面向对象分析和设计模式的复审,如果问题在分析阶段及设计阶段未被检测到,则将传送到编码中,要花费大量
27、的精力和时间去实现一个不必要(有问题)的属性、不必要的操作、驱动对象间通信的消息及其他相关的代码,然后再花费更多的精力去发现它,还必须对系统进行相关的修改,而修改有可能导致更多的潜在问题因此,面向对象的软件测试应扩大测试的视角,包括分析与设计模型测试、类测试、对象交互测试、类层次结构测试、面向对象系统测试五大部分。,Page 48,2018/3/11,9.3 测试策略,(3)面向对象的软件测试策略划分测试层次 软件测试层次是基于测试复杂性分解的思想,是软件测试的一种基本模式。传统层次测试基于功能模块的层次结构,而在面向对象软件测试中,继承和组装关系刻画了类之间的内在层次,它们既是构造系统结构的
28、基础,也是构造测试结构的基础。对于传统程序设计语言书写的软件,测试分为3个级别的测试:单元测试、集成测试和系统测试。,Page 49,2018/3/11,9.3 测试策略,(3)面向对象的软件测试策略划分测试层次 面向对象软件测试的动态测试工作过程与传统的测试一样分为制定测试计划、产生测试用例、执行测试和评价几个阶段。在测试的具体内容上。从面向对象软件的结构出发。可以将面向对象软件测试分为三个层次:类测试、集成测试和系统测试面向对象的测试层次与传统软件测试层次的对应关系。,Page 50,2018/3/11,9.3 测试策略,(3)面向对象的软件测试策略面向对象测试技术策略 面向对象的类测试策
29、略 类测试就是验证类的实现是否和该类的规格说明完全一致。类测试和传统的单元测试大体相似但和单元测试不同,类测试除了要测试类中包含的方法,还要测试类的状态。在面向对象系统中,系统的基本构造模块是封装了的数据和方法的类和对象,每个对象有自己的生存周期,自己的状态。消息是对象之问相互请求或协作的途径,是外界使用对象方法及获取对象状态的唯一方式。对象的功能是在消息的触发下,由对象所属类中定义的方法与相关对象的合作共同完成。在工作过程中对象的状态可能被改变,产生新的状态。,Page 51,2018/3/11,9.3 测试策略,(3)面向对象的软件测试策略面向对象测试技术策略 面向对象的类测试策略 测试过
30、程中不能仅仅检查输入数据产生的输出结果是否与预期的吻合,还要考虑对象的状态。类测试是整个测试过程的一个重要步骤,测试按顺序可分为三个部分:1)基于服务的测试 测试类中的每一个方法;2)基于状态的测试 测试类的实例在其生命周期各个状态下的情况;3)基于响应状态的测试 从类和对象的责任出发以外界向对象发送的消息序列来测试对象的各个响应状态。目前有很多类的测试方法,如:基于状态图的测试、基于顺序图的测试、基于活动图的测试、基于协作图的测试、基于状态模式的测试等都是针对上述测试的某一个部分。,Page 52,2018/3/11,9.3 测试策略,(3)面向对象的软件测试策略面向对象测试技术策略 集成测
31、试策略集成测试作为重要环节,贯穿于面向对象软件构造过程的始终。面向对象软件的集成测试有两种不同的策略,一种是基于线程的测试,另一种是基于使用的测试。基于线程的测试:集成一组相互协作以对于某输入或事件作出回应的类。每个线程被集成并被分别测试,应用回归测试以保证没有产生副作用。基于使用的测试:通过测试那些不适用的服务器的类(称为独立类)而开始构造系统。在独立测试完成后,下一层的使用独立的类(称为依赖类)被测试依赖类层次的测试序列一直持续到构造完整个系统。,Page 53,2018/3/11,9.3 测试策略,(3)面向对象的软件测试策略面向对象测试技术策略 集成测试策略集群测试(cluster t
32、esting)是面向对象软件集成测试的一个步骤。在这个测试步骤中,用精心设计的测试用例检查一群相互协作的类,这些测试用例力图发现协作错误。,Page 54,2018/3/11,9.3 测试策略,(3)面向对象的软件测试策略面向对象测试技术策略 类间多态性测试策略在面向对象软件集成测试中,最需要克服的问题是类问交互带来的多态性和动态联编的问题。多态分为多态操作和多态变量,操作的多态是指在类继承等级的不同层次中可以是同一个方法,而不同层次中的类可按照各自的需要调用该方法。多态变量是指改变量可以引用不同类的对象。针对类的多态性,人们提出一种正交矩阵测试策略,将正交拉丁矩阵应用到软件测试中,生成测试用
33、例,这种方法能有效减少用例个数,但给出的测试用例个数不能实现充分测试。,Page 55,2018/3/11,9.3 测试策略,(3)面向对象的软件测试策略面向对象测试技术策略 回归测试策略 由于面向对象软件的特殊性使得其测试过程以层次增量方式进行,即首先对类进行测试:然后将多个类集成为类簇或子系统,并进行集成测试:最后将多个类簇或子系统集成为最终系统,并进行系统测试。在单个对象方法或方法的集成测试中,都需要确定对哪些测试用例进行回归测试。面向对象的回归测试不再作为测试的一个独立阶段,而是以增量的方法进行采用层次增量的测试模型。,Page 56,2018/3/11,9.3 测试策略,(3)面向对
34、象的软件测试策略面向对象测试技术策略 确认测试和传统的确认测试一样,面向对象软件的确认测试也集中检查用户可见的动作和用户可识别的输出。为了导出确认测试用例,测试人员应该认真研究动态模型和描述系统行为的脚本,以确定最可能发现用户交互需求错误的情景。,Page 57,2018/3/11,9.4 设计测试用例(自己看书),9.4.1 测试类的方法 前面已经讲过,软件测试从“小型”测试开始,逐步过渡到“大型”测试。对面向对象的软件来说,小型测试着重测试单个类和类中封装的方法。,Page 58,2018/3/11,9.4 设计测试用例,面向对象软件的测试用例的设计方法,还处于研究、发展阶段。,Page
35、59,2018/3/11,9.4 设计测试用例,1、根据前置条件和后置条件构建测试用例。其总体思想是:为所有可能出现的组合情况确定测试用例需求。,Page 60,2018/3/11,9.4 设计测试用例,2、根据状态转换图构建测试用例状态转换图以图例的形式说明了一个类的实例相关联的行为。状态图中的每一个转换都描述了一个或多个测试有例需求。在状态图中,类相关联的行为是很明显的,并且也容易确定测试的需求。,Page 61,2018/3/11,9.4.1 测试类的方法,测试单个类的方法主要有,随机测试、划分测试和基于故障的测试等三种。 1. 随机测试 2. 划分测试 与测试传统软件时采用等价划分方法
36、类似,采用划分测试(partition testing)方法可以减少测试类时所需要的测试用例的数量。,Page 62,2018/3/11,首先,把输入和输出分类,然后设计测试用例以测试划分出的每个类别。下面介绍划分类别的方法。基于状态的划分根据类操作改变类状态的能力来划分类操作。(2) 基于属性的划分对于account类来说,可以使用属性balance来定义划分,从而把操作划分成三个类别:使用balance的操作; 修改balance的操作;不使用也不修改balance的操作。然后,为每个类别设计测试序列。,9.4.1 测试类的方法,Page 63,2018/3/11,3. 基于故障的测试 基
37、于故障的测试(fault_based testing)与传统的错误推测法类似,也是首先推测软件中可能有的错误,然后设计出最可能发现这些错误的测试用例。,9.4.1 测试类的方法,Page 64,2018/3/11,为了推测出软件中可能有的错误,应该仔细研究分析模型和设计模型,而且在很大程度上要依靠测试人员的经验和直觉。如果推测得比较准确,则使用基于故障的测试方法能够用相当低的工作量发现大量错误;反之,如果推测不准,则这种方法的效果并不比随机测试技术的效果好。,9.4.1 测试类的方法,Page 65,2018/3/11,开始集成面向对象系统以后,测试用例的设计变得更加复杂。在这个测试阶段,必须
38、对类间协作进行测试。,9.4.2 集成测试方法,Page 66,2018/3/11,9.4.2 集成测试方法,为了举例说明设计类间测试用例的方法,我们扩充9.4.1小节引入的银行系统的例子,使它包含图9.3所示的类和协作。,Page 67,2018/3/11,图9.3 银行系统的类协作图,Page 68,2018/3/11,9.4.2 集成测试方法,图中箭头方向代表消息的传递方向,箭头线上的标注给出了作为由消息所蕴含的协作的结果而调用的操作。,Page 69,2018/3/11,和测试单个类相似,测试类协作可以使用随机测试方法和划分测试方法,以及基于情景的测试和行为测试来完成。 1. 多类测试
39、 Kirani和Tsai建议使用下列步骤,以生成多个类的随机测试用例。,9.4.2 集成测试方法,Page 70,2018/3/11,9.4.2 集成测试方法, 对每个客户类,使用类操作符列表来生成一系列随机测试序列。这些操作符向服务器类实例发送消息。 对所生成的每个消息,确定协作类和在服务器对象中的对应操作符。 对服务器对象中的每个操作符(已经被来自客户对象的消息调用),确定传递的消息。 对每个消息,确定下一层被调用的操作符,并把这些操作符结合进测试序列中。,Page 71,2018/3/11,9.4.2 集成测试方法,另一种划分测试方法,根据与特定类的接口来划分类操作。如图9.3所示,Ba
40、nk类接收来自ATM类和Cashier类的消息,因此,可以通过把Bank类中的方法划分成服务于ATM的和服务于Cashier的两类来测试它们。还可以用基于状态的划分(见9.4.1节),进一步精化划分。,Page 72,2018/3/11,2. 从动态模型导出测试用例 在本书第6章中已经讲过,怎样用状态转换图作为表示类的动态行为模型。类的状态图可以帮助我们导出测试该类(及与其协作的那些类)的动态行为的测试用例。,9.4.2 集成测试方法,Page 73,课堂练习,P193 第四大题 2小题。,2018/3/11,Page 74,课堂练习,2、某公安报警系统在一些公安重点保护单位(如银行、学校等)
41、安装了报警装置,其工作过程如下:一旦发生意外事故,事故发生单位只需按报警按钮,系统立即向公安局发出警报信息、自动显示出报警单位的地址、电话号码等。110警车立即出动前往出事地点。值班人员可以连通事故单位的电话、问清情况,需要时再增派公安人员到现场处理。根据以上情况进行分析,确定本系统应建立哪个对象类,画出其UML顺序图。,2018/3/11,Page 75,课堂练习,1、一家图书馆藏有书籍、杂志、小册子、电影录像带、音乐CD和报纸等出版物供读者借阅。这些出版物有出版物名、出版者、获得日期、目录编号、书架位置、借出状态和借出限制等属性,并有借出、收回等服务。请建立上述的图书馆馆藏出版物的对象模型。,2018/3/11,Page 76,