面向对象软件测试综述

面向对象软件测试综述

摘要:面向对象的软件测试是面向对象软件开发的不可缺少的一环,是保证软件质量、提高软件可靠性的关键。结合传统软件测试的方法和技术,并针对面向对象软件所具有的特征,将面向对象软件测试层次 划分为三层:类测试、类簇测试和系统测试。本文阐述了面向对象软件测试的基本原理及意义以及它与传统软件测试的区别,讨论了几种已有的面向对象的软件测试工具。

关键词:软件测试;类测试;测试工具;

Abstract:Object-oriented software testing is indispensable to the development of object-oriented software,and is the key to software quality and reliability.Combining with the method and technique of traditional testing,and according to the characteristics of object-oriented software,divides hiberarchy of object-oriented software testing into three layers: class

testing,class cluster testing,system testing. This paper describes the basic principles and the significance of object-oriented software testing.It also says the distinction of the traditional software testing and the object-oriented software testing.,and it discusses several existing object-oriented software testing tools.

Keywords:software testing;class testing;testing tools;

1、引言

软件测试在软件生存期中占有非常突出的重要位置。测试的目的就是在软件投入生产性运行之前,尽可能多地发现软件中的错误。 随着软件的质量和可靠性越来越受到人们的关注,软件测试作与之相应的重要保障手段之一也越来越得到重视。自20世纪80年代以来,面向对象方法和技术的研究已遍及计算机软件、硬件和应用各领域,在软件工程领域更是得到了广泛的重视,但研究的重点和成果主要集中于面向对象分析与技术方法学领域(即软件的开发前期),而面向对象软件测试技术的研究还比较薄弱。面向对象软件的封闭性、继承性、多态性和动态连接等特性使面向对象软件测试不能完全采用传统的测试思想和方法,面向对象软件测试的研究成为十分紧迫的任务。

国内外面向对象软件测试目前还处于探索性的研究阶段,其层次的划分还未达成共识,但一般地,从面向对象程序的结构出发,将面向对象软件的测试分为四个层次:方法测试、类测试、类簇测试、系统测试。其中方法测试和系统测试可采用传统的测试进行测试,但类测试和类簇测试是面向对象测试过程所特有的,不能直接使用传统测试方法。目前,有关类簇测试的研究还很少,面向对象软件测试的研究主要集中于类测试。 2 、软件测试技术

软件测试就是“为了发现程序中的错误而执行程序的过程”,所以为了发现程序中的错误,力求设计出最能暴露错误的测试方案。所以软件测试决不能证明程序是正确的。即使经过了最严格的测试之后,仍然可能还有没被发现的错误潜藏在程序中。测试只能查找出程序中的错误,不能证明程序中没有错误。

2.1软件测试的方法

2.2.1 黑盒测试

黑盒测试又称为功能测试,是一种面向设计的测试。这种测试在完全不考虑测试对象内部结构的情况下,把被测程序当作一个黑盒,根据程序的功能和外部特性得到测试数据。进行黑盒测试在所必须具备的文档有产品描述、用户文档及安装指令。软件的黑盒测试被用来证实软件功能的正确性和可操作性。

2.2.2 白盒测试

白盒测试是假定测试对象的内部是已知的,允许测试者检查测试对象的内部结构,并使用其结构信息来设计测试安全和测试对象是否满足规范的要求,测试者可以完全不考虑测试对象的功能。进行白盒测试所具备的文档有设计文档和程序文档。

2.2 传统软件测试的步骤

传统的软件测试过程可以按四个步骤进行,即单元测试、集成测试、确认测试和系统测试。

2.3.1 单元测试

单元测试是完成对最小软件设计单位—程序模块,进行正确性检验的测试工作,其目的在于发现各模块内部可能存在的各种错误。单元测试需要从程序的内部结构出发设计测试用例,即采用白盒测试方法,而且多个模块并行地进行单元测试。

2.3.2 集成测试

在每个模块完成单元测试以后,需要按照设计时画出的结构图,把它们连接起来,进行集成测试。

2.3.3 确认测试

确认测试的任务就是进一步检查软件的功能和性能是否与用户要求的一样。它通过一系列证明软件功能和需求一致的黑盒测试来完成。

2.3.4 系统测试

系统测试是将已经通过确认测试的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其它系统元素结合在一起,在实际运行环境下,对计算机系统进行一系列的集成测试和确认测试。系统测试的目的在于通过与系统的需求定义作比较,发现软件与系统定义不符合或与之矛盾的地方。

3 、面向对象的软件测试

在面向对象分析设计方法中,基本的构成是类和对象。对象是封装了描述其属性的数据(对象的状态)以及可以对这些数据实施的操作,对象之间通过改善消息相互协作。类是一组相似对象的描述,描述了该类对象所具有的共同特征。面向对象的程序设计又提供了信息隐蔽、继承、金矿和动态绑定等机制。这种软件开发方法固有的特性,给软件测试理论、技术、方法等方面带来了巨大的影响,使得传统的软件测试方法以及测试工具已不能为面向对象的软件提供良好的支持。

3.1 面向对象软件测试的特点

面向对象程序结构不再是传统的功能模块结构,作为一个整体,原有集成测试所要求的逐步将开发的模块搭建在一起进行测试的方法已成为不可能。面向对象软件抛弃了传统的开发模式,对每个开发阶段都有不同以往的要求和结果,已经不可能用功能细化的观点来检测面向对象分析和设计的结果。传统的测试模型对面向对象软件已经不再适用。

3.2面向对象的特点对软件测试的影响

3.2.1基本构造模块

在面向对象系统中,系统的基本构造模块是封装了数据和方法的类和对象,而不再是一个个能完成特定功能的功能模块。每个对象有自己的生存周期,有自己的状态。消息是对象之间相互请求或协作的途径,是外界使用对象方法及获取对象状态的唯一方式。对象的功能是在消息的触发下,由对象所属类中定义的方法与相关对象的合作共同完成的,且在不同状态下对消息的响应可能完全不同。工作过程中对象的状态可能被改变,产

生新的状态。对象中的数据和方法是一个有机的整体,测试过程中不能仅仅检查输入数据产生的输出结果是否与预期的吻合,还要考虑对象的状态。模块测试的概念已不适用于对象的测试。

3.2.2系统功能实现

在面向对象系统中,系统的功能体现在对象间的协作上,而不再是简单的过程调用关系,面向对象程序的执行实际上是执行一个由消息连接起来的方法序列,方法的实现与所属对象本身的状态有关,各方法之间可能有相互作用。为实现某一特定的功能,有可能要激活调用属于不同对象类的多个成员函数,形成成员函数的启用链。显然,基于功能分解的自顶向下或自底向上的集成测试策略并不适用于以面向对象方法构造的软件。

3.2.3信息隐蔽与封装性

类的重要特征之一是信息隐蔽与封装性。它把数据和操纵数据的方法封装在一起,限制对象属性对外的可见性和外界对它的操作权限,这在一定程度上避免了不合理的操作并能有效地阻止错误的扩散,也减轻了维护工作量,但却给测试带来了困难。为了检查私有(private)和模块处理对象类处理保护(Protected)的函数及数据,测试时往往要在类定义中添加一些专门的函数。

另一方面,面向对象软件系统运行时由一组协调工作的对象组成,对象具有一定的状态,测试应涉及对象的初态、输人、输出、对象的终态,信息隐蔽机制给对象状态的观察、测试用例的生成、测试点的选取等带来了障碍,测试者往往要添加一些表明对象内部状态的函数。因此,信息隐蔽与封装性加大了测试的难度。

3.2.4继承

继承也是面向对象语言中的一个本质特征。继承可用于一般与特殊关系,并目方便 编码。但继承削弱了封装性,产生了类似于非面向对象语言中全局数据的错误风险。由 于继承的作用,一个函数可能被封装在具有继承关系的多个类中,子类中还可以对继承 的特征进行覆盖或重定义。

3.2.5多态性和动态绑定

