面向对象软件测试综述
意义上的功能实现不再是靠子功能的调用序列完成的,而是在对象之间合作的基础上完成的。不同对象有自己 不同状态,而且,同一对象在不同状态下对消息的响应可能完全不同。因此,面向对象的集成测试已不属于功 能集成测试。 3.3 面向对象软件测试的层次划分 软件测试层次是基于测试复杂性分解的思想,是软件测试的一种基本模式。面向对象程序的结构不再是传 统的功能模块结构,作为一个整体,原有集成测试所要求的逐步将开发的模块组装在一起进行测试的方法已成 为不可能。而且,面向对象软件抛弃了传统的开发模式,对每个开发阶段都有不同以往的要求和结果,已经不 可能用功能细化的观点来检测面向对象分析和设计的结果。因此,传统的测试模型对面向对象软件已经不再适 用。 目前,对面向对象软件测试的层次划分尚未达成共识。一般地,将面向对象软件的测试分为 3 个层次:类 测试、类簇测试、系统测试。 3.3.1 类测试 面向对象软件的类测试与传统的单元测试相对应,但和传统的单元测试不一样 。类包含一组不同的操作, 并且某特殊操作可能作为一组不同类的一部分存在。同时,一个对象有它自己的状态和依赖于状态的行为,对 象操作既与对象的状态有关,但也可能改变对象的状态。所以,类操作时不仅要将操作作为类的一部分,同时 要把对象与其状态结合起来,进行对象状态行为的测试。类测试可以分为以下三个部分: (1) 基于方法的测试:测试类中的每个方法。 (2) 基于状态的测试:考察类的实例在其生命周期各个状态下的情况。 (3) 基于响应的状态测试:从类和对象的责任出发,以外界向对象改善特定的消息序列来测试对象。 基于服务的类测试主要考察封装在类中的一个方法对数据进行的操作。Kung 等人提出的块分支图(Block Branch Diagram,简称 BBD)是一种比较好的方法测试模型(如图 1 所示)。
1、引言
软件测试在软件生存期中占有非常突出的重要位置。测试的目的就是在软件投入生产性运行之前,尽可能 多地发现软件中的错误。 随着软件的质量和可靠性越来越受到人们的关注,软件测试作与之相应的重要保障 手段之一也越来越得到重视。自 20 世纪 80 年代以来,面向对象方法和技术的研究已遍及计算机软件、硬件和 应用各领域,在软件工程领域更是得到了广泛的重视,但研究的重点和成果主要集中于面向对象分析与技术方 法学领域(即软件的开发前期),而面向对象软件测试技术的研究还比较薄弱。面向对象软件的封闭性、继承 性、多态性和动态连接等特性使面向对象软件测试不能完全采用传统的测试思想和方法,面向对象软件测试的 研究成为十分紧迫的任务。 国内外面向对象软件测试目前还处于探索性的研究阶段,其层次的划分还未达成共识,但一般地,从面向 对象程序的结构出发,将面向对象软件的测试分为四个层次:方法测试、类测试、类簇测试、系统测试。其中 方法测试和系统测试可采用传统的测试进行测试,但类测试和类簇测试是面向对象测试过程所特有的,不能直 接使用传统测试方法。目前,有关类簇测试的研究还很少,面向对象软件测试的研究主要集中于类测试。
生新的状态。对象中的数据和方法是一个有机的整体,测试过程中不能仅仅检查输入数据产生的输出结果是否 与预期的吻合,还要考虑对象的状态。模块测试的概念已不适用于对象的测试。 3.2.2 系统功能实现 在面向对象系统中,系统的功能体现在对象间的协作上,而不再是简单的过程调用关系,面向对象程序的 执行实际上是执行一个由消息连接起来的方法序列,方法的实现与所属对象本身的状态有关,各方法之间可能 有相互作用。为实现某一特定的功能,有可能要激活调用属于不同对象类的多个成员函数,形成成员函数的启 用链。显然,基于功能分解的自顶向下或自底向上的集成测试策略并不适用于以面向对象方法构造的软件。 3.2.3 信息隐蔽与封装性 类的重要特征之一是信息隐蔽与封装性。它把数据和操纵数据的方法封装在一起,限制对象属性对外的可 见性和外界对它的操作权限,这在一定程度上避免了不合理的操作并能有效地阻止错误的扩散,也减轻了维护 工作量,但却给测试带来了困难。为了检查私有(private)和模块处理对象类处理保护(Protected)的函数及数 据,测试时往往要在类定义中添加一些专门的函数。 另一方面,面向对象软件系统运行时由一组协调工作的对象组成,对象具有一定的状态,测试应涉及对象 的初态、输人、输出、对象的终态,信息隐蔽机制给对象状态的观察、测试用例的生成、测试点的选取等带来 了障碍,测试者往往要添加一些表明对象内部状态的函数。因此,信息隐蔽与封装性加大了测试的难度。 3.2.4 继承 继承也是面向对象语言中的一个本质特征。继承可用于一般与特殊关系,并目方便 编码。但继承削弱了 封装性,产生了类似于非面向对象语言中全局数据的错误风险。由 于继承的作用,一个函数可能被封装在具 有继承关系的多个类中,子类中还可以对继承 的特征进行覆盖或重定义。 3.2.5 多态性和动态绑定 多态性和动态绑定是面向对象方法的关键特性之一。同一消息可以根据接收消息对象的不同采用多种不同 的行为方式,这就是多态的概念。如根据当前指针引用的对象类型来决定使用正确的方法,这就是多态性行为 操作。运行时系统能自动为给定消息选择合适的实现代码、这给程序员提供了高度柔性、问题抽象和易于维护。 但多态性和动态绑定所带来的不确定性,使得传统测试实践中的静态分析法遇到了不可逾越的障碍。而且它们 也增加了系统运行中可能的执行路径,加大了测试用例的选取难度和数量。 3.2 面向对象的测试与传统测试的比较 传统软件测试技术是面向过程的测试,是从输入/处理/输出的角度检验一个函数或过程能否正确工作。而 面向对象软件测试是针对相互协作而又彼此独立的对象的测试。面向对象软件开发的测试目标与传统的软件开 发方法相同,都是为了确保软件能正确地和一致地解决待解决的问题,但由于过程性测试方法没有考虑到面向 对象软件的测试所要涉及的类、继承和多态性,因此这两者是有很大不同的。 3.2.1 测试单元的不同 传统软件的基本构成单元为功能模块,每个功能模块一般能独立地完成一个特定的功能。而在面向对象的 软件中,基本单元是封装了数据和方法的类和对象。对象是类的实例,有自己的角色,并在系统中承担特定的 责任。对象有自己的生存周期和状态,状态可以演变。对象的功能是在消息的触发下,实现对象中若干方法的 合成以及与其它对象的合作。对象中的数据和方法是一个有机整体,功能测试的概念不适用于对象的测试。 3.2.2 系统构成不同 传统的软件系统是由一个个功能模块通过过程调用关系组合而成的。而在面向对象的系统中,系统的功能 体现在对象间的协作上,相同的功能可能驻留在不同的对象中,操作序列是由对象间的消息传递决定的。传统
3 、面向对象的软件测试
在面向对象分析设计方法中,基本的构成是类和对象。对象是封装了描述其属性的数据(对象的状态)以 及可以对这些数据实施的操作,对象之间通过改善消息相互协作。类是一组相似对象的描述,描述了该类对象 所具有的共同特征。面向对象的程序设计又提供了信息隐蔽、继承、金矿和动态绑定等机制。这种软件开发方 法固有的特性,给软件测试理论、技术、方法等方面带来了巨大的影响,使得传统的软件测试方法以及测试工 具已不能为面向对象的软件提供良好的支持。 3.1 面向对象软件测试的特点 面向对象程序结构不再是传统的功能模块结构,作为一个整体,原有集成测试所要求的逐步将开发的模块 搭建在一起进行测试的方法已成为不可能。面向对象软件抛弃了传统的开发模式,对每个开发阶段都有不同以 往的要求和结果,已经不可能用功能细化的观点来检测面向对象分析和设计的结果。传统的测试模型对面向对 象软件已经不再适用。 3.2 面向对象的特点对软件测试的影响 3.2.1 基本构造模块 在面向对象系统中,系统的基本构造模块是封装了数据和方法的类和对象,而不再是一个个能完成特定功 能的功能模块。每个对象有自己的生存周期,有自己的状态。消息是对象之间相互请求或协作的途径,是外界 使用对象方法及获取对象状态的唯一方式。对象的功能是在消息的触发下,由对象所属类中定义的方法与相关 对象的合作共同完成的,且在不同状态下对消息的响应可能完全不同。工作过程中对象的状态可能被改变,产
2 、软件测试技术
软件测试就是“为了发现程序中的错误而执行程序的过程”,所以为了发现程序中的错误,力求设计出最 能暴露错误的测试方案。所以软件测试决不能证明程序是正确的。即使经过了最严格的测试之后,仍然可能还 有没被发现的错误潜藏在程序中。测试只能查找出程序中的错误,不能证明程序中没有错误。 2.1 软件测试的方法 2.2.1 黑盒测试 黑盒测试又称为功能测试,是一种面向设计的测试。这种测试在完全不考虑测试对象内部结构的情况下, 把被测程序当作一个黑盒,根据程序的功能和外部特性得到测试数据。进行黑盒测试在所必须具备的文档有产 品描述、用户文档及安装指令。软件的黑盒测试被用来证实软件功能的正确性和可操作性。 2.2.2 白盒测试
ห้องสมุดไป่ตู้
白盒测试是假定测试对象的内部是已知的,允许测试者检查测试对象的内部结构,并使用其结构信息来设 计测试安全和测试对象是否满足规范的要求,测试者可以完全不考虑测试对象的功能。进行白盒测试所具备的 文档有设计文档和程序文档。 2.2 传统软件测试的步骤 传统的软件测试过程可以按四个步骤进行,即单元测试、集成测试、确认测试和系统测试。 2.3.1 单元测试 单元测试是完成对最小软件设计单位—程序模块,进行正确性检验的测试工作,其目的在于发现各模块内 部可能存在的各种错误。单元测试需要从程序的内部结构出发设计测试用例,即采用白盒测试方法,而且多个 模块并行地进行单元测试。 2.3.2 集成测试 在每个模块完成单元测试以后,需要按照设计时画出的结构图,把它们连接起来,进行集成测试。 2.3.3 确认测试 确认测试的任务就是进一步检查软件的功能和性能是否与用户要求的一样。它通过一系列证明软件功能和 需求一致的黑盒测试来完成。 2.3.4 系统测试 系统测试是将已经通过确认测试的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某 些支持软件、数据和人员等其它系统元素结合在一起,在实际运行环境下,对计算机系统进行一系列的集成测 试和确认测试。系统测试的目的在于通过与系统的需求定义作比较,发现软件与系统定义不符合或与之矛盾的 地方。