面向对象软件测试的研究与应用

华南理工大学

硕士学位论文

面向对象软件测试的研究与应用

姓名:孙晓冬

申请学位级别:硕士

专业:软件工程

指导教师:左保河;柴华

20040501

摘要

摘要

随着计算机技术的不断发展,软件的规模和复杂度都有了很大的提高。软件失效已成为系统瘫痪的土要原因。冈此,提高软件质量及可靠性己成为当前软件工程领域的重要任务。

软件测试是软件1程中的一个阶段,是保证软件质量的一个重要手段。面向对象软件测试技术的研究是面向对象开发方法不可缺少的环节,但目前的研究状况与面向对象的分析、设计方法以及程序设计语言的研究相比稍显薄弱。

本文首先介绍了传统的结构化软件测试的方法,以求从总体上认识软件测试。然后重点介绍了面向对象软件测试的技术,在这其中,首先讲述了面向埘象软件开发技术及其优点;接着讨论了面向对象软件测试的几种方法,其中包括基于方法序列规范的测试、基于状态的测试、基于类流图的测试和基于uML的测试;然后讲述了面向对象软件测试的层次划分,这里把面向对象软件测试划分为匹1个层次:方法测试、类测试、类簇测试、系统测试;最后讲述了测试用例的重用及测试计划。

在第i章中,本文首先着晕介绍了基于状态的类测试技术的特点以及其局限性;然后为了解决其局限性引入了‘种本人称为“ClassPower”的测试模型。“ClassPower”用来表达类的各个属性和方法之间的关系,它能够检查在某个状态F所有的边的状念,看看那些不应该被调用的边是否有被调用的可能性。如果有被调用的可能性,就说明方法的实现上有漏洞。“ClassPower”测试模型主要以类状态测试为依据,辅以方法序列规范和状态转移矩阵,最终达到测试上述目的的结果。

最后作者将本文提出的测试方法,应用到一个实际的工程项目当中,即应用到】i作流引擎项目中,来对项目中的某些类加以测试,讲述了具体的测试实施过程。

关键词:软件测试、面向对象、类测试、工作流

华南理j二人学上程硕士学位论文

ABSTRACT

Withtherapiddevelopmentof

computertechnology,thescaleandcomplexityof

softwarehasmadetremendousprogress,However,themainreasonfor

systemcollapseissoftwareinvalidation.Therefore,howtoimprovesoftwarequalityandreliabilityisakindofimportanttaskforcurrentsoftwareengineeringfield.Softwaretestingisnotonlyoneofthemosttime—consumingpartsofthesoftwareengineer,butalsoanimportantmeanstoguaranteesoftwarequalities.OOT(Object-orientedtesting)istheessentialprocessinobject—orientedprogramdevelopment.Muchresearchhasbeendoneonobject—orientedanalysis,designandprogramminglanguages,yetrelativelylittleonquestionofhowobject—orientedprogramshouldbetested.

Aboveall,thispaperintroducesthebasicconceptofsoftwaretesting,aswellastheadvantagesandinfluencesofobject?orientedprogrammingtechnology,SOthatwecangrasptheoverallconceptofOOT.InChapter1andChapter2,therearefouraspectstobediscussed.ThefirstisOOTtechnologyanditsadvantages.TheSecondisOOTmethods,includingmethodsequencespecification-basedtesting,state—basedtesting,flowgraph—basedtestingandUML-basedtesting.ThethirdisthefourhiberarchyofOOT:methodtesting,classtesting,classclustertesting,systemtesting.Thefourthisthereuseoftestingcasesandtestingplan.

InChapter3,inordertoovercomethedrawbackofgeneralclass—statetesting,thepaperintroducestheconceptofClassPower.ClassPowerexpressestherelationsbetweenattributesandmethodsinaclass.Itcancheckthestatesofallbordersinsomestateinordertodeterminewhetherthosebordersthatshouldnotbecalledhavethepossibilitytobecalled.Ifthepossibilityexists.weconsiderthatthereareleaksinthemethodimplementation.Accordingtotheclassstatetesting,ClassPoweriscarriedoutsimultaneouslycombiningwithmethodsequencespecificationandthestateshiftsmatrix.

Finally,theauthorappliesthemethoddiscussedabovetotestingaWorkflowEngineproject.Bytestingclassesofthisproject,thepapergivesthedetailtestingimplementation.

KeywordsSoftwareTesting,Object—Oriented,ClassTesting,Workflow

华南理工大学

学位论文原创性声明

本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。

作者签名:弱吆冬LI期:加乒年/月/护目

学位论文版权使用授权书

本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权华南理工大学町以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。

保密口,在年解密后适用本授权书。

本学位论文属于

不保密口。

(请在以卜相应方框内打“4”)

作者签名:狗、壤冬导师签名:彩“争吻日期:加口车年,月/o口同期:7∽研年∥月∥/日

第一章绪论

第一章绪论

1.1研究背景和意义

随着计算机应用领域的迅速扩大,人们对软件质量提出了新的更高的要求。许多计算机科学家在展望二十‘世纪计算机科学的发展方向和策略时,把提高软件质虽放在优先于提高软件功能和性能的地位。因此,作为保证软件质量最有效手段的测试技术,已经越来越引起软件用户及开发人员的关注。大量统计资料表明,通常花费在软件测试和排错的代价大约占软件开发总代价的40%左右。。。

面向对象技术足一种全新的软件开发技术,已经逐渐代替被厂一泛使用的面向过程开发方法,被看成是解决软件危机的新兴技术。而向对象技术产生更好的系统结构,更规范的编程风格,极大地优化了数据使用的安全性,提高了程序代码的重用。应该看到,尽管面向对象技术的基本思想保证了软件应该有更高的质量,但实际情况却并非如此,因为无论采用什么样的编程技术,编程人员的错误都是1i可避免的,而且由于面向对象技术丌发的软件代码重用率高,吏需要严格测试,避免错误的繁衍。

因此,软件测试并没有因面向对象技术的兴起而失去其重要性”l。

从1982年在美国北卡罗莱纳大学召开首次软件测试的正式技术会议至今,软件测试理论迅速发展,并相应出现了各种软件测试方法,使软件测试技术得到极大地提高。然而,一度实践证明行之有效的软件测试对面向对象技术开发的软件多少鼎得有些力不从心,尤其是面向对象技术所独有的多态、封装、继承的新特点,产生了传统浯占设计所不存在的错误可能性…。

}_I_j于面向对象软件的封装件导致其没有传统结构化程序的层次式控制结构,作为一个整体,原有集成测试所要求的逐渐将开发的模块搭建存一起进行测试的方法已成为不可能。”。而且单元测试也失去了本身的多数意义,传统的白顶向下和自底向上的集成测试策略也有了较大的改变…。同时与传统的测试用例设计方法不同,面向对象测试关注于设计合适的操作序列以测试类的状态。即面阳对象的类是测试用例设计的目标,因为属性和操作是被封装的,对类之外操作的测试通常是徒劳的。然而,封装却使得这些信息在某种程度上难于获得。此外,继承也造成了对测试f}_}j例设计者的挑战,因为即使是彻底的复用,对每个新的使用语境也需要重测试。冈此,类的信息隐藏机制给测试带来了困难“3。

总之,而向埘象软件测试的策略和战术有了很大的4i同,测试的焦点也从过程构件转向了类。“。传统的结构化软件测试技术受到了前所未有的挑战,针对阿向对象软件的开发特点,应该有一种新的测试模型。

华南理l。火学【程硕十学位论文

因此,对面向对象软件的测试,其测试策略或测试方法都需要出现相应的变革或更新。我们必须结合面向对象技术的特点,研究新的面向对象软件的测试理论、方法来与之适应。在软件工程领域,面向对象软件测试足一个新兴而重要的研究方向,在这方面的深入研究将会产生真正对软件测试的理论与实践有指导意义、有影响的成果“1。

1.2国内外研究现状

目前,国内外对面向对象软件测试技术的研究尚处于起步阶段,还没有较成熟的、系统的方法和技术出现,对面向对象软件测试的层次划分也尚未达成共识,较为认同的一种划分方法是111:方法测试、类测试、类簇测试、系统测试。

方法测试,主要考察封装在类中的一个方法对数据进行的操作。

类测试,它主要考察封装在一个类中的方法与数据之间的相互作用。普遍认为这一级别的测试是必须的。在这方面,丰要出现了几类方法。其中主要是基于状态的测试,考察类的实例在其生命周期各个状态的情况。这类方法的优势是可以充分借鉴成熟的有限状态自动机理论对类进行测试。另一类方法是基于响应状态的测试,从类和对象的责任出发,以外界向对象发送特定的消息序列来测试对象。较有影响的是Doong和Frankl提出的基于规约的测试方法[8】,和Harro]d等人提出的基于程序的测试”l。

类簇测试,丰要考察一组协同操作的类之间的相互作用。

系统测试,是对所有的类和主程序构成的整个系统进行整体测试。

总的说柬,面向对象软件测试的自身特点,已开始为人们所认识。研究较多的集中在类和对象状念的测试方面,其它还有许多问题有待进一步研究。

1.3本论文研究的主要内容

≯第_二章,本文首先介绍了传统的结构化软件测试的方法,以求从总体上认识软件测试。然后重点介绍了面向对象软件测试的技术,在这其中,首先

讲述了面向对象软件丌发技术及其优点;接着讨论了面向对象软件测试的

几种方法,其中包括基于方法序列规范的测试、基于状态的测试、基于类

流图的测试和基于UML的测试;然后讲述了面向对象软件测试的层次划

分,这里把面向对象软件测试划分为四个层次:方法测试、类测试、类簇

测试、系统测试;最后讲述了测试用例的重用及测试计划。

>第三章,本文着重介绍了基于状态的类测试技术的特点以及其局限性;然后为了解决其局限性引入了一种本人称为“ClassPower”的测试模型。

第一章绪论

“ClassPower”用来表达类的各个属性和方法之间的关系,它能够检食在某个状态卜所有的边的状态,看看那些不应该被调用的边是否有被调用的可能性。如果有被调用的可能性,就说明方法的实现上有漏洞。

“ClassPower”测试模型t要以类状态测试为依据,辅以方法序列规范和状态转移矩阵,最终达到上述测试目的。

》第四章,将本文提出的测试方法,应用到一个实际的工程项目当中,即应用到工作流引擎项目中,来对项目中的某些类加以测试,讲述了具体的测试实施过程。

华南理工大学工程硕士学位论文

第二章面向对象软件测试

2.1传统的结构化软件测试方法

传统的结构化软件的测试步骤一般分为单元测试、集成测试、系统测试三个阶段。

单元测试阶段通常使用白盒测试和黑盒测试方法【”】。白盒测试通常要求对模块的内部结构的覆盖达到一定的标准,比如语句覆盖、判定覆盖、路径覆盖等。对程序覆盖的最低要求是语句覆盖,即模块中的每个语句至少执行‘‘次。黑盒测试的主要方法有:等价类方法、边值分析法、因果图方法等。

在每个模块完成单元测试以后进行集成测试。集成测试有自顶而下和自底而上两种策略。采用自顶而下的测试方法需要对每个非顶层模块设计一个桩模块,而采用自底而上的测试方法需要对每个非最底层模块设计一个驱动模块。最后在集成测试完成之后,还要进行系统测试和验收测试,才能将产品交付用户使用。如图2.1所示。

ClieIlt磊ds。』:|一:。一蚓Ac。。五二忑Testing1

~’一1【_。一4—1

Req“i”…eats—joL!r?。竺二!型竺』

1¨_

。。三ign~:一一I.赢磊刑I_Testing1

i;:。。r一…Tng

