您的位置:首页 > 其它

面向对象软件的测试

2018-01-24 17:21 169 查看
面向对象软件测试的问题

面向对象的三个主要特点:封装、继承和多态。

封装:在面向对象中,封装包含两方面的含义:一是指信息隐蔽,二是指一组相关的变量和方法被封装在同一个类中。测试时需要考虑:1、信息隐蔽对测试知行的影响。2、实例状态与类的测试序列。

继承:是对面向对象中的一个重要机制,它允许子类直接获得父类的属性和方法,从而实现对父类的复用。测试时需要考虑:1、继承对测试充分性的影响。2、误用对测试的影响。

多态:在面向对象软件技术中,多态性是指子类对象可以像父类对象那样使用,同样的消息既可以发送给父类对象也可以发送给子类对象。也就是说,在类等级的不同层次中可以共享(公用)一个行为(方法)的名字,然而不同层次中的每个类确各自按自己的需求来实现这个行为。当对象接收到发送给它的消息时,根据该对象所属于的类动态选用在该类中定义的实现算法。指对一个类的引用可以与多个类的实现绑定,绑定分为静态绑定和动态绑定。静态绑定是指在编译时刻就完成的绑定,而动态绑定是指在运行时刻完成的绑定。动态绑定对测试的影响首先体现在测试的充分性上。

继承和多态复合:在面向对象中,继承和多态复合在一起可以产生多种变化。测试时需要考虑:1、抽象类对测试执行的影响。2、误用对测试的影响。

面向对象程序的测试组织问题

  通过执行程序代码完成的测试通常包括单元测试、集成测试和系统测试。

  单元测试的基本要求是被测单元能够被独立地测试。在测试面向对象程序时,由于一个类的各个成员方法通常是相互依赖的,因此很难对一个类中的单个成员方法进行充分的单元测试。面向对象的一个类甚至都不能作为可以被独立测试的单元,主要原因是:1、由于继承的存在,一个类通常依赖于其父类和其他祖先类。2、面向对象程序中经常出现多个类相互依赖,从而导致每个类难以被独立地测试。

  集成测试一般是针对程序的集成结构进行的。在面向对象的程序中,许多集成机制在传统结构化程序中很少见,对于这些机制的测试难以直接应用到传统结构化程序的集成测试中。类似的,对于由多个类组成的继承树的测试,传统的集成测试技术也难以适用。

面向对象软件测试的模型及策略

面向对象软件的测试模型

  面向对象软件的测试活动分为:面向对象分析的测试(OOA)、面向对象设计的测试(OOD Test)、面向对象编程的测试(OOP Test)和面向对象软件(OOS Test)的系统测试,而面向对象编程的测试(OOP)又可分为单元测试和集成测试。

面向对象分析的测试

检查分析结果是否符合相应的面向对象分析方法的要求。
检查分析结果是否可以满足软件需求。

面向对象设计的测试

对设计结果本身的审查。
设计结果与分析结果一致性的审查。
设计结果对编程的支持。

  OOD与OOA的主要区别是:在OOD中要考虑与实现相关的内容,而在OOA中不需要考虑与实现相关的内容。

面向对象编程的测试

对执行代码进行测试。
检查代码风格。

  对于有一定规模的程序而言,把整个程序放在一起进行测试非常困难,一般的方法是把程序的各个组成部分分别进行测试。有时候需要把几个类放在一起进行测试,这时候应当重点测试个各类之间的交互。当检查代码风格的时候,首先需要检查代码的风格是否符合要求,其次需要检查代码中是否存在不好的控制结构,不好的控制结构通常是隐患,可能会影响以后的开发和维护。

面向对象程序的单元测试

  由于面向对象的程序中可独立被测试的单元通常是一个类族或最小是一个独立的类,面向对象的单元测试可以分为几个层次:

方法层次的测试

  对于一个方法,可以将其看作关于输入参数和所在类的成员变量的一个独立函数,如果该函数的内聚性很高,功能也比较复杂,可以对其单独进行测试。一般只有少数方法需要进行单独测试,因为有很多方法与成员变量具有很强的关联性。对单个成员方法的测试类似于传统软件测试中对单个函数的测试,很多测试技术都可以应用到这里来。

常用的测试技术:

等价类划分测试:根据输入参数把取值域分成若干个等价类。
组合功能测试:针对那些依据输入参数和成员变量的不同取值组合而选择不同动作的方法。
递归函数测试。
多态消息测试。

类层次的测试

  很多成员方法会通过成员变量产生相互依赖的关系,这将导致很难对单个成员方法进行充分的测试。合理的测试是将相互依赖的成员方法放在一起进行测试,这就是所谓的类层次测试。

  常用的测试技术:

不变式边界测试。首先准确定义类的不变式,其次寻找成员方法的调用序列,以违反类的不变式,这些调用序列即可作为测试用例。
模态类测试:模态类是指对该类所接受的成员方法的调用序列设置一定的限制。这时,需要对类的状态进行建模,确定类的不同状态、每个状态下可以接受的成员方法调用以及状态间的转换关系,从而获得类的状态转换图。根据状态转换图,可以生成调用序列来覆盖状态转换图上的边和路径。每个调用序列可以作为一个测试用例。
非模态类测试:该类所接受的成员方法的调用序列没有任何限制。可以避免很多因状态引起的麻烦,但整个测试不能以状态图为指导。

类树层次的测试
  面向对象中有集成和多态现象,所以对子类的测试通常不能限定在子类中定义的成员变量和成员方法上,还要考虑父类对子类的影响。
  常用的测试技术:

多态服务测试。多态服务测试是为了测试子类中的多态方法的实现是否保持了父类对该方法的规格说明。
展平测试:将子类自身定义的成员方法和成员变量以及从父类和祖先类继承来的成员方法和成员变量全部放在一起组成一个新类,并对其进行测试。展平后的类的规模可能会相当大,这会给测试带来昂贵的代价,因此需要尽可能地减少不必要的代价。在复杂的情况下,对子类的测试可能只采用展平测试策略。

面向对象程序的集成测试
  面向对象程序集成测试策略主要有:

传统的集成测试策略:主要有大突击集成测试、自底向上集成测试、自顶向下集成测试、夹层式集成测试。
协作集成:在集成时,针对系统完成的功能,将可以相互协作完成特定功能的类集成在一起进行测试。优点:编写测试驱动和测试桩的开销小。缺点:当协作关系复杂时,测试难以充分进行;与传统集成测试相比,协作集成通常不完备。
基干集成:在嵌入式系统中,基干集成划分为两部分:内核部分(基干部分)和外围应用部分。优点:集中了传统集成的优点,并对缺点进行了控制,更加适合大型复杂项目的集成。缺点:必须对系统的结构和相互依存性进行分析;必须开发桩模块和驱动模块;由于局部采用一次性集成策略导致有些接口可能测试不完整。
高频集成:一般采用冒烟测试(对一个硬件或硬件组件进行更改或修复后,直接给设备加电。如果没有冒烟,则该组件就通过了测试。在软件中,“冒烟测试”这一术语描述的是在将代码更改嵌入到产品的源树中之前对这些更改进行验证的过程。在检查了代码后,冒烟测试是确定和修复软件缺陷的最经济有效的方法。冒烟测试设计用于确认代码中的更改会按预期运行,且不会破坏整个版本的稳定性。)的方式,即不预测每个测试用例的预期结果,如果测试中未出现反常情况,就认为通过测试。高频集成有三个主要步骤:1、开发人员完成要提供代码的增量构件,同时测试人员完成相关的测试包。2、集成测试人员将开发人员新增或修改的构件集中起来形成一个新的集成体。3、评价结果。优点:高效性、可预测性、并行性、尽早查出错误、易进行错误定位、对桩模块需要不是必需的。缺点:若测试包过于简单,可能难以发现问题;开始不能平稳集成;若没有增加适当的标准可能会增加风险。
基于事件(消息)的集成:从验证消息路径的正确性出发,渐增式把系统集成在一起,从而验证系统的稳定性。
基于使用的集成:从分析类之间的依赖关系出发,通过从对其他类依赖最少的类开始集成,逐步扩大到有依赖关系的类,最后集成到整个系统。
客户机/服务器的集成:不存在独立控制轨迹,每个系统构件都有自己的控制策略。优点:避免了一次集成的风险;次序没有大的约束;有利于复用和扩充;支持可控制和可重复的测试。缺点:测试驱动代码和桩代码的开发成本高。
分布式集成:用于测试松散耦合的同级构件之间交互的稳定性。

针对类间连接的测试

类关联的多重性测试:在面向对象中,类间的关联关系存在多重性方面的限制,对多重性的测试是针对类间连接测试的重要方面。此时,测试关注的重点是与连接关系有关的增删改操作。
受控异常测试:由于使用异常处理,异常的抛出和异常的接收可以被放在不同的类中,这实际上是类间隐含的控制依赖关系。测试时,需要尽可能地覆盖这些隐式的依赖关系。
往返场景测试:面向对象中,许多功能是通过多各类相互协作完成的,往返场景测试就是针对类间协作的一种测试技术。本质上讲,往返场景测试就是把与实现特定场景相联系的代码收取出来,针对这些代码设计百分之百(分支)覆盖率的测试用例集。
模态机测试:类似于类层次的模态类测试,只是模态类测试是针对一个类进行的,而模态机是针对多个类进行的。

面向对象软件的系统测试
  由于系统测试的主要目标是测试开发出来的软件是否是问题空间的一个合理解,因此对于系统测试而言,面向对象软件与传统结构化软件并没有本质区别。
 
功能测试:一种是基于大纲的测试,即传统软件系统测试经常使用的技术。另一种是基于用例的测试,利用OOA文档中的用力进行的系统测试。
 
其他系统测试:性能测试、兼容性测试、易用性测试和文档测试等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: