基于UML顺序图的场景测试用例生成方法

发表于:2007-10-09 14:08

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:逄瑞娟 李劲华    来源:网络转载

分享:

        顺序图主要描述了对象间发送消息的时间顺序。我们用符号‘<<’来表示事件间的先后关系,它满足如下三个性质:

1.对同一消息而言,发送事件先于接收事件。

2.在同一对象的生命线上,若事件e1出现在发送事件e2的上方,则e1先于e2。

3.在同一个对象的生命线上,如果接收事件e1出现在e2的上方,并且它们分别对应的发送事件也位于同一个对象的生命线上,则e1先于e2。

        ‘<<’顺序关系是强制顺序关系,那么即使它们在顺序图的时间轴上存在先后关系,这两个事件实际发生的先后顺序也是不确定的。例如图4中,尽管(m1,r)在(m3,r)的上方,但是在系统实际运行中,由于m1, m2, m3都是异步消息,因此(m1,r)并不一定先于(m3,r)发生,这是由于图形表示的局限性造成的。

        一个简单顺序图(不包括分支)刻画了系统运行的一个场景,其运行过程表现为一个事件的序列(e1 , e2,…, em),其中事件ei+1 在事件 ei后发生(1≤ i ≤m-1)。由于事件之间存在强制顺序关系‘<<’,因此并不是所有事件序列都是顺序图允许的。而且,由于‘<<’并不是一个全序关系,所以一个顺序图的场景可能允许多个事件序列。可以用一个有向无环图(DAG)来表示‘<<’关系,对于任意两个事件 ei,ei∈ E,如果 ei<< ei,则画一条从ei 指向ei 的边,直到所有事件都在这个有向图上。

        通过遍历所得的DAG图,可以很容易的得到顺序图中的每一个有效的事件序列。在图4的例子中,<(m1,s), (m2,s), (m2,r),(m3,s),(m3,r),(m1,r)>和<(m1,s),(m1,r), (m2,s), (m2,r), (m3,s), (m3,r)>就是两个有效的事件序列。

        定义2(顺序图的场景)对于顺序图SD=,场景定义为一个消息序列< M1,M2,…,Mm>,并且满足下面两个条件:

(1)所有M中的事件在序列中出现且仅出现一次,也就是说{M1,M2,…,Mm}=M且对于所有的i j,Mi Mj。

(2)对于任意两个消息序列Mi,Mj?M,如果(Mi,s)<<(Mj,s),那么序列中Mi在Mj的前面。

        根据场景的定义,通过所找到的合法的事件序列就可以确定与该事件序列相应的场景。如图4,就是一个有效的场景。

3、基于UML顺序图生成场景测试用例的方法

        顺序图中的场景设计可能与实现不一致,例如由于消息名的编码错误、不正确的或缺少输出等,那么通过执行顺序图中的所有可能场景,至少能在其中的一个场景的执行过程中达到该错误,因此只要从顺序图中生成覆盖所有场景的测试用例就能有效地找出存在的错误。在测试用例的生成过程中,我们将环境条件与输入,方法调用序列和预期输出作为最终的测试用例,最后将系统测试后的实际输出和方法调用序列与预期的输出和方法调用序列进行比较,从整体上验证系统的最终实现是否与设计一致,从而完成顺序图的场景测试。

3.1、测试衡量方法

        测试的主要评测方法包括覆盖和质量,测试覆盖是对测试完全程度的评测,质量是对测试对象(系统或测试的应用程序)的可靠性、稳定性以及性能的评测。对于顺序图的场景测试,最基本的评测方法就是测试覆盖,即要求针对每一个场景都至少生成一个测试用例。但是顺序图本身并不能充分地对系统交互行为进行建模,仅通过顺序图并不能生成充分地场景测试用例。所以我们将顺序图与交互对象的状态图相结合,生成更充分的测试用例。为此,定义如下评测方法:

1) 顺序图中的每个场景至少被测试一次。

2) 如果顺序图中的对象存在状态图,那么与场景相关的每个状态至少要被测试一次。

3.2、顺序图场景测试用例生成方法的步骤

        第一步,检查顺序图中的每一个对象,如果其存在状态图,就将对象状态加入到顺序图中。以DHCP-Server对象为例,其状态图如图3所示,Has free IP addresses和Has no free IP addresses是Server可能处于的两种状态,我们将这两个状态加入顺序图,加入状态信息后的最终结果如图5所示。

f
图5:加入状态信息后的顺序图

        第二步,使用第3节介绍的方法通过遍历顺序图中的事件序列从而找出所有的场景。在图5中,消息4和消息7、消息10和消息12分别构成了分支,处理分支时,可以为顺序图构造多个DAG图,每个图包含其中一条分支。这样就将复杂顺序图化简成多个简单的顺序图来进行处理,遍历每个DAG图就可以得到所有场景。图5中,得到3个场景如下:

A: 1, 2, 3, 4, 5

B: 1, 2, 3, 6, 7, 8, 9, 10

C: 1, 2, 3, 6, 7, 8, 11, 12?

        第三步,选定一个场景,根据其消息序列在顺序图中遍历该场景,记录场景的输入和最终输出。以场景B为例:

输入:用户调用connect操作。

预期输出:返回“nak”消息,表示申请IP不成功。

        第四步,确定每个场景的环境条件。首先从顺序图中找出所有的测试单元,在顺序图中,每一个交互的对象就是一个测试单元。本例中的DHCP_Client和DHCP_Server就是两个测试单元;其次对每一个测试单元,从类图中导出相应的环境设置(包括对象属性、操作和消息中的参数)。结果如表1所示。

表1:DHCP的测试单元与环境

 

测试单元
DHCP-Server
DHCP-Client
环境设置
Offer:Boolean
hasFreeIP:Boolean
 

        找出环境设置之后,再为每一个场景找出相应的选择,从而确定其环境条件,如场景B中,Offer=true,hasFreeIP =false。

        第五步,测试用例生成 一个测试用例包括4个部分:环境条件、输入、方法调用序列、预期输出。对于场景B,所有这些信息已从前面的四步中生成,只要将它们组合在一起就可以了。场景B的测试用例为:

环境条件:DHCP-Server:offer=true,hasFreeIP=false

输入:用户调用connect操作。

方法调用序列:

Client.discover, Server.isServeroffer,

Client.request, Server.hasFreeIP,

Server.nak, user.notConnected

        预期输出:返回”nak”消息,表示申请IP不成功。

        在这个测试用例中,方法调用序列就是该场景中的消息序列。

        可用同样的方法为所有场景生成测试用例。

4、结束语

        文[4]出现了一个基于UML顺序图设计的面向对象的软件的自动测试的概念和相应的实现工具SeDiTeC,该方法提出了一个可测试的顺序图的规则,并在SeDiTeC中实现了完整的测试过程,但是没有详细描述如何从顺序图中生成测试用例。文[5]指出了多态性对顺序图测试场景的影响,提出了相应的对策,有效地解决了测试消息序列中多态消息的测试问题,但没有说明测试用例如何生成。文[6]同样提出了一个顺序图生成测试用例的方法,但是该方法没有给出场景的分析,而且生成的用例数太多,工作量大。

        本文提出的基于UML顺序图生成场景测试用例的方法,包括找出场景和生成测试用例,改进了这类方法生成测试用例数多、工作量大的缺点,减少了测试用例的重复生成。

22/2<12
100家互联网大公司java笔试题汇总,填问卷领取~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号