Codli矗j—U—ni…t{eIstt。。

图21测试方法图

集成测试完成后,进入系统测试阶段,以检验系统是否实现了需求规范中规定的所有功能和性能,以及是否满足用户的需求。

而对于面向对象软件,由于引入了对象机制,对它的测试将有很大的不同。

第二章面向对象软件测试

2.2面向对象软件测试

2.2.1面向对象软件开发方法

面向对象软件丌发方法已成为当今计算机软件领域的主流技术,它已深入到计算机领域的几乎所有分支,远远超出了程序设计语占和编程技术的范畴。在软件开发领域,面向对象不仅足一些具体的软件开发技术与策略,而且是整套关于如何看待软件系统与现实世界的关系,以什么观点来研究问题并进行求解,以及如何进行系统构造的软件方法学。它的基本思想是:从现实世界中客观存在的事物出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式。丌发一个软件是为解决某些问题,这些问题所涉及的业务范围称作该软件的问题域。面向对象方法强调直接以问题域(现实世界)中的事务为巾心来思考问题、认识问题,并根据这些事物的本质特征把它们抽象的表示为系统中的对象,作为系统的基本构成单位。这可以使系统直接映射问题域,保持问题域中事务及其相互关系的本来面貌。

面向对象技术丌辟了软件开发的新途径,使软件工程理论更加完善。特别是统一建模语言的提出使面向对象软件开发更加有章可循、有法司‘依,而RaLionaJUnifiedProcess则是以统‘建模语言为基础形成的软件,1:发过程。不论采用什么软件开发技术,其定义的软件开发过程都会有软件测试阶段,并月.随着软件工程的不断发展软件测试变得越来越重要,它同软件开发过程结合得更加紧密。

而向对象技术具有方法的唯‘性、阶段的高度连续性及将面向对象分析、设计、测试集成到一起的特点,它是强有力的软件开发方法。对象技术导致复用,复用导致更快的软件开发高质量的程序。面向对象技术通过封装数据和操作实现封装性。封装技术实现了信息隐藏,简化了系统接口,降低了系统耦合度。继承根据已有的定义建立新定义,它是直接实现复用的技术,通过形成类层次机制使变化能够被很容易地传播到系统的其它部分。多念性技术提供了结构方面的灵活性。使用多态性时需要对照形式参数检杏实际参数井对二者进行精确匹配”1。

由G.Booch、J.Rumbaugh和J.Jacobson共同推出的统一建模语言在面向对象领域受到广泛的关注。统一建模语言是定义建模元素和表示符号的模型语言,它是用于软件产品构造及建档的规约化、可视化语言,它也适用于业务建模及其它非软件系统,它包括UML概要、UMI.语义、UML表示法指南、对象约束语占规约、软件工程对象过程扩充、业务建模扩充及uML扩充/二素。UML表示法指南中给出UML中的各种图。UML中的图主要有“…:

1.静态结构图:包括类图和对象图。类图是静态结构模型的图形化表示,它

华南理工大学上程硕十学位论文

足模型元素的集合;对象图是实例的图形化表示,静态对象图是类图的实例。

2.UseCase图:UseCase表现活动者与UseCase的关系,即系统或类与外部的交互。UseCase是系统或类提供的由消息序列和活动共同体现的紧凑功能单元。

3.顺序图:顺序图按时问顺序排列出UML交互图,它表示对象在“生命线”上的交互,即对象之问按时间顺序交换的消息序列。

d.协作图:协作图是表示对象问操作和关系的UML交互图。

5.状念图:状态图表现对象、交互在整个生存期内的状态序列。

6.活动图:该图表示类中操作实现状态机的状态图。

7.实现图:实现图表现源代码结构和运行实现结构。

Rationa]UnifjedProcess是美囡Ratjona]公司基于统一建模语言制定的软件开发过程,其目的是生成符合用户要求的软件产品或对现有的软件产品进行升级,它规定开发小组成员进行软件开发的规则和步骤。RUP作为软件丌发过程采用螺旋模型对软件系统进行开发,它是一系列增量发布的过程。RuP将软件开发全过程分成若下个生命周期,每个生命周期中有商业分析、需求分析、分析和设计、实现、测试、发行、配置和修改管理、项目管理和环境配置等不同的开发过程。

2.2.2面向对象软件开发方法的优点

面向对象程序通常由一系列类组成,类定义中封装了数据(用于表示对象的状态)和操作(方法),数据和操作统称为类的特征。根据外界对它的访问权限不同,特征可分为三类:公有的、私有的(仅限于类内成员函数访问)、保护的(仅限于类内及其派生类的成员函数访问)。类的实例称为对象。类和类之间按继承关系组成一个无环有向图结构,父类中定义了共享的公共特征,子类除继承父类中定义的所有特征外,还可以引入新的特征,也允许对继承的方法重新定义。而I向对象语言提供的动态绑定机制可以将对象与方法在运行中动态的联系起来,实现程序的多念性。而向对象程序的封装性、继承性、多态性等特性使程序具有较大的灵活性,特别是当用户需求变动时,设计良好的面向对象程序变动相对较小。正是由于具有这砦较传统的结构化方法更为优越的特色,面向对象方法成为更有力的克服软件危机、提高软件质量、实现多学科综合的有效技术。此外,面向对象方法还提供了较结构化方法更自然、更合理的概念与方法,使采用面向对象方法建立的软件系统尽可能接近于现实世界。正如Ledbetter与Cox在1985年所指出的:“面向对象方法允许更直接地表示现实世界,从而使由‘系统需求’到‘系统说明’的转换可以显著的减少。”

