基于UML顺序图的场景测试用例生成方法
来源:岁月联盟
时间:2010-08-30
0 引言
本文提出了一个基于UML模型图来测试场景的方法,它以顺序图为主要测试模型,结合类图和状态图导出所有的场景,并将与场景相关的环境条件与方法序列、输入、输出合理组合作为覆盖该场景的测试用例。我们的工作具有两方面的优点:测试方法完全基于UML模型,以便已经使用UML的软件系统能方便地采用,另一方面生成的测试用例数量少,减少工作量。1 实例
本文以DHCP[2]作为一个实例,使用UML的类图、状态图和顺序图[3]来说明我们提出的一个场景测试用例生成方法。DHCP是由IETF进行标准化的一个协议,提供一种动态指定IP地址和配置参数的机制。我们选取了DHCP协议的一个子集,协议的一般过程如下: 1.客户端广播一个DHCP_DISCOVER消息。 2.每个具有地址的服务可能响应一个DHCP_ OFFER消息,如果都没有响应,则表示超时失败。 3.如果客户端接收到一个或多个DHCP_OFFER消息,则选择其中一个,然后广播一条DHCP_REQUEST消息给所有的服务器,并附上选择参数及指明哪一个服务器。 4.所有服务器接收到客户的广播信息,只有被选中的服务器才绑定地址给这个客户,并发送确认消息DHCP_ACK,连接成功;如果要求的地址不可得(可能分配给其它用户),则服务器发送一个DHCP_NAK给客户,连接失败。 图1显示了DHCP协议的部分类图。图2 请求IP的顺序图
图3是DHCP中Server类的状态图。
2 UML顺序图的一个形式化定义
为了能在测试中找出所有的场景,下面给出顺序图的形式化定义:定义1(顺序图)顺序图SD可以表示为一个六元组:SD=<O, M, E, →,msg, obj>,其中:● O={O1, O2, …,Om},是对象的集合。O1, O2, …,Om都是顺序图中的对象。● M guard´message´name´parameter_list,是消息的集合。顺序图中的每一个消息都形如:“[卫士条件]消息名(参数)”。● E=M {s, r},是事件集合。事件是指消息的发送和接收。对于消息msg,发送事件用<msg,s>表示,接收事件用<msg, r>表示。顺序图中所有发送消息事件的集合记为S,所有接收消息事件的集合记为R。SÇR=Æ, SÈR=E。● →是消息集合M上的一个全序关系,表示顺序图中的消息在纵向时间轴上的先后关系。● msg是从E到M的一个函数关系,msg(e) M表示事件e所对应的消息。● Obj是从E到O的一个函数关系,obj(e) O表示时间e所对应的对象。对象Oi上所有事件的集合记为Ei,Ei={e | e EÙobj(e)= Oi }。在如图4所示的顺序图中: O={obj1,obj2,obj3}; M={m1,m2,m3};E={(m1,s),(m1,r),(m2,s),(m2,r),(m3,s),(m3,r)};→=m1→m2→m3.3 基于UML顺序图生成场景测试用例的方法
顺序图中的场景设计可能与实现不一致,例如由于消息名的编码错误、不正确的或缺少输出等,那么通过执行顺序图中的所有可能场景,至少能在其中的一个场景的执行过程中达到该错误,因此只要从顺序图中生成覆盖所有场景的测试用例就能有效地找出存在的错误。在测试用例的生成过程中,我们将环境条件与输入,方法调用序列和预期输出作为最终的测试用例,最后将系统测试后的实际输出和方法调用序列与预期的输出和方法调用序列进行比较,从整体上验证系统的最终实现是否与设计一致,从而完成顺序图的场景测试。3.1 测试衡量方法
测试的主要评测方法包括覆盖和质量,测试覆盖是对测试完全程度的评测,质量是对测试对象(系统或测试的应用程序)的可靠性、稳定性以及性能的评测。对于顺序图的场景测试,最基本的评测方法就是测试覆盖,即要求针对每一个场景都至少生成一个测试用例。但是顺序图本身并不能充分地对系统交互行为进行建模,仅通过顺序图并不能生成充分地场景测试用例。所以我们将顺序图与交互对象的状态图相结合,生成更充分的测试用例。为此,定义如下评测方法: 1) 顺序图中的每个场景至少被测试一次。 2) 如果顺序图中的对象存在状态图,那么与场景相关的每个状态至少要被测试一次。3.2 顺序图场景测试用例生成方法的步骤
第一步,检查顺序图中的每一个对象,如果其存在状态图,就将对象状态加入到顺序图中。以DHCP-Server对象为例,其状态图如图3所示,Has free IP addresses和Has no free IP addresses是Server可能处于的两种状态,我们将这两个状态加入顺序图,加入状态信息后的最终结果如图5所示。图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:BooleanhasFreeIP:Boolean | 无 |