多态性和动态绑定是面向对象方法的关键特性之一。同一消息可以根据接收消息对象的不同采用多种不同的行为方式,这就是多态的概念。如根据当前指针引用的对象类型来决定使用正确的方法,这就是多态性行为操作。运行时系统能自动为给定消息选择合适的实现代码、这给程序员提供了高度柔性、问题抽象和易于维护。但多态性和动态绑定所带来的不确定性,使得传统测试实践中的静态分析法遇到了不可逾越的障碍。而且它们也增加了系统运行中可能的执行路径,加大了测试用例的选取难度和数量。

3.2面向对象的测试与传统测试的比较

传统软件测试技术是面向过程的测试,是从输入/处理/输出的角度检验一个函数或过程能否正确工作。而面向对象软件测试是针对相互协作而又彼此独立的对象的测试。面向对象软件开发的测试目标与传统的软件开发方法相同,都是为了确保软件能正确地和一致地解决待解决的问题,但由于过程性测试方法没有考虑到面向对象软件的测试所要涉及的类、继承和多态性,因此这两者是有很大不同的。

3.2.1测试单元的不同

传统软件的基本构成单元为功能模块,每个功能模块一般能独立地完成一个特定的功能。而在面向对象的软件中,基本单元是封装了数据和方法的类和对象。对象是类的实例,有自己的角色,并在系统中承担特定的责任。对象有自己的生存周期和状态,状态可以演变。对象的功能是在消息的触发下,实现对象中若干方法的合成以及与其它对象的合作。对象中的数据和方法是一个有机整体,功能测试的概念不适用于对象的测试。

3.2.2系统构成不同

传统的软件系统是由一个个功能模块通过过程调用关系组合而成的。而在面向对象的系统中,系统的功能体现在对象间的协作上,相同的功能可能驻留在不同的对象中,操作序列是由对象间的消息传递决定的。传统

意义上的功能实现不再是靠子功能的调用序列完成的,而是在对象之间合作的基础上完成的。不同对象有自己不同状态,而且,同一对象在不同状态下对消息的响应可能完全不同。因此,面向对象的集成测试已不属于功能集成测试。

3.3面向对象软件测试的层次划分

软件测试层次是基于测试复杂性分解的思想,是软件测试的一种基本模式。面向对象程序的结构不再是传统的功能模块结构,作为一个整体,原有集成测试所要求的逐步将开发的模块组装在一起进行测试的方法已成为不可能。而且,面向对象软件抛弃了传统的开发模式,对每个开发阶段都有不同以往的要求和结果,已经不可能用功能细化的观点来检测面向对象分析和设计的结果。因此,传统的测试模型对面向对象软件已经不再适用。

目前,对面向对象软件测试的层次划分尚未达成共识。一般地,将面向对象软件的测试分为3个层次:类测试、类簇测试、系统测试。

3.3.1类测试

面向对象软件的类测试与传统的单元测试相对应,但和传统的单元测试不一样。类包含一组不同的操作,并且某特殊操作可能作为一组不同类的一部分存在。同时,一个对象有它自己的状态和依赖于状态的行为,对象操作既与对象的状态有关,但也可能改变对象的状态。所以,类操作时不仅要将操作作为类的一部分,同时要把对象与其状态结合起来,进行对象状态行为的测试。类测试可以分为以下三个部分:

(1) 基于方法的测试:测试类中的每个方法。

(2) 基于状态的测试:考察类的实例在其生命周期各个状态下的情况。

(3) 基于响应的状态测试:从类和对象的责任出发,以外界向对象改善特定的消息序列来测试对象。

基于服务的类测试主要考察封装在类中的一个方法对数据进行的操作。Kung等人提出的块分支图(Block Branch Diagram,简称BBD)是一种比较好的方法测试模型(如图1所示)。 [1]