第二章面向对象软件测试

下面对面向对象方法的解题与结构化方法的解题作一比较,以阐明面向对象方法的优点。这早的解题是指对客观世界的问题空间的求解过程。为了比较两种方法的差异,首先给出计算机解决现实世界问题的过程,简称为解题过程(如图2.2所示)。

I一———————————————————1坐兰l”-塑塑掣题——Il

————‘L————.————————11转换成计算机表示形式

。编程Il————I

程序|

l————I

华南理j:人学J:程硕十学位论文

剀2.3(b)面向对象解题方法

3.而向对象方法的优越性

以“对象”为中心的解题方法远较以“过程”为中心的解题方法优越。具体表现在如下几个方面:

(1)采用“对象”为中心的解题方法能更自然、更直接的反映真实世界的问题空间。因此,按血向对象方法进行系统分析、设计时,由丁|对象、类、子类都自然的对应于实际问题域的物理或逻辑实体,其编程:【作量仅仅是将问题译成代码。这样,就使问题的转换工作量达到最小的程度。事实上,采用面向对象方法较之结构化方法在编程量方面可降低40%N90%。

(2)以“对琢”为中心的解题方法采用消息传递机制作为对象之问相瓦通信的唯一方式。对象本身具有很强的自治性和独立性,接受消息的对象有权负责响应与处理所受到的消息:按消息名激活本对象内相应的操作(称为方法),并执行该操作、返回适当的结果。发送消息的对象还可将同~条消息同时发送至多个接受消息的对象中,并允许这些接受同’条消息的对象按照自身的适当方式加以响应。这样就使消息传递的机制能很自然的与分布式并行程序、多机系统、网络通信等模型取得一致,从而强有力的支持复杂大系统的分析与运行。而在结构化方法中,由使用者调用“过程”,它显示地为使用者所见,缺乏简单、方便与灵活性。

(3)以“对象”为中心的解题方法具有独特的继承性和更丰富的多态性,使这种解题方法更易于扩充,能很好的适应复杂大系统不断发展与变化的要求。结构化方法则不具备继承性。

第::章两向对象软什测试

2.2.3面向对象软件测试方法概览

现将有代表性的面向对象测试方法总结如下:

1.基于方法序列规范的测试方法“。…:方法序列规范(Mtss:MethodSequenceSpecificatiOFt)规定了类中方法的执行顺序,如哪些方法必须按先后次序执行,哪些方法t叮以并发执行等等。依照这样的规范,町以为类产生1些消息序列,检验类中的方法是否能正确地交互。由Mtss生成的序列可能是无限的,此时可以采用传统的划分测试的思想,将测试空间分为一个个子集,然后从每个子集中选取少量的测试用例。文献[13]提到了三种划分策略:

≯基于状态的划分准则:按照方法是否改变对象的状念将方法集分成两个子集,改变对象状态的方法集和不改变对象状态的方法集。

>幕于属性的划分准则:按照每个方法对指定实例变量的不同使用方法,把方法归于不同的子集。

>基于操作特征的划分准则:按照方法的操作性质对方法归类,把具有类似操作性质的方法归为一个类别。

此外,还应生成‘些错误的消息序列以检查被测系统的健壮性。生成非法序列的方法有:遗漏法、颠倒次序法、冗余法等。

2.基于状态的测试“5’”。”’”’”’2…:基于状态的测试是以状态机模型或某些模型化规约(如ObjectZ)为基础的测试。测试时按照一定的覆盖准则对状态转换图进行遍历,以产生消息序列,并依据状态图检查每一消息序列是否使被测对象达到了规定的状态。

基于状态的测试充分考虑了对象的消息序列和状态,且按照一定的覆盖标准产生测试用例,是一种较为有效的面向对象的类级和类簇级测试方法,也是目前研究和使用得较多的。

3.基于类流图的测试““”1:类流图是一种表示类的行为特性,且在结构上与传统控制流图相似的有向图。假设对于一个给定的类C,0代表它的方法集,那么它的类流图G中的结点分别表示0中的每一个方法,有向边(Ot,02)表示方法0z可在方法0-之后被调用,事实上也就是方法0-的后置条件满足方法Oz的前置条件。有了类流图,类的方法序列可以很容易地由对图的遍历得到,其覆盖准则也包括点覆盖、边覆盖、路径覆盖等等。某些有向边旁标有判断条件,类似于流程图中的逻辑条件,可以用来确定变量的取值。类流图中也常常存在循环,使其路径数为无限。

