周薇 刘庆生
摘要:类测试是面向对象的软件测试过程中的一个重要方面。类测试需要结合对象的状态行为,并考察在执行相应的方法后是否能达到预期状态。该文描述了基于状态的类测试的方法,并通过实例分析给出了测试用例生成方法,验证被测对象在经过操作变换后是否处于预期的正确状态,使得测试人员在缩减测试用例数量的同时,提高了测试效率。
关键词:类测试;面向对象;基于状态
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)12-2765-03
目前,面向对象技术作为一种全新的软件开发技术广泛地应用在各领域,随着面向对象软件测试的逐步深入,基于类具有封装和抽象特性,通过研究基于状态的类测试,考察与对象状态相关的变量或函数的数据变化,衡量软件模块的健壮性。该文主要针对基于状态的类测试方法及测试用例的生成展开讨论。
1 基于状态的类测试方法
相比与面向过程程序测试,面向对象程序测试中类测试与其单元测试类似,不同的是,单元测试关注函数模块算法和各函数间接口的输入输出。基于状态的类测试方法的核心在于关注类中的方法及其类的状态,要把对象与其状态结合起来,进行对象状态行为的测试,因为软件运行过程中对象的初始状态、对象的输入参数、对象的输出参数、对象的最终状态可能被改变,产生新的状态。
由于基于状态的类测试依赖对象的状态,因此在测试评估时通过检查对象数据成员和方法进行交互时产生的错误,如果方法执行后对象的状态并没有按预期结果发生变比,则表明此方法有误。
基于状态的类测试过程为:通过将面向对象程序中的类作为被测单元,明确类中的状态变量,根据相关的状态变量划分成多个状态,并生成类的状态多分支树,然后通过遍历状态分支树,产生测试用例执行测试,判定对象状态是否符合预期规定的状态。
2 基于状态的类测试用例的生成
对于基于状态的类测试而言,如果达到类的状态及状态转换完全覆盖的测试用例是无限的,通过建立状态转换模型,生成状态转换图,通过生成遍历测试路径树自动选择并执行测试用例,能够从无限的测试用例中选择最优、覆盖率高的测试用例。
2.1状态转换模型及状态转换图
状态转换模型描述了类中所有对象的共同行为,对于类对象具有多个状态,状态之间通过消息驱动。状态转换模型是一个四元组(S,T,s0,M),其中S是有限状态集、T表示状态转换图的状态转换,M表示状态转换图的当前状态,满足如下条件:s0[∈]S,M={s0}是初始标志,s0是初始状态;状态转换图中没有独立元素,S≠¢,T≠¢,M≠¢;对于任何转换至少有一个前驱和一个后继,即[?]t[∈]T,有*t≠¢,t*≠¢。当M={s′}时,[?]t[∈]T,*t=s′,转换t是可触发的;若转换t触发后,当前状态M={s′′},并且满足s′′[∈]t*,这时新状态产生。
最后通过状态转换模型中状态集、状态转换集、状态转换消息建立状态转换图。比如一个进程状态S={就绪、运行、阻塞、创建、终止},进程状态转换事件消息包含:1)创建状态——>就绪状态(允许进入);2)就绪状态——>运行状态(获取CPU进程调度);3)运行状态——>阻塞状态(I/O或事件请求);4)运行状态——>就绪状态(分配的CPU时间到);5)阻塞状态——>就绪状态(I/O完成或等待事件发生);6)运行状态——>终止状态(进程结束释放)。
状态转换集T为={允许进入,获取CPU进程调度,I/O或事件请求,分配的CPU时间到,I/O完成或等待事件发生,进程结束释放},图1所示为状态转换图,包含状态集S和状态转换集T。
2.2生成遍历测试路径树
通过对各状态设置唯一的输入输出路径生成测试路径树自动产生测试用例,测试包括验证每个状态是否能由初始状态按照一定的路径到达,状态转换后的每个状态能否正确执行,其输出是否正确。
首先对于某一事件路径为从初始状态到终止状态的转换,分析类对应的状态图,然后构造测试路径树,该测试路径树包含所有的事件消息路径。测试路径树的每个节点对应一个状态,每个分支表示状态之间的转换,并在分支上标识出事件动作。最后构造出满足状态转换覆盖的测试路径树。具体形式化算法如下:
1)创建所有非空状态集合S={S1,S2,…,Sn}
2)创建可达状态集Rs,开始为空,对象经过构造或初始化后,产生的状态加入到Rs中。
3)选择一状态Si∈Rs,将Si为初始前驱状态
4)选择一条定义数据成员M的路径P,执行条件为CP,R为路径执行结果。如果条件Si(D)和CP成立,则路径产生一次转移,如果条件不成立,放弃该路径。
5)转换到达的后继状态Sj∈Rs(j=1,2,…,n)或Sj 为对象被消除的最终状态,则Sj 为叶子节点。
6)重复步骤3、4直到选择所有的路径,从Rs中去掉Si,直到Rs为空。
7)从根节点开始沿着各个分支往下直到叶子节点,深度遍历测试路径树,对于每条从根节点到叶子节点结束的路径组合一起,就生成相应的测试用例。
3 实例分析
为了验证基于状态的类测试方法的可用性,在此用一个具体的案例——某系统中超短波控制器路由维护模块软件的类HJLydx来讨论该方法。
某系统主要由中控设备、通控器、超短波电台、遥控用户单元、短消息远传设备等组成。通控器在其中负责管理超短波通信网内电台的信道资源管理、工作状态的设置和显示,路由信息的维护和刷新等功能。路由维护模块是通控器软件中的网络处理单元下的一个模块。路由维护模块实现静态及动态路由表维护功能,为网络传输模块及LPU单元提供路由信息。
图2显示的被测软件类HJLydx的状态转换模型:endprint
状态集:S1:Default status;S2:Static route status;S3:Dynamic route status;S4:Static message route status;S5:Dynamic message route status。
事件或动作集:1/x:输入事件1,输出动作x;1/y:输入事件1,输出动作y;2/x:输入事件2,输出动作x;2/v:输入事件2,输出动作v;3/w:输入事件3,输出动作w;4/w:输入事件4,输出动作w;5/r:change back to Default status, 输入事件5,输出动作r。
按照显式行为路径的算法,首先初始化S={S1,S2,S3,S4,S5},Rs={a},第一次执行(1)、(2)步:选择一状态Si=a得到新的Rs={a,S1},重复(3)、(4)步骤直到循环终止条件成立,得到如图3所示的状态转换模型对应的最终测试路径树。
最后深度遍历上图测试路径树得到所有显示行为路径为:1)a1→1/x→1/y→3/w(S1到S2到S4到S4);2)a1→1/x→1/y→ 5/r(S1到S2到S1);3)a1→1/x→2/x(S1到S2到S3);4)a1→2/v→2/v→4/w(S1到S3到S5到S5);5)a1→2/v→2/v→1/x(S1到S3到S5到S3);6)a1→2/v→2/v→5/r(S1到S3到S5到S1);7)a1→2/v→1/x(S1到S3到S2)。
于是就得到基于状态模型的显式路径下的最终测试用例序列为:{a1→1→1→3,a1→1→1→5,a1→1→2,a1→2→2→4,a1→2→2→1,a1→2→2→5,a1→2→1}。
4 结束语
本文在介绍面向对象中基于状态的类测试方法,提出了基于状态的类测试过程,重点研究了状态转换模型以及由状态转换图遍历测试路径树生成测试用例,这样既可以满足状态转换覆盖的要求又可以验证被测对象在经过响应操作变换后是否处于预期的正确状态,为解决面向对象软件的自动化测试问题进行了初步的探讨。
参考文献:
[1] John D, McGregor David A,Sykes.面向对象的软件测试[M].杨文宏,李新辉,杨洁,等,译.北京:机械工业出版社,2003.
[2] 宫云战.软件测试[M].北京:国防工业出版社,2006.
[3] 马海云,张少刚.软件质量保证与软件测试技术[M].北京: 国防工业出版社,2011.
[4] 金凌紫.面向对象软件测试技术进展[J].计算机研究与发展,1998,35(1).
[5] 张雪萍,庄雷,范艳峰.基于状态的类测试技术研究[J].小型微型计算机系统,2002,23(9).
[6] 刘欢.面向对象软件测试技术[D].成都:电子科技大学,2007.endprint
状态集:S1:Default status;S2:Static route status;S3:Dynamic route status;S4:Static message route status;S5:Dynamic message route status。
事件或动作集:1/x:输入事件1,输出动作x;1/y:输入事件1,输出动作y;2/x:输入事件2,输出动作x;2/v:输入事件2,输出动作v;3/w:输入事件3,输出动作w;4/w:输入事件4,输出动作w;5/r:change back to Default status, 输入事件5,输出动作r。
按照显式行为路径的算法,首先初始化S={S1,S2,S3,S4,S5},Rs={a},第一次执行(1)、(2)步:选择一状态Si=a得到新的Rs={a,S1},重复(3)、(4)步骤直到循环终止条件成立,得到如图3所示的状态转换模型对应的最终测试路径树。
最后深度遍历上图测试路径树得到所有显示行为路径为:1)a1→1/x→1/y→3/w(S1到S2到S4到S4);2)a1→1/x→1/y→ 5/r(S1到S2到S1);3)a1→1/x→2/x(S1到S2到S3);4)a1→2/v→2/v→4/w(S1到S3到S5到S5);5)a1→2/v→2/v→1/x(S1到S3到S5到S3);6)a1→2/v→2/v→5/r(S1到S3到S5到S1);7)a1→2/v→1/x(S1到S3到S2)。
于是就得到基于状态模型的显式路径下的最终测试用例序列为:{a1→1→1→3,a1→1→1→5,a1→1→2,a1→2→2→4,a1→2→2→1,a1→2→2→5,a1→2→1}。
4 结束语
本文在介绍面向对象中基于状态的类测试方法,提出了基于状态的类测试过程,重点研究了状态转换模型以及由状态转换图遍历测试路径树生成测试用例,这样既可以满足状态转换覆盖的要求又可以验证被测对象在经过响应操作变换后是否处于预期的正确状态,为解决面向对象软件的自动化测试问题进行了初步的探讨。
参考文献:
[1] John D, McGregor David A,Sykes.面向对象的软件测试[M].杨文宏,李新辉,杨洁,等,译.北京:机械工业出版社,2003.
[2] 宫云战.软件测试[M].北京:国防工业出版社,2006.
[3] 马海云,张少刚.软件质量保证与软件测试技术[M].北京: 国防工业出版社,2011.
[4] 金凌紫.面向对象软件测试技术进展[J].计算机研究与发展,1998,35(1).
[5] 张雪萍,庄雷,范艳峰.基于状态的类测试技术研究[J].小型微型计算机系统,2002,23(9).
[6] 刘欢.面向对象软件测试技术[D].成都:电子科技大学,2007.endprint
状态集:S1:Default status;S2:Static route status;S3:Dynamic route status;S4:Static message route status;S5:Dynamic message route status。
事件或动作集:1/x:输入事件1,输出动作x;1/y:输入事件1,输出动作y;2/x:输入事件2,输出动作x;2/v:输入事件2,输出动作v;3/w:输入事件3,输出动作w;4/w:输入事件4,输出动作w;5/r:change back to Default status, 输入事件5,输出动作r。
按照显式行为路径的算法,首先初始化S={S1,S2,S3,S4,S5},Rs={a},第一次执行(1)、(2)步:选择一状态Si=a得到新的Rs={a,S1},重复(3)、(4)步骤直到循环终止条件成立,得到如图3所示的状态转换模型对应的最终测试路径树。
最后深度遍历上图测试路径树得到所有显示行为路径为:1)a1→1/x→1/y→3/w(S1到S2到S4到S4);2)a1→1/x→1/y→ 5/r(S1到S2到S1);3)a1→1/x→2/x(S1到S2到S3);4)a1→2/v→2/v→4/w(S1到S3到S5到S5);5)a1→2/v→2/v→1/x(S1到S3到S5到S3);6)a1→2/v→2/v→5/r(S1到S3到S5到S1);7)a1→2/v→1/x(S1到S3到S2)。
于是就得到基于状态模型的显式路径下的最终测试用例序列为:{a1→1→1→3,a1→1→1→5,a1→1→2,a1→2→2→4,a1→2→2→1,a1→2→2→5,a1→2→1}。
4 结束语
本文在介绍面向对象中基于状态的类测试方法,提出了基于状态的类测试过程,重点研究了状态转换模型以及由状态转换图遍历测试路径树生成测试用例,这样既可以满足状态转换覆盖的要求又可以验证被测对象在经过响应操作变换后是否处于预期的正确状态,为解决面向对象软件的自动化测试问题进行了初步的探讨。
参考文献:
[1] John D, McGregor David A,Sykes.面向对象的软件测试[M].杨文宏,李新辉,杨洁,等,译.北京:机械工业出版社,2003.
[2] 宫云战.软件测试[M].北京:国防工业出版社,2006.
[3] 马海云,张少刚.软件质量保证与软件测试技术[M].北京: 国防工业出版社,2011.
[4] 金凌紫.面向对象软件测试技术进展[J].计算机研究与发展,1998,35(1).
[5] 张雪萍,庄雷,范艳峰.基于状态的类测试技术研究[J].小型微型计算机系统,2002,23(9).
[6] 刘欢.面向对象软件测试技术[D].成都:电子科技大学,2007.endprint