基于UML顺序图的测试
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
基于UML顺序图的测试方法
江泽凡王林章李宣东郑国梁
(南京大学计算机科学与技术系南京210093)
计算机科学2004Voi.31?.7
摘要本文描述一个在UML顺序图上生成测试用例的方法.我们使用带OCL约束
的顺序图.即从类图和状态图
中提取信息以OCL形式附加在顺序图的对象生命线的适当位置.首先检查顺序图
的完备性和一致性.然后从顺序图
中生成测试规格说明以及顺序图的事件系列.最后根据测试准则采用类似于类别
一划分方法进行测试用例的生成.另
外,我们将此方法应用于一个简化的DHCP协议,解释了方法的一般过程以及方法
的可行性.
关键词UML顺序图,OCL,测试规格,测试用例.类别一划分方法
AnApproachtoGenerateTestCasesBasedonUMLSequenceDiagrams
JIANGZe??FanWANGLin??ZhangLIXuan—-DongZHENGGuo—?Liang
(DepartmentofComputerScienceandTechnology.NanjingUniversity.Nanjing210093) AbstractThepaperpresentsanapproachtOgeneratetestcasesfromUMLsequencediagrams.Wemakeuseofthe
UMLsequencediagramswithOCLfromwhichintegratetheinformationspecifiedinclassandstatechartdiagramsin—
tOsequencediagramsandrepresenttheinformationasconstraintsattachedtOproperlocationsoftheobjectlifelinesin
thesequencediagrams.First,weprovideamethodforcheckingcompleteness,correctnessandconsistencyofthese—
quencediagrams.Secondly,wederivetestspecificationsandeventseriesfromthesequencediagrams.Finally,ac—
cordingtOtestcriterion,wecreatetestcasesviathewell—knownCategory—
PartitionMethod.Additionally,thepaper
appliestheapproachtOaddressasimplifiedDHCPprotocol,andexplainseverystepinthemet
hodanditsfeasibility. KeywordsUMLsequencediagrams,OCL,Testspecification,Testcase,Category—
partitionmethod
1引言
越来越多的软件开发采用面向对象
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
思想,基于此思 想,UML在系统分析和设计阶段的建模已成为一个事实上 的
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
,它提供一些图以用来对一个系统的各个方面进行建 模.对于测试者来说,UML的使用使他们面临新的课
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
,近 年来已经有许多论文研究了基于UML的测试用例的生成方 法[3.此外,许多商业的或研究性质的工具也开发了出来. 这些方法和工具基于不同的功能测试概念和不同的输入语 言文[4]基于UML协作图采用了传统的数据流覆盖准则但 并没有描述测试用例的生成.它分析了UML规约级和实例 级协作图中所能表示的信息,将信息进行分类,有些信息可以 用于对最终程序的静态检查,有些信息可用于动态测试;并设 计了一个根据协作图中信息对相应生成的程序进行插装的算 法,实现对测试满足测试准则的程度的度量文[6]提出基于 UML设计规约生成测试用例的方法,用UML状态图建立软 件动态行为的模型,组件之间的交互用图上注解表示,将设计 规约模型转化为与集成系统的动态行为相应的全局FSM,在 FSM上基于一定的覆盖准则使用常规的等价类划分方法生 成可用于单元和集成测试的测试用例.在文[1o]中提出一个 新的基于UML的测试模型生成集成测试的测试用例的方 法,该方法首先分析软件系统的顺序图和协作图,提取组件间 的事件流,根据组件之间的消息转移将顺序图和协作图划分 为一组原子系统功能(ASF)单元,以每个ASF为一个节点,
消息流为边构造测试模型,使用面向对象的集成测试方法在 测试模型上生成测试用例.文[8]提出一种不需要其它形式化 知识,只在UML框架内,选择实现和执行每个用例图描述的 功能的相应顺序图,协作图以及类图,分析图中元素的语义, 识别出作为测试单元的参与交互的对象和与其相关的消息的 等价类,定义测试规约,从图中找到消息顺序,使用传统的类 别一划分方法分析消息顺序,生成最终的测试用例.文[9]提出 了一个基于UML顺序图设计的面向对象的软件的自动测试 的概念和相应的实现工具SeDiTeC.该方法提出了一个可测 试的顺序图的规则,凡是满足可测试性需求的软件系统的顺 序图设计模型都可以作为测试规约,并介绍了从一个顺序图 中生成测试用例的方法,在SeDiTeC中实现了完整的测试过 程.
本文探讨基于UML顺序图的测试.我们的工作具有两 方面的特点,即测试方法完全基于UML,以便已经使用 UML的软件系统能方便地采用,因而方法使用带OCL的顺 序图同时使用UML图作为系统功能片断的高级描述,用来 作为生成测试的基础,使得在系统开发更早阶段就可以计划 集成测试阶段的测试
我们采用传统的黑盒测试方法,在这里我们的想法来源 于着名的类别一划分方法[1.首先依据用例图,从其相应的 每一个顺序图确认出相关的组件.或称之为测试单元,对于每 *)本课题研究得到国家863科技项目(2002AAl16090),国家自然基金(6027036).江
苏省自然基金(BK2002079)资助.江泽凡硕士研究生?研 究方向为面向对象的软件测试.王林章博士研究生,研究方向为软件测试.李宣东
教授.博导,主要研究方向为面向对象技术,形式化方法和 模型检验.郑国梁教授,博导,研究方向是软件
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
,形式化方法. ?131?
一
个测试单元,得到相应的设置(一些参数,变量,环境状态. 部是可用OCL来表示的)和相应的交互消息(用OCI,表示的 前置条件,后置条件),然后从这些设置和交互消息中确队出 有意义的选择(意思同类别一划分方法).在这个过程中,同时 要分析相应的类图以及状态图.因此,通过顺序图中组件之间 的消息系列,构造测试用例,每个测试用例是由这些有意义的 选择所组成的.
我们应用此方法实施一个简单的实例研究.由于 DHCP.]比较容易理解.并且可以用较少的UML图来表示, 因而选择它作为我们的实例.DHCP是由IETF进行标准化 的一个协议,它是BOOTP的扩展,是基于C/S模式的.提供 了一种动态指定IP地址和配置参数的机制.DHCP定义了一 种可以使IP地址使用一段有限时间的机制,在客户期限到了 的时候可以重新分配这个IP地址.在此例子中,我们开发出 一
些测试用例,并能确认出一些设计缺陷.然而,我们的方法 目前仍然是手工的,我们希望实现一个工具能够进行部分自 动化工作.
本文第2节描述作为本文用来实现的实例.第3节解释带 OCL的顺序图的语法和语义以及有关UML其它图的一些 介绍.在第4节我们详细地描述上述方法,并结合例子进行逐 步解释.最后部分是结论和将来工作的构想.
2实例
在这里我们描述DHCP协议的一个子集,更详细的内容 可以参考文[14].协议的一般过程如下:
1.客户端广播一个DHCP—DISCOVER消息.
2.每个具有网络地址的服务可能响应一个DHCPOF— FER消息.
3.客户端接收到,一个或多个DHCPOFFER消息.选择 其中一个,然后广播一条DHCP—REQUEST消息给所有的 服务器,并附上选择参数及指明哪一个服务器.如果客户端没 有接到任何DHCP—OFFER消息,则表明服务超时. 4.所有服务器接收到客户的广播信息.只有被选中的服 务器才绑定地址给这个客户,并发送确认消息:DHCP—ACK. 如果要求的地址不再可得(可能分配给其它的客户),则服务 器发送一个DHCP—NAK给客户.
5.客户接到确认消息后就可以开始使用这个网络地址直 到它发送一条DHCPRELEASE消息表明放弃这个地址. 这个简单的例子能使用下列相关的UML图:
图1的类图显示了本例中的系统元素.类DHCP—Client 表示客户可以连接到网络或从网络中断开(使用connect和 disconnect).能由initiate操作来创建.并可以接收offer.ack 和nak消息.类DHCP—Server作为网络的一部分,能被创建, 能对接收到的消息进行处理(discove,requestr和release),私 有操作检查IP是否可得以及得到一个IP地址.另外,类图能 进一步使用OCL表示约束,这些约束包括类的数据不变量和 它们的一些属性,以及类操作的前置和后置条件.一个服务端 操作getFreeIP()的例子为:
contextServer::getFreeIP():IPAddress
post:result.getBinding()=false 还有显示类Server和Client对象的内部行为的状态图以及 下面要介绍的顺序图.
图1DHCP的类图模型
5UML顺序图
UML定义了两种图以用来描述对象之间的交互,即顺 序图和协作图,它们基于同一基本信息,但是强调不同的方 面-l2.顺序图强调的是交互过程中的明确的时问顺序,不
像协作图,顺序图并不显示不同角色的对象之间的关系和它 们彼此之间的联系.顺序图的时间顺序是由图中的垂直轴线 (对象的生命线)和水平线上特定对象所表示的.交互是由在 ?132?
一
个实现特定目标的协作内一组对象之间通信序列组成的行 为规约.每个交互包含消息的偏序集,这些消息由类元角色通 过关联角色交换.
顺序图中的消息是由图中发送者角色到接收者角色一条 带箭头的线表示,在其上可以标上调用的操作,称之为消息标 签,其一般形式为:return-value:一operation—name(argum— ent—list).在参数表中可以包含对象引用,前一个消息的回送 变量表达式以及从发送对象开始的导航表达式,顺序图中有
两条控制信息是重要的.一个是条件.它表明何时发出消息, 仅当条件成立时才发出消息;另一个是迭代标记.它表明对多 个接收者对象一个消息发送多次.如图2是例子中一个请求 IP不成功的顺序图
天——
fcDli日enet/EaCelierfln;『
{..T一
0er(JPAddresg.DHCP—Server】
'Nofcorlnected'
一一
图2请求IP不成功的顺序图
5.1顺序图的定义
为了测试中寻找出事件系列的需要,下面给出顺序图的 形式化定义:
定义1(顺序图)UML中的顺序图SD可以表示为一个
七元组:SD一(O,M,E,一,rnsg,D勿,c>.其中: ?
0:{0,0,…,O},是对象的集合.O.,O,…,O都是
顺序图中的对象.
?
M~guard×message—name×parameter—list,是消息的 集合.顺序图中的每一个消息都形如:"[条件]消息名(参 数)".
?
E=MX{,r},是事件集合.事件是指消息的发送和接 收.对于消息msg,发送事件用(rnsg,>表示,接收事件用 (rnsg,r>表示顺序图中所有发送消息事件的集合记为,所 有接收消息事件的集合记为R.nR=cP,SUR=E. ?一
是消息集合上的一个全序关系,表示顺序图中的 消息在纵向时间轴上的先后关系.
?rnsg是从E到的一个函数关系,rnsg(,)?M,表示事 件所对应的消息.
?obj是从E到0的一个函数关系,obj(,)?0,表示事件 所对应的对象对象o-上所有事件的集合记为E,E.={『 ?EAobj(,)一Q).
?c是从到R的一一映射关系,每一个发送消息的事件 都有唯一的一个接收消息的事件c()与之对应;c_1是从R 到s的一一映射关系,每一个接收消息的事件r都有唯一的 一
个发送消息的事件c(r)与之对应.
(ml
fIn
图3一个简单的顺序图
在图3所示的顺序图中:
0一{obj1?obj2?D幻3};M一{l.m2,3}; E一:'nzI?j),(1,r.(2.j).<m2.r).(3.j).(3.r).:
一1一2一3
UML的顺序图主要描述了消息间的前后顺序关系,也 就足发送消息的事件和接收消息的事r+之间的时间顺序事 件之间的顺序有两层含义:一种是可视顺序.另一种是强制顺 序.可视顺序是可以从顺序图中直接观察到的顺序,用'<'表 示.它包括两个部分:一是任何消息的发送事件先于接收事 件,二是对每一个对象O,,在其生命线上的所有事件E有一 个局部的全序关系<,在时间轴上方的事件先于时间轴下方 的事件发生.即:
<三三三(y<,)y{(.f())『?S}
其中:<.i{(el,e2)l0(e1)一0勿(e2)=0.Arnsg(e1)-'~msg
(2)}
可视顺序并没有描述出顺序图中的所有语义信息.比如 在图3中,尽管(m,r)与(m,r)满足可视顺序(m,r)<(m,, r).但是在系统的实际运行中由于m,m,m.都是异步消息, 因此(m.,r)并不一定先于(m..r)发生.可能是消息m传递所 需的时间大于消息m和m.传递所需的时间之和这是由于 图形表示的局限性造成的.因此我们定义了强制顺序关系强 制顺序记为'<<',它是由系统的自身特性和底层结构所限 定的事件之间的顺序.这些系统特性有:消息传递是同步还是 异步,消息的队列存储机制是FIFO还是随机存取,消息传递 的媒介等等对于两个事件e,强制顺序<<可以定义为: <<
f如果:e2一c(e1),则el<<e2 I如果:(Dbj(e1)一D(e2))A(elde2)A(el?R)A(e2?S), 则el<<e2
I如果:(obj(e1)一D幻(e2))A(el<e2)A(el?s)A(e2?s), 【则,1<de2
上面的定义说明,一个对象只能控制自身发送消息事件 的时间先后,对于接收消息事件,由于系统的底层结构是未知 的,因此接收消息的时间也是不确定的.实际上<<关系是< 关系的一个子集,强制顺序是系统必须满足的根本时间顺序, 而可视顺序则增加了更多的由图形表示所造成的限制或用户 在对系统功能不明确的情况下做的一些冗余的时间顺序约 束如果直接使用'<'关系来分析顺序图,将不能准确反映系 统的行为特征,出现许多不可预知的错误.比如图3中,如果认 为r一定先于r3发生,则系统运行过程中0先接收消息m,再 接收消息m的情形就被忽视了,这会导致最终生成的系统的 不准确性和不完备性,从而出现死锁,消息丢失等错误. 顺序图刻画了系统运行的一个场景,其运行过程表现为 一
个事件的序列(,,…,e>,其中事件十在事件之后 发生(1?i?m一1).由于事件之间存在强制顺序关系<<. 因此并不是所有的事件序列都是顺序图允许的.同时,由于< <并不是一个全序关系,因此一个顺序图可能允许多个事件 序列.我们可以用一个有向图来表示<<关系,对于任意两个 事件,?E,如果6<de,则从B画一条指向,,的线直到 所有事件都在这个有向图上.根据这个有向图从所有入度为0 的事件开始遍历整个图,可以很容易地得出顺序图的每一个 有效的事件系列.在图3的例子中:
((ml,),(m2,),(m2,r),(m3,),(m3,,),(ml,r)>和
((ml,),(ml,r),(m2,),(m2,r),(m3,),(m3,r)>就是两个 有效的事件序列.
?】33?
5.2与类图和状态图的关系
UML元模型描述了所有我们在此文中的所有图之间的 关系,行为元素包定义了顺序图和状态图的模型元素.协作包 (顺序图的基础)和状态机包(状态图的基础)都是公共行为包 (行为元素包的一个子集)的子集.在这些包中,使用了核心包 (类图的基础)模型元素.
类图定义了属性,操作以及类对象之间的关系,而这种静 态结构正好是建模在顺序图和状态图的内部行为和内部对象
行为的基础.在状态图中,状态的转换是由事件触发的(除了完成转换),事件包括调用事件,变更事件,信号事件,时间事 件等等,但最常见的就是对象接收到某个消息,转换发生时会 执行某些动作,这些动作通常是向别的对象发送消息.另一方 面在顺序图中,对象之间的消息和状态图中的事件及动作是 一
致的.消息的发送通常产生一个动作,动作导致在接收者对 象的事件的接收.状态图解释了发送一个消息所导致的不同 结果,因而也解释了一个对象的不同行为,这些行为依赖于对 象的当前状态.
5.5使用OCL约束表示的UML顺序图
我们在前而提到lI而序图中有一条件.它控制着对象何时 发出消息,这个条件可以用OCL来表示.还有消息标签,这些 都可以作为测试使用的规格说明.然而要创建一个测试用例, 除了这些信息,我仃】必须使用一个更完全的信息.基于顺序图 和类图,状态图之间的关系,在这里我们借鉴文[2]的方法,从 类图和状态图中提取信息,将其用OCL表示并附加到相应的 对象生命线上,这样我们得到一个具有约束的并且完备信息 的顺序图.这种信息既包括结构方面(来自类图的方法说明, 数据和重数的不变量)也包括行为方面(来自状态图的对象状 态,卫士条件以及方法调用).在文[2]中,AlikiTsiolakis描述
了这种顺序图语义的一致性检测和信息的完备性.下面就来 简要地介绍这种集成方法.
mI(c)ands(c1)
CONnect()
r-—————.--dIsc.ver(DHcP—ct)
}——————————————————————————+ 『
Jmffc)anbs(c2)
di(s)andmi(s)ands(s1)andg(S1)andPr(s1)
offer(IPAddfoss.DHCP—SeP4ot")
IPAddt'OSS=getFreoIP() 二二]
di(s)aNdrnI(s)ands扣2)andPo(s2)
dI(s)aNdrnI(s)ands(s3)andpr(s3)aNdg(s3)
requ.st(IPAddress?DHCP—Cttent?oP—Server) mI(c)aNds(c3)
'Notconnected.'
l<_一一一一
nak(
图4带OCL表示的请求IP不成功的顺序图
顺序图中的对象的内部行为是由状态图来描述的,因而 我们考虑:被激活转换的源状态和目的状态以及允许转换激 活的卫士条件.在此我们定义(message):影响发送消息 的转换集;T(message):通常能被消息触发的转换集.对于 状态来说,基于Tm(message),将可能产生发送对象的目的 状态集作为一种约束附加在发送对象的发送消息之后的生命 线上,同样地,使用T.(message),将可能产生的源状态集作 为一种约束附加在接收对象的接收消息之前的生命线上(约 束表示为:object—name.ocIInState(state));对于卫士条件,基
于T(message),生成的卫士条件集作为约束附加在接收对 象的接收消息之前的生命线上,同样地,基于T
(message),生成的卫士条件集作为约束附加在发送对象的发 送消息之前的生命线上.这些位置和相应的附加状态位置是 一
致的.
顺序图中的对象是类图中类的实例,类图不仅包括属性 和操作,还包括对象约束,这些约束为方法规格说明,前置条 件,后置条件以及数据和重数的不变量.因而这些约束也将附 加在顺序图的对象生命线上.对于方法的规格说明,在接收消 ?134?
息之前的前置条件和执行消息所调用的方法的后置条件必须 满足,因此,相关的约束是附加在接受者的接收消息的前面和 后面,又因为这些约束依赖于系统状态,因而其附加的位置是 跟附加状态的位置是一致的.对于数据不变量,一个类对象所 指定的数据不变量在顺序图中的对象生命期的任何时间内都 必须满足,因此数据不变量的约束顺序图中的下面几个位置: 一
个新的对象创建之后(或者如果对象存在,直接加在对象生 命线的开始位置);以及每一消息前和消息后的位置.对于重 数的不变量,它表示对象配置的属性,必须在对象生命期的任 何时期都为真.因而在顺序图中要维护的位置同数据不变量 是一致的.另外对于所有在顺序图中的约束必须满足一致的 命名空间.图4是包含上面约束的顺序图.其中
(c){(client,aServerh—jc<=1)and(client.net'work.net— s(c1)
s(cz)
s(cs)
di(j)
zuork~size=1)
{client.ocllnState(Notconfigured)} (chent.DcnS细(Scc"In)}
{client.ocllnState(Requesting)}
{(server.ipBlock—lowerecO)and(server.ipBlock—upper
<255)
and(server,Block—lower~=server.ipBlock—upper)
and(server.numberOfCh'ents>一0)
andPr口Pr.alHPAddress—-fo,tall(fp1tip2Iip1.ipA—
dress<)lz.ipAddress))}
mi(){(server.allLPAddress—size—lBlock.一upper—ip-.
Blocklower+1)
and(server.network~size一1}
s(s1),s(s2){server.oclInState(Hasfr,IPaddresses)} (s3),s(s4){(server.ocl[nState(Has)reeIPaddresses))f1or
((server,oclInState(HasnofreeIPaddress))t2) (s1){server,.hasF"reelP()一true}
g(s3){((PrPr=Pr口Pr)and(.getBinding—true))tlor
((server~server)and(.getBindmg()=true))t2} (1){server.numberOflPAddresses>server,.numberOfC—
lients}
(s3){(PPr—server)and(server.allLPAddresses~includes ()=true)}
po(s2){.getBinding()一false}
4测试生成方法
我们使用前一部分介绍的顺序图作为基础,以类别一划分
方法为原型来阐述测试用例的生成.类别一划分方法是众所周
知的一个基于规格说明的功能测试方法.通常来说,从输入领
域进行划分是功能测试的一个标准方法.基于此思想,从等价 划分中的等价类中选出一个或少量的测试来代表整个划分类 的行为.类别一划分方法的第一步是去分析功能需求,把系统 划分为几个要测试的单元,对于每一个功能单元,指定相关测 试的环境条件和参数值,然后进行划分,并从划分中选出适当 的数据以构成测试用例.
4.1测试准则
对每一个这样的顺序图,至少必须存在一个测试用类能 遍历顺序图中的事件序列路径对于从状态图中转化的状态 信息,使用基于状态机模型的最小测试覆盖准则,即每个状态 转换至少被执行一次如果状态转换带有卫士条件,则条件为 真和条件为假都必须被执行至少一次如果卫士条件依赖于 一
个相关的条件(如n>6),则执行卫士条件参数的边界值. 如果有些状态转换仅在许多反复转换之后才能被满足或者有 一
个定时条件,则执行转换的边界条件.例如:假设一个卫士 条件为z>一maxX,则z选取的测试条件集为{maxX一1, maxX,maxx+1}.同时检查每个转换后的执行以确认其为 一
个期望的状态.在代码一级可以通过断言和调试器来实现, 在这里强调使用sneak—path测试一忽略每个不合法的或者并 没在模型中给出的事件/状态对.因而我们得出启发:标示并 执行从初始状态到终止状态的最短和最长的转换路径.而这 跟上述的事件系列路径的测试准则是吻合的
4.2顺序图测试生成方法的步骤
1.分析UML类图,状态图和顺序图形成如前一部分所 描述的带OCL约束的顺序图选定某个用例图,分析相关的 类图和顺序图,同时也分析相关的状态图,根据上一部分描述
的方法产生带OCL的顺序图以顺序图上的消息系列和这些 OCL表达式作为整个测试用例生成的基础.
2.定义测试单元,将顺序图中的每一个对象作为一个测 试单元由于每个对象可能代表一个系统的使用,是一个相对 独立的单元.
3.对每一个测试单元,分析上下文条件.在顺序图中的每 个对象的生命周期线上,提取附加在生命线上的OCL表达 式,由于表达式可能由逻辑或组成,我们先把所有的表达式简 化成逻辑与最小化的形式,同时将此对象相关的消息(方法) 的参数作为object—msg.ocllnPara(para)形式同以此消息相 关的逻辑与表达式进行逻辑与操作得到一个新的表达式.综 合所有的条件信息,我们去除信息的冗余和相互矛盾的条件, 如果在同一条生命线上几个相近的条件导致矛盾,则或者是 一
些附加的行为没有出现在顺序图上,或者消息系列同对象 的状态图描述的行为不一致.接下来我们对每一个条件表达 式进行分析,每一个逻辑分量作为一个分类(意思同类别一划 分方法中的Category)从这些分类中进行划分,最后在划分时 根据逻辑真或假得出数据的选择.
4.选取顺序图事件系列,生成测试用例.利用在第3节描 述的顺序图定义2,我们很容易地得出顺序图中的每一个事件 系列根据事件系列所涉及到的对象以及消息前后的OCL表 达式,分析事件系列的前置条件和后置条件,组成测试规格 (specifications)构造条件判定表,为每一个路径上的条件使 用类别一划分方法,最后选取方法中的数据组成测试用例. 4.5实例分析
我们使用第二部分介绍的实例,选取一个用例(图3表示 的顺序图)来进行分析.
第一步:分析UML类图,状态图和顺序图形成如前一部
分所描述的带OCL约束的顺序图图4显示了分析的结果
第二步:定义测试单元.Client/aClient:DHCP—Client和
server/aServer:DHCP—Server.
第三步:对每一个测试单元,分析上下文条件.
对于client有三个OCL表达式,每个表达式都带有mz
(f),故是一个冗余的条件,去除其它的mi(f),并把(f)作
为全局条件:
G…h时=(client.口SPruPr—P<=1)and(client.network~size一
1).
在对象生命线上的其它的OCL以及进入对象client的交互
消息是connect(),offer(ip,server),nak(),则相应的表示为:
A:{client.oclInState(Notconfigured)} B:{client.Dcf,nS(SPfPc,g)}
C:{client,.Dcf口(R叼"Pmng))
D:object—msg.odlnPara()andDtect--msg.ocHnPara(server)
对于—r有四个0CL表达式,同样的每个表达式都带
有(),mi(),同样作为一个冗余条件可以去除,把()
andmi()作为全局条件:
GJ…,一{(PipBlock—lower>0)and(server.ipBlock—upper< 255)and(server.ipBlock,,lower<:Pr口Pr.ipBlock—upper)and (server.numberOfClients>一0)andserver.alllPAddress一>forall (ipl,2Iip1.ip~Address<>f户2.ipAddress))}and{(rver.allI-
PArPs广乳zP—ipBlock-upper一~pBlock—lower+1)and(serv- er.network~size:1}
因而在对象生命线上各个位置的OCL表达式以及消息是条
件的参数:
E:server.oclInState(Has厂,PPIPaddresses)}and{server.hasFreelP
():true}and{server.numberOflPAddresses>server.nuYa—
berOfClients}
F:server,oclInState(Has厂,PPIPaddresses)}and{.getBinding() 一
false
G:(server.oclInState(Has厂,PPIPaddresses))tlor(sewo—er
.
oclInState(Hasno厂,PPIPaddress))t2}and{(server:server) and(server.alllPAddresses~indudes(ip)一true)}and{((serv—
er—server)and(.getBinding—true))tlor((sPPr:
server)and(.getBinding()一true))t2}
H:{(server.ocllnState(Has厂,PPIPaddresses))tlor(ser- ver.ocllnState(Hasno厂,PPIPaddress))t2}
,:object—msg.odlnPara()andobject—msg.ocllnPara(PPr)and object-?msg.ocllnPara(client)
在图4中,条件F和G导致了矛盾:F中的(po(z))和G
中的((,))的逻辑与操作总是为假,分析顺序图得知G是由
于一个额外的请求操作导致的结果,因而我们去除G.
第四步:选取顺序图事件系列,生成测试用例.从图4中我
们得出一个事件系列:
((connect,s)(connect,r)(discover,s)(discover,r)(getFreelP,
s)(getFreelP,r)(offer,s)(offer,r)(request,s)(request,r)
(nak,)(nak,r))
?】35?
首先我们找出在此事件序列中包含有前置条件或卫士条
件以及环境条件的OCL表达式(如se—er对象中的E,F).接
着对此系列进行后置条件的合成(包括状态的变化.消息后置
条件),这样我们得出
L,:G"andG…and(client.oclInState(Notconfigured)and {(server.oclInState(HasfreeIPaddresses))t1or(server.oclInState
(Hasno&eeIPaddress))t2} ENV—GJflandG…
综合上面的信息我们得到表1.
表1请求IP分配为成功的判定表
事件系列的前置条件事件系列的
变量后置条件
AIBICIDEIFIENVJ
1TiTlTITT【TITT
2TorFlTorFlTorFITorFTorFlTorFITorFTorF
这样总共有2(=128)种不同的值的组合,对于组合中的 每一个条件我们使用类似于类别一划分的方法.在这里以条件 E为例.以每一个and分量作为一个category.如表2. 表2务件E的CategoryPartition方法
CategoryPartitionChoices server.oclInState(HasfreeHasfreeIP
HasfreeIP
IPaddresses)HasnofreeIP True
server.hasFreeIP()一trueTrue
False
serv—>
er.numberOliPAddresses一>
server.numberOfClients< 选取符合choices的各个条件的值构造测试用例,对于有 些中间结果,中间状态等的选择通过上述状态机模型的最小 测试覆盖准则作为用例的输入条件,同时我们对于消息相应 的对象方法的参数也使用传统的类别一划分方法进行处理得 出各个不同的选择值,另外对于消息系列的后置条件作为测 试用例的预期结果,如本例中的条件变量.当结果相同时
则测试标注为PASS,否则为FAILURE.最后结合所有的测 试用例构造测试用例集作为整个UML顺序图的测试. 4.4工具实现设想
基于上面的方法,本文提出一个工具实现的初步设想.工 具包括生成测试规格和生成测试用例两部分.前一部分又分 UML模型分析器和OCL分析器以及用户界面.对于UML 模型分析器,其功能是读取UML顺序图规约的文本文件 (MDL文件),检查其信息的一致性和完备性并生成顺序图的 所有事件系列.我们已经实现了一个顺序图之间的不一致性 检查,顺序图和状态图之间的不一致性检查,因而可以在此基 础上作进一步的实现.对于OCL分析器,其功能是检查顺序 图上的OCL表达式的冗余信息和相互矛盾的信息,在顺序图 水平位置提取共享信息,去除冗余,在生命线垂直方向去除矛 盾的信息.对于用户界面,输入得到的事件系列和OCL分析 器输出的文本,输出测试规格.
另一部分为测试用例生成器以及用户界面.由于OCL形 式化的描述,在这里很难实现真正的自动化,我们可以根据前 一
部分生成的测试规格使用类别一划分方法先得到每个条件 的选择值,然后从界面输入这些选择值,输出测试用例集. ?136?
结论本文描述了一个基于UML顺序图的测试用例生 成方法.它包括测试规格说明的生成和使用类别一划分方法生 成测试用例.方法的关键是测试规格说明的生成.即对UML 图进行分析并集中用OCL来表示,因而我们必须要保证信息 的完整以及分析这些信息的一致性,采用了文[2j中的一致性 检查算法.在这里我们还形式化定义了UML顺序图,方便地 得出顺序图中的每个有效的事件系列.另外使用的类别一划分 方法也简单有效,易于理解.相对于文E83,同样采用类别一划
分方法,我们的测试规格使用了形式化的OCL表示.使得工 作更严谨,更符合未来工具的自动化,而且采用事件系列而非 消息系列的顺序图的功能测试更完全.在文[9]的方法里.只 是提出了一个可测试的顺序图模型,至于如何从顺序图中生 成测试用例则说得不是很详细,它集中在一个工具里.在文 [3,4]中,作者着重于测试规格的描述以及提出不同的测试准 则,并没有说明如何生成测试用例.然而我们的工作也存在一 些限制.测试规格信息的完备性和一致性检查,增加了难度,
,我们生成的测 并且要对一些图的信息进行筛选和假设.其次
试用例数太多.工作量大.有些重复.
今后的工作是提供一个自动的工具支持,并希望采用多 种不同的黑盒方法来实现测试用例的生成.
参考文献
1BeizerB.SoftwareTestingTechniques.VanNostrandReinhold.
NewYork,2Ed.1990
2TsiolakisA.SemanticAnalysisandConsistencyCheckingofUML
SequenceDiagrams.Diplomarbeit,Tu—Berlin:[TR2001—06]. April2001
3OffuttAJ,AbdurazikA.Gen