第一种和第三种方法都可以推广到类簇测试中,通过方法序列规范或类流图,可以很方便地为被测类生成消息序列,但它们的缺陷均在于没有考虑被测类的状

华南理I一人学工程硕士学位论文

态,鉴于状态检食在类测试中的重要地位,它们通常不被看作是主流的测试方法。

4.基于UML的测试:UM[。是。种图形化建模语言,它为面向对象软件提供了一整套强大的建模1:具,同时也可以作为测试的依据。下面介绍几种已被应用于面向对象软件测试的UM[。模型。

(1)类图“…:类图描述r组成面向对象程序的各个类之问的关系,包括联系、聚集、重数、子类型和递归包含等。采用类图可以检查类之闽的这些关系是否得到了正确的实现。例如文献[15]中介绍的对于重数关系的检验,通过为具有重数关系的两个类分别创建’定数目的实例对象来检验关系实现的正确性;再如,对两个具有“拥有”关系的类,可通过检查其中一个类是否对另一个类的对象被更新或删除做出正确的反应来判断其关系实现的正确性。

类图也可以作为确定类问测试次序的依据。

(2)顺序图。。“【:顺序图用来描述对象之间动态的交互关系,着重体现对象问消息传递的时间顺序,因此它可以作为类簇测试的依据。顺序图可以转换为流程图,这种流程图表示了对象问消息传递的顺序,与程序流程图在形式上极为类似,也包括了顺序、分支和循环等,是一种高度的可测试模型。其测试方法与程序控制流图的测试方法类似。

(3)状态图”5。…l:状态图描述了‘个对象在其生命周期中所有1lJ能的状态,以及由于事件的发生而引起的状态问的转移。状态图可作为基于状态测试的依据。

(4)用例图”“2…:用例模型描述的是外部执行者所理解的系统功能,它可以为整个的软件系统建模,因此用例模型的图形化表示一一用例图可被用在系统测试中。用例图中的每一个用例都可以转换为一个状态转换图,然后参照状态测试的方法进行测试。

2.2.4面向对象软件测试的内容

虽然面向对象软件开发方法给开发人员带来了很大的方便和灵活性,并通过软件重用大大提高了软件生产率和可靠性,但也影响了软件测试的方法与内容。_F面简要介绍一下而向对象软件测试的一些基本内容”,…。

2.2.4.1基本构造单元

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

第二章面向对象软件测试

工作过程中,对象的状态町能被改变,产t!l_{i新的状态,即发生状态的转移。对象中的数据和方法是一个有机的整体,在软件测试过程中,不能仪仅检查输入数据产生的输出结果是否与预期的结果相吻合,还要考虑对象的状态变化。因此,除了要对类方法进行测试外,还要对对象的状态与方法间的相互影响进行测试,也就是还要进行状念测试。图2.4显示了传统的测试模型与类测试模型的差异。

输一数槲————————.{————五二彳———]——————-辅…缸拊

共的测b£模掣

图2.4传统测试模型与类测试模型的差异j}iiI!11数荆输fI-数州

2.2.4.2系统的功能实现

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

2.2.4.3封装性

类的重要特性之一是封装性。它对类中所封装的信息的存取进行控制,从而避免类中有关实现细节的信息被错误地使用。而这样的细节性信息正是软件测试所不可忽略的。因此,类的封装性给对象状态的观察、测试用例的生成、测试点的选取等带来了困难。

由于而向埘象软件系统在运行时由‘组协调1:作的对象组成,对象具有一定的状态,所以对面向对象程序测试来说,对象的状态足必须考虑的因素,测试应涉及对象的初念、输入参数、输出参数、对象的终态”“。对象的行为是被动的,它只有在接收有关消息后才被激活来进行所请求的工作,并将结果返回给消息发送者。在工作过程中,对象的状态可能被修改,发生状态转移。

面向对象软件测试的基本工作之~就是对象状态测试,即先创建对象(包括初始化),在向对象发送一系列消息然后检查结果对象的状态,看其是否处于正确的状态”'”_“。问题是对象的状态往往是隐蔽的,若类中未提供足够的存取函数来表明对象的实现方式和内部状念,则测试者必须增添这样的函数,即增加一些用

华南理j】二大学1:程硕士学位论文

于设置和检查对象状态的方法。通常是对每一个数据成员设置一个改变其取值的方法,或者在测试期间“打开”该类,所谓“打开”,即在测试期间改变类成员的访问特性为公共的。

2.2.4.4继承性

继承性是面向对象程序的基本特性之一,它是一种概括对象共性和组织结构的机制,使面向对象设计更具自然性和直观性,是一种有效的重用手段。它使得程序员可以通过类的重用,减少程序的代码量。但是程序代码的减少并不意味着程序测试的简单化,反而使程序的测试更加复杂。如果。个类继承了另一个类,

那么也就继承了浚类的成员函数。这些继承的函数是否需要重新进行测试呢?一个函数在基类中工作得很好并不意味着它在派生类中也能很好地工作,这是因为函数的运行环境发生了变化,摹类的环境中所满足的条件在派生类的环境巾未必满足。这里有两个原因使得被继承的函数需要进行新的测试:

1.在派生类中改变了基类中某些变量的值,使得某个继承函数所假定的基类变量洲的某些关系由于这些修改而不冉保持。

2.一个继承函数的执行导致了派生类中某些函数的执行。

在上面的两种情况中,第一种情况可以通过将基类中的数据成员定义为私有成员而得到避免。但是对于第二种情况,用户就必须重新测试这些函数。我们看下面的例子:

puhl】12,classAf

publiCVOidFunctiOilB0

pubiicvo【dFuncttonA()

FUIlCtionB0,

pubiiCCIassBextendsA

ptlhlicvoidFunctionB0

这单类B继承了类A的函数FunctionA0,同时又对函数Function—B0进行了重定义。在对类B进行测试时,由于函数Function—A0的函数体中调用了男一个函数FuncLi012B0,而且在派生类B中有进行了重定义。因此,使用类B的成员函数FunctionA0时,函数Function—A0的执行将引起类B的函数FunctionB0的执行。在测试类B时,我们必须蕈新对FunctiOil—A0进行测试。

在类的继承中还有‘个应该注意的问题是继承层次中的函数重定义问题。就

第二章面向对象软件测试

像上而的例子所讲的一样,类B重定义了类A的函数FuncLiOn—B0,我们显然应该测试类B的甬数FuncLiOnB0。但是,在类B的函数中仍然可以使用类A的函数A.FuncLionB0,如果类A的函数FuncLiOnB0满足上面的第二个条件,那么也i叮能要对类A的函数Function—B()进行重新测试。尽管类B中只定义了1个函数Function—B0,但是我们呵能要测试三个函数:FunetiON—90、Function—A0、^.FunctionB0。

2.2.4.5多态性

多态性是面向对象方法的关键技术之一。多态性是指子类对象可以象父类对象那样使用,I司样的消息既町以发送给父类对象也可以发送给予类对象。我们知道,结构测试要求我们对模块的内部结构进行测试,测试的结果用模块结构的覆盖程度来衡量。对类的每个成员函数都应该进行结构测试。测试的结果至少应达到语句覆盖的程度,一般应要求达到分支覆盖的程度,即分支语句的每个分支至少执行一次。而多态性的存在,隐藏了程序代码的复杂性,使得程序能够用较少的代码完成复杂的功能,而且使程序进行扩充时对源代码所做的修改很少。但是多态性的使用却使得程序的结构测试要复杂一些。请看下面的Java语言的稃序:Shapefigtlre:

第一句说明figure是类型为Shape的对象,第二旬是向figure对象发送消息Draw0。假设程序中有如图2.5的继承关系。则在语句figure.Draw()执行时,由于多态性的存在,figure可能指向的已不是一个类型为Shape的对象,而可能是类型为Circle、Trian91e、Square的对象。如果Draw0在这些类中进行了重定义,那么语句figure.Draw0执行的将不再是Shape中定义的Draw0函数,而足它的衍类中的Draw0函数。

事实上,上面的。段程序可以写成下面的形式:吕

薷夤

华南理工人学工程硕十学位论文

caseTrian91e.DrawTriangle(figure)break

caseCil、cle.DrawCircJe(f{gure):break

caseSquareDrawSquare(figure):break.

从卜面的例子川+以看出,程序中每一个多态性的语句事实卜都相当于一个分支语句,多态性语句的使用隐藏了程序的复杂性。这样,我们在进行结构测试时,就应该做到figure指针的每个可能的取值都应该覆盖到,只有这样才是做到了分支覆盖。因此,由于多态性的存在而使得语句的覆盖实现起来要困难的多。

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

面向对象软件测试的动态测试工作过程与传统的测试一样,分为以下几个阶段:制定测试计划、产生测试用例、执行测试和评价。但在测试的具体内容上,因为面向对象软件的特殊性而不能完全套用传统的;雯|l试思想和方法。同前,面向对象软件测试的层次划分尚末达成共识。一般认为,面向对象软件与结构化软件一样,都要进行系统级测试。本文介绍一种较为普遍的层次划分方法。

从面向对象软件的结构出发,可以将面向对象软件测试分为四个层次“:方法测试、类测试、类簇测试、系统测试。

2.3.1方法测试

方法测试主要考察封装在类中的一个方法对数据进行的操作,它与传统的单元(模块)测试相对应,可以采用传统的测试方法:白盒测试、黑盒测试、排错测试、域测试等。但是,方法与数据一起被封装在类中,并通过肉所在的对象发送消息来驱动,它的执行与对象状态有关,也有可能会改变对象的状态。因此,设计测试用例时要考虑设置对象的初态,使它收到消息时执行指定的路径。而日.为了便J二观察隐蔽的结果状态值,往往要添加一些对应的函数。另一方面,若方法内部引』_Ij了别的对象的方法,则要用测试桩模块来替代。由于方法与所在的对

第二章面向对象软件测试

象状态相关,桩模块的设计选取难度较大。

2.3.2类测试

类测试主要考察封装在一个类中的方法和数据之间的相互作用。一个对象有它自己的状念和依赖于状态的行为,对象操作既与对象状态有关,又反过来可能改变对象的状态。因此,类测试时要把对象与状态结合起来,进行对象状态行为的测试。类测试可分为以下两个部分:

(1)慕]二状态的测试:考察类的实例在其生命期各个状态下的情况。

(2)基于响应状态的测试:从类和对象的责任出发,以外界向对象发送特定的消息序列来测试对象。类测试的示意图如图2.6所示。

方法定义

方“.定义

方法定义

方浊测试

2.3.3类簇测试图26类测试示意圈

炎测试

☆仃

类簇是一组相互合作的类。类簇测试主要考察’组协同操作的类之间的相互作,}=}j,是系统集成测试的一个子阶段。在单个类分别进行测试后,根据系统中类的层次关系图,将相互有影响的类作为一个整体,检查各相关类之间消息连接的合法性、子类的继承特性与父类的一致性、动态绑定执行的正确性、类簇协同完成系统功能的『F确性等等。其测试用例可由多种方案结合生成。如根据类的继承关系图来纵向检查类,同时又根据对象之间方法的相互作用来横向检查类的关系。