方法f的BBD是一个一元组,BBD={Du,Dd,P,Fe,G};Du={di|di∈f引用的全局数据或类数据};Dd={di|di∈f修改的全局数据或类数据};P={X1θ1,X2θ2,⋯,Xnθn,Xn+1θn+1∈f的参数表和函数返回值,θi为↓ 输入 、↑ 输出 ,或↓(输入、输出);若Xn+1缺省,则无返回值};F={fi|fi∈被f调用的其他服务};G是一个有向图,叫做块体。它是按照控制流图的思想修改f的程序流程图而来的,表示f的控制结构中的符合条件判断被分解,每个判断框只有单个条件。

3.3.2类簇测试


类簇是一组相互合作的类。类簇测试主要考察一组协同操作的类之间的相互作用,测试重点在类之间的逻辑关系—关联、继承、聚合、多态,检验类之间的相互配合。其测试用例可由多种方案结合生成。如根据类的继承关系图来纵向检查类,同时又根据对象之间方法的相互作用来模量检查类的关系。

(1) 关联和聚合关系的测试:将具有关联和聚合关系的类组装在一起,选择其中主动发送消息的类的测试用例

为此测试的用例,加载驱动程序运行测试用例,检验类间的传递与响应。

(2) 继承关系的测试:D.E.Perry和G.e.Kaiser根据Weyuker的测试充分性公理对该问题进行了讨论,认为子

类中方法和重定义的方法都必须在子类的环境中重新测试,对被继承的方法是充分的测试数据集,对重定义的方法未必是充分的。对继承关系的测试主要是对派生类继承部分的测试,它可重用父类的测试用例,利用回归测试进行,对派生类的非继承部分需重新设计测试用例进行类测试。

(3) 多态/动态绑定的测试:多态/动态绑定显著增加了系统运行中可能的执行路径。由于多态/动态绑定所带

来的不确定性,使得涉及多态实例变量的测试用例大幅度增长。多态/动态绑定实例变量的每一种可能取值应至少在测试用例中出现一次。

3.3.3系统测试

系统测试是对所有类和主程序构成的整个系统进行整体测试,以验证软件系统的正确性和性能指标等满足规格说明书和任务书所指定的要求。它与传统的系统测试一样,可套用传统的系统测试方法,区别仅丰于测试用例的形式有所不同,测试用例可以从对象—行为模型和作为对象分析的一部分的事件流图中导出。

3.4 面向对象软件的测试方法

3.4.1基于状态的测试

基于状态的测试以类的有限状态机模型 ( F S M ) 和其状态转换图为依据, 这种模型可以由软件的代码或规约生成, 也可采用如UM L 的状态图 。采用此方法进行测试时, 主要检查由初态是否能正确地到达图中的各个状态, 以及各个状态之间的迁移是否能正确实现 。这种方法可以充分测试类中的各个方法和可能的状态, 符合类测试的特点, 因此是当前类测试中用得较多 、 研究得也较多的方法之一, 但其难点主要在于如何确定被测对象是否达到了正确的状态 。基于状态的测试可以很容易地推广到类簇测试, 只要我们能够为类簇建立这样的状态模型 。

3.4.2基于方法序列的测试

面向对象程序中方法的调用是有一定次序的, 如果违反了这个次序就会产生错误 。方法序列规范

Mtss(Method Sequence Specification)就是这样一种规范, 它规定了类或类簇中方法的执行顺序, 如哪些方法必须按先后次序执行, 哪些方法可以并发执行等等 。 依据这样的规约, 我们可以为类或类簇产生一些消息序列, 检验这些类或类簇中的方法是否能够正确地交互 。 文[2] 中较为详细地介绍了Mtss产生测试用例的原理, 并根据一定的准则对所产生的消息序列进行了划分, 另外还采用颠倒次序 、 遗漏和冗余等方法由正确的消息序列生成错误的消息序列, 以测试程序的健壮性 。 由于该方法没有能够考虑类的状态, 因此采用它进行的测试是不完全的 。 这种方法常常与别的测试方法结合使用 。

3.4.3基UML的测试

UML为面向对象软件提供了强大的建模工具, 同时它也可以作为测试的依据.下面介绍的是几种已被应用于面向对象软件测试的UML模型:

(1) 类图: 类图描述了组成面向对象程序的各个类之间的关系, 包括联系、聚集、重数、子类型和递归包含等.依据类图可以确定各个类之间的层次关系,从而决定对类进行测试的顺序。 另外, 采用类图可以生成检验类之间关系是否正确实现的测试用例。 [3][5]

及个性化。 具有提供动态输入到测试的功能(包括 JavaScript)。 支持脚本变成的取样器(在1.9.2 及以上版本支持 BeanShell)。  4.5 TestDirector

基于WEB的测试管理工具,他能够让你系统地控制整个测试过程,并创建整个测试工作流的框架和基础,使整个测试管理过程变得更为简单和有组织。他能够帮助你维护一个测试工程数据库,并且能够覆盖你的应用程序功能性的各个方面。T并且还为你提供了直观和有效的方式来计划和执行测试集、收集测试结果并分析数据。还专门提供了一个完善的缺陷跟踪系统。并可以同Mercury公司的测试工具、第三方或者自主开发的测试工具、需求和配置管理工具、建模工具的整合功能。你可以通过他进行需求定义、测试计划、测试执行和缺陷跟踪,即整个测试过程的各个阶段。  4.6 Bugzilla

Buzilla 是一个 BUG 管理工具。作为一个产品缺陷的记录及跟踪工具,它能够为你建立一个完善的 Bug 跟踪体系,包括报告 Bug、查询 Bug 记录并产生报表、处理解决、管理员系统初始化和设置四部分。并具有如下特点:

1、基于Web 方式,安装简单、运行方便快捷、管理安全。

2、有利于缺陷的清楚传达。本系统使用数据库进行管理,提供全面详尽的报告输入项,产生标准化的 Bug 报告。 提供大量的分析选项和强大的查询匹配能力,能根据各种条件组合进行 Bug 统计。当错误在它的生命周期中变化时,开发人员、测人员、及管理人员将及时获得动态的变化信息,允许你获取历史纪录,并在检查错误的状态时参考这一记录。

3、系统灵活,强大的可配置能力。Buzilla工具可以对软件产品设定不同的模块,并针对不同的模块设定制定的开发人员和测试人员;这样可以实现提交报告时自动发给指定的责任人;并可设定不同的小组,权限也可划分。设定不同的用户对 Bug 记录的操作权限不同,可有效控制进行管理。允许设定不同的严重程度和优先级可以在错误的生命其中管理错误,从最初的报告到最后的解决,确保了错误不会被忽略,同时可以使注意力集中在优先级和严重程度高的错误上。

4、自动发送 Email,通知相关人员。根据设定的不同责任人,自动发送最新的动态信息,有效的帮助测试人员和开发人员进行沟通。  4.7各种测试工具的比较


5、总结

在软件工程领域中,面向对象软件测试是一个重要的研究方向,面向对象方法与传统顺序结构式方法在开发思想上有着根本的不同,尤其是面向对象所具有的类、封装、继承、动态连接等特性,使得面向对象测试在测试层次及测试方案的选择上有别于传统的测试思想,也增加了测试用例的设计难度。面向对象开发方法问世的时间较短,所以在测试理论上还存在诸多分歧,在测试技术上也有局限,并且面向对象软件测试尚有许多难题需要解决。今后,应该在而向对象软件的开发过程中不断探索,更深入地研究上述各方面,克服软件测试的盲目性和局限性,保证测试的质量,提高软件的可靠性。 参考文献

[1]Binder R V.Testing Object-Oriented Software:A Survey[J].Journal of Software   Testing,Verification and Reliability,1996(6):225-252.

[2]郭健强,蔡希尧.基于方法序列规范的测试用例生成[J].计算机科学,2000(1):44~47.

[3](美)Binder Robert V.面向对象系统的测试[M].华庆一,王斌君,陈莉译.北京:人民邮电出版社,2001.

[4]Peter Froehlich,JohannesLink.Automated test case generation from dynamicmodels[A].14 European Conference on Object-Oriented Programming,Sophia Antipolis and Cannes,France,2000.

[5]张毅坤,左咏露.面向对象软件测试的特点及方法[j].西安理工大学学报,2002:361~365.

th

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值