一种基于覆盖的GUI测试用例生成方法_第1页
一种基于覆盖的GUI测试用例生成方法_第2页
一种基于覆盖的GUI测试用例生成方法_第3页
一种基于覆盖的GUI测试用例生成方法_第4页
一种基于覆盖的GUI测试用例生成方法_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一种基于覆盖的GUI测试用例生成方法         08-05-05 08:59:00     作者:吕金和1 刘彬彬2    编辑:studa0714 摘  要  在GUI技术正得到广泛应用的同时,其自身的特点使传统的基于代码的测试方法无法有效应用于GUI测试。GUI测试主要是通过执行事件序列、获取检测状态和对比验证内容来发现故障的,而现有的事件序列生成方法都没有直接对GUI的覆盖进行控制,这很有可能会

2、遗漏重要的测试步骤;而现有的检测状态和验证内容生成方法不但效率低下,还有可能遗漏必要的检测点和关键的验证点。针对这些问题,作者提出了一种基于覆盖的GUI测试用例生成方法,它可以快速生成符合覆盖准则要求的事件序列,并自动生成全面的检测状态和验证内容。与其它GUI测试用例生成方法相比,该方法在故障检测效率及故障覆盖率等方面都具有明显优势。     关键词   GUI测试用例; 覆盖准则; 事件序列; 检测状态; 验证内容 1  引言    由于界面友好、便于开发、维护和操作等特点,GUI技术正在软件

3、开发过程中得到广泛的应用。GUI应用程序一般具备两个主要的特征图形界面的设计与功能代码的开发相独立、用户交互事件驱动程序执行1,2,这可以使GUI程序在开发和维护过程中产生许多特殊的情况,如相同的代码对应不同的界面、不同版本的GUI具有相同的代码、功能代码所对应的消息或方法不能有效的体现用户交互等等,导致传统的基于代码的测试方法无法有效的应用于对GUI的测试。    与传统的测试用例概念不同,GUI的测试用例是指驱动程序运行的事件序列,如鼠标的点击和菜单的选择等动作。一种常见的测试用例生成方法是使用录制/回放工具录制生成包含运行事件序列的脚本,并在录制的过程中或完

4、成后向脚本中添加检测点来验证相应事件的执行结果3。这种方法虽然可以直接有效地生成事件执行序列,但是测试相关数据和事件操作顺序都固化在测试脚本中,非常不利于对测试用例的维护。Archer Group和Keith Zambelich等对这种方法加以改进,设计了控制同步数据驱动和关键字驱动方法4,5,将测试数据从测试脚本中分离出来,形成独立的数据文件,以文件中的数据来驱动脚本运行。这样虽然在一定的程度上改进了测试用例维护的问题,但Archer Group的控制同步方法仅限于业务规则类型的测试,而Keith Zambelich的关键字驱动方法还需要对不同项目的测试脚本进行维护。  

5、  对于GUI测试用例的自动生成方法,Donat提出一种基于需求的测试用例生成技术6,自动的将格式化的需求说明转换成测试用例。Kasik提出一种以学习的方式来生成测试用例的技术7,在专家给出的GUI事件序列基础上,应用遗传算法技术来修改和增加这个序列8,从而得到达到同样的目标多种选择。Memon给出一种基于计划的方法,用目标驱动测试用例生成的技术9。这种方法首先给出测试用例的初始条件和目标条件,然后应用人工智能技术逐步向目标逼近。在利用有限状态机来生成测试用例的方法中10,软件的行为被描述成FSM模型,它包含GUI的有限个状态,每一个输入动作都会使FSM中状态发生改变。在创建了FSM

6、后,测试用例的生成过程就可以自动进行了。    虽然以上的几种方法在一定程度上可以实现测试用例的生成,但由于它们都没有直接对GUI的覆盖程度进行控制,因此可能会遗漏由用户交互产生的重要事件序列;而由于现有检测状态和验证内容生成方法的不足,每个事件序列对应的检测点和验证点也可能会有所缺失。在目前国内外GUI测试领域里,尚没有对以上问题进行详细研究。因此本文结合Memon的事件序列覆盖准则11,提出一种基于覆盖的GUI测试用例生成方法。它可以生成符合覆盖准则要求的事件序列,并自动生成其全面的检测状态和验证内容,解决传统测试用例生成方法遗漏的重要测试步骤、必要检测点和关

7、键验证点等问题。    本文的第二部分对GUI的组件、事件流图、调用关系图和测试用例进行定义;第三部分给出了GUI的单事件故障、事件交互故障和事件序列故障模型;第四部分从测试用例生成条件、子序列生成、预期状态生成和子序列连接等方面介绍了基于覆盖的GUI测试用例生成方法;第五部分通过实验来对比不同方法生成测试用例的事件序列覆盖率和故障覆盖率;最后是全文的总结和参考文献。2  GUI相关定义2.1  GUI的组件    模式化窗口是GUI的一个窗口,当它被打开后,会将用户可操作的范围限定在该窗口之内。与模式窗口相对应的

8、是非模式窗口,它不会限制用户的输入焦点,而是扩展了用户操作范围。模式化窗口及其相关的非模式化窗口可以代表GUI的一个层次,将其定义为GUI组件,以如下三元组<MW,UWs,S0>表示:       MW=e1,e2,e3,en,       UMs=UM1,UM2,UMm       UMi=ea,eb,ec,ex,UMiÎ UMs       

9、"UMi,UMi = invoke(e),eÎMW or eÎUMs       S0=p1,p2,p3,pn       pi=property(object,value)  piÎS0    MW是一个以事件的形式表示的模式窗口,     UWs是以事件的形式表示的非模式窗口的集合。UWs中的每个非模式窗口UWi都是由MW或UWs中的事件打开。S0

10、60;是组件首次打开后的状态,叫组件的初始状态,它由MW内的一组对象及其属性构成。2.2  事件流图    每个组件都是由一组处于同一层次的GUI事件所构成,这些事件之间的联系可应用事件流图(Event Flow Graph)来描述。EFG中包含一个组件内所有的事件以及这些事件间的相互联系,可将其定义为一个四元组<V,E,B,I>:       V=v1,v2,v3,vn  eventi=exp(vi)       

11、;EÍ V×V,"(vx,vy)E, vy=follow(vx)       BÍV,B=open(Comx)        IÍV,"vxI,Comy=invoke(vx)    V是结点集合,一个结点对应组件中的一个事件。E表示直接连接结点的边,vy=follow(vx)表示vy代表的事件可以在vx代表的事件后面执行。B表示组件被首次打开后可以直接执行的事件集。I表示可以打开其它组件

12、的事件集。2.3  调用关系图    当组件Comx包含一个可以调用组件Comy的事件ex时,组件Comx就可以调用组件Comy。事件ex属于事件流图中的I,即exI。调用关系图(Call Relation Graph)表示GUI中所有组件之间的调用关系,可将其定义为一个三元组<V,E,M>:       V=v1,v2,v3,vn, componenti=exp(vi)       EÍ V×V,&qu

13、ot;(vx,vy)E, vy=follow(vx)       M=vi,vi is main window of GUI     V是结点集合,一个结点对应GUI中的一个组件。E表示连接结点的边,vy=follow(vx)表示vy代表的组件会被vx代表的组件调用。M是一个结点,表示GUI的主窗口。2.4  GUI测试用例    任何用户交互动作都是在一定的条件下执行的,即GUI的测试用例首先需要从一个初始状态开始,然后通过一个事件序列来描述用户的一系列交互动作。

14、由于每个事件的执行都是与前面的事件执行结果相关联,只要其中一个事件的执行出现了问题,就会产生错误结果而影响后续操作,所以测试用例中还需要每个事件的预期输出,用以逐一验证测试执行过程中的实际输出。GUI测试用例定义成如下三元组< S0,E,S>:       S = S0; S1; S2; ; Sn       E = e1; e2; ; en        (e1,e2,en)=exp(v1,v2,vn)

15、        (vi,vi+1)edge(EFG)  or  viI(EFGx),vi+1B(EFGy),vi+1follows(vi)       Si = ei(Si-1)    S中包含了事件序列E的预期状态的集合,S0是测试用例的初始状态。序列E中的事件与事件流图EFG的结点一一对应,并且序列中相邻的两个事件可以连续执行。每个事件ei在它的当前状态Si-1下,都可以达到它的预期状态Si。3  GU

16、I故障模型    GUI测试可以分为验证应用程序统一规范的标准化测试、验证图形输出的属性测试、验证输入数据的确认测试和验证业务规则的功能测试等等,而不论何种测试类型,其故障检测过程都是通过执行事件序列、获取检测状态和对比验证内容等过程来实现对故障的检测。因此,可以事件序列为基础,将GUI故障划分为单事件故障、事件交互故障和事件序列故障。    当事件流图中的某个结点vi所代表的事件ei被执行后,产生的实际输出状态与预期输出状态不相符,由此产生的单事件故障描述如下:       

17、;$e,e=exp(v),vÎ EFG,       SourceState=BeforeExeEvent(e)       ExpectState=GetExpectState(e,SourceState)       CurrentState=e(SourceState)        ExpectState ¹ CurrentSta

18、te    当一个事件对儿(ex,ey)被执行后,它的实际输出状态与预期输出状态不相符,由此产生的事件交互故障描述如下:        $(ex,ey)=exp(vx,vy)       (vx,vy)Îedge(EFG)  or vxÎI(EFGx),vyÎB(EFGy),vy=follow(vx)         SourceStat

19、e=BeforeExeEventPair(ex,ey)       ExpectState =GetExpectState(ex,ey),SourceState )       CurrentState= (exoey)(SourceState)       ExpectState¹CurrentState    当一个事件序列(e1;e2;e3;en)被执行后,它的实际输出状

20、态与预期输出状态不相符,由此产生的事件序列故障描述如下:        $(e1;e2;e3;en)=exp(v1;v2;vn)       (vi-1,vi)Îedge(EFG) or vi-1ÎI(EFGx),viÎB(EFGy),vi=follow(vi-1),iÎ2,n       SourceState =BeforeExeEventSequence(e1;e2;e3

21、;en)       ExpectState =GetExpectState(e1;e2;e3;en),SourceState)       CurrentState=(e1oe2oe3ooen)(SourceState)       ExpectState ¹ CurrentState4  基于覆盖的GUI测试用例生成方法    本文将基于事件的覆盖准则引入到测试用

22、例生成过程,在事件执行条件的基础上,自动生成满足覆盖准则要求的事件序列及其预期状态。这种方法首先要生成符合覆盖准则和测试用例生成条件要求的子序列,然后在判断子序列的有效性后生成其预期状态,最后将有效子序列逐步连接成目标测试用例。4.1  测试用例生成条件    一个事件只有在满足特定的条件时,它才能够被执行,而根据不同的前提条件,它的执行结果也会有所不同。因此每个事件需要对应一个执行条件组,只有满足其中的条件时才能够执行。事件执行条件可描述为如下三元组<e,Pre,Eff>:      

23、60;Pre(e)  =pre1 (e),pre2(e),prem(e)       Eff(e)  =eff1(e),eff2(e),effm(e)       effj(e)  = map(prej(e)  j1,m       pre(e)=pa,pb,pc, eff(e)=px,py,pz,       p=p

24、roperty(object,value)    事件e有一组前提条件和一组执行结果,条件组中的每个条件都在结果组中有一个结果和它对应。条件和结果都以对象属性的形式表示。    测试用例生成条件首先要根据基于事件的覆盖准则来确定子序列的长度,然后需要测试用例的初始状态S0,以及在S0下可执行的起始事件ebegin和终止事件eend。测试用例生成条件可以描述成如下四元组<cc,S0,ebegin,eend>:       cc  =cc-1,cc-2,cc

25、-3,.cc-n        S0  = p1,p2,p3,pm      ebeginEFG1       $pre(ebegin)ÍS0      eendEFGn   or  eend =length,length=1,2,3.    cc-i表示长度等于i的事件序列覆盖准则,它的选取与GUI的实际规

26、模相关。初始事件ebegin的确定必须在初始状态S0下,使其包含ebegin的一个执行前提条件。结束条件eend可以是一个事件,也可以是事件序列的长度。4.2  子序列生成    子序列的生成主要分为三个部分:生成调用关系序列EFGs、参照EFGs生成第一个子序列以及生成后续子序列。调用关系序列可以描述成如下形式:       EFGs=EFG1; EFG2; EFG3; EFGn        ebeginEFG1 

27、0;     eendEFGn      "EFGiEFGs,EFGi=follow(EFGi-1)  i2,n    调用关系序列是从调用关系图中获得的路径,表示可以从ebegin出发达到eend的所有组件序列。EFGx=follow(EFGy)表示组件EFGx可由组件EFGy打开。第一个子序列的输入条件和生成结果描述如下:       input     

28、;  cc  =cc-n       EFGs=EFG1; EFG2; EFG3; EFGm       S0  = p1,p2,p3,      ebegin  EFG1      $ pre(ebegin) Í S0      output      sub_seq

29、uence=ea; eb; . . .; ex       ea  =  ebegin       length(sub_sequence) = n      ! visited(sub_sequence,EFGs,CRG)      "exnext_sequence,EFG(ex)=EFG(ex+1) or EFG(ex+1)=follow(EF

30、G(ex)    后续子序列在已得到的子序列基础上生成,其输入条件和生成结果描述如下:        input        cc  =cc-n        EFGs=EFG1; EFG2; EFG3; EFGm        S  = p1,p2,p3,  

31、60;    sub_sequence = e1;e2;ei;en       output       next_sequence = ei;ei+1;en;en+i-1         i2,n       length(next_sequence) =n      

32、0;  ! visited(next_sequence,EFGs,CRG)       Si-1 =(e1 o e2 oo ei-1)S       "exnext_sequence,EFG(ex)=EFG(ex+1) or EFG(ex+1)=follow(EFG(ex)    后续子序列的前n-i+1个事件与输入子序列sub_sequence中的后n-i+1个事件相同,Si-1是事件序列e1; e2;ei-1从S

33、开始执行所达到的状态,即后续子序列的初始状态。4.3  预期状态生成    预期状态可根据其内容分为两个部分:需要用于状态比较的部分和不必用于状态比较的部分。如模式化窗口会限制输入焦点,验证的内容被限制在这个范围内,该窗口外的其它状态则不需要验证。预期状态可以定义为如下形式<S,S(u),S(l)>:       S=p1,p11,p12,p1m,p2,p21,p22,p2n,po,po1,po2,pol        pi= p(u),p(l)  piS       p(u)=win_cur

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论