华南理工大学工程硕士学位论文

2.3.4系统测试

系统测试是对所有类和主程序构成的整个系统进行整体测试,以验证软件系统的正确性和性能指标等是否满足需求规格说明书和任务书所指定的要求。它与传统的系统测试一样,包括功能测试、性能测试、余量测试等,可套用传统的系统测试方法。

2.4面向对象软件测试用例的重用

面向对象程序的继承概念使得测试用例的重用成为可能,在测试时,我们?司‘以充分利用基类的测试用例来对派生类进行测试。测试用例的重用使得派生类的测试中需要重新设计的测试用例减少,从而加快测试阶段的进度。卜-面我们通过一个具体的例予来说明测试用例的重用方法。

publicclasSCPolygon

publicVOidDraw0

VO{dMove0,

publicclassCTrian91eextendsCPolygon

publicvoidDraw():

j.

在测试类CPolygon时,对函数Draw的测试,我们可能使用了三角形来对它进行测试,那么当我们测试类C'I、riangle的函数DraW时,就有可能重用这部分用三角形进行的测试用例。同样,如果在派生类CTriangle中需要测试继承函数Move,也川‘以重用基类CPolygon中用i角形对函数Move进行测试的用例。这样通过测试用例的重用,对派生类的测试就可以减少许多测试用例的设计工作,从而大大节约测试阶段的开销。

2.5面向对象软件的测试计划

从上面的讨沦中可以看到,在类的测试中,需要对类的测试进行细致的漫计

相关文档
最新文档