欢迎来到学术参考网

一种基于覆盖的GUI测试用例生成方法

发布时间:2015-07-13 09:47
摘 要 在GUI技术正得到广泛应用的同时,其自身的特点使传统的基于代码的测试方法无法有效应用于GUI测试。GUI测试主要是通过执行事件序列、获取检测状态和对比验证内容来发现故障的,而现有的事件序列生成方法都没有直接对GUI的覆盖进行控制,这很有可能会遗漏重要的测试步骤;而现有的检测状态和验证内容生成方法不但效率低下,还有可能遗漏必要的检测点和关键的验证点。针对这些问题,作者提出了一种基于覆盖的GUI测试用例生成方法,它可以快速生成符合覆盖准则要求的事件序列,并自动生成全面的检测状态和验证内容。与其它GUI测试用例生成方法相比,该方法在故障检测效率及故障覆盖率等方面都具有明显优势。
关键词 GUI测试用例; 覆盖准则; 事件序列; 检测状态; 验证内容

1 引言

由于界面友好、便于开发、维护和操作等特点,GUI技术正在软件开发过程中得到广泛的应用。GUI应用程序一般具备两个主要的特征——图形界面的设计与功能代码的开发相独立、用户交互事件驱动程序执行[1,2],这可以使GUI程序在开发和维护过程中产生许多特殊的情况,如相同的代码对应不同的界面、不同版本的GUI具有相同的代码、功能代码所对应的消息或方法不能有效的体现用户交互等等,导致传统的基于代码的测试方法无法有效的应用于对GUI的测试。
与传统的测试用例概念不同,GUI的测试用例是指驱动程序运行的事件序列,如鼠标的点击和菜单的选择等动作。一种常见的测试用例生成方法是使用录制/回放工具录制生成包含运行事件序列的脚本,并在录制的过程中或完成后向脚本中添加检测点来验证相应事件的执行结果。这种方法虽然可以直接有效地生成事件执行序列,但是测试相关数据和事件操作顺序都固化在测试脚本中,非常不利于对测试用例的维护。Archer Group和Keith Zambelich等对这种方法加以改进,设计了控制同步数据驱动和关键字驱动方法[4,5],将测试数据从测试脚本中分离出来,形成独立的数据文件,以文件中的数据来驱动脚本运行。这样虽然在一定的程度上改进了测试用例维护的问题,但Archer Group的控制同步方法仅限于业务规则类型的测试,而Keith Zambelich的关键字驱动方法还需要对不同项目的测试脚本进行维护。
对于GUI测试用例的自动生成方法,Donat提出一种基于需求的测试用例生成技术,自动的将格式化的需求说明转换成测试用例。Kasik提出一种以学习的方式来生成测试用例的技术,在专家给出的GUI事件序列基础上,应用遗传算法技术来修改和增加这个序列,从而得到达到同样的目标多种选择。Memon给出一种基于计划的方法,用目标驱动测试用例生成的技术。这种方法首先给出测试用例的初始条件和目标条件,然后应用人工智能技术逐步向目标逼近。在利用有限状态机来生成测试用例的方法中[10],软件的行为被描述成FSM模型,它包含GUI的有限个状态,每一个输入动作都会使FSM中状态发生改变。在创建了FSM后,测试用例的生成过程就可以自动进行了。
虽然以上的几种方法在一定程度上可以实现测试用例的生成,但由于它们都没有直接对GUI的覆盖程度进行控制,因此可能会遗漏由用户交互产生的重要事件序列;而由于现有检测状态和验证内容生成方法的不足,每个事件序列对应的检测点和验证点也可能会有所缺失。在目前国内外GUI测试领域里,尚没有对以上问题进行详细研究。因此本文结合Memon的事件序列覆盖准则[11],提出一种基于覆盖的GUI测试用例生成方法。它可以生成符合覆盖准则要求的事件序列,并自动生成其全面的检测状态和验证内容,解决传统测试用例生成方法遗漏的重要测试步骤、必要检测点和关键验证点等问题。
本文的第二部分对GUI的组件、事件流图、调用关系图和测试用例进行定义;第三部分给出了GUI的单事件故障、事件交互故障和事件序列故障模型;第四部分从测试用例生成条件、子序列生成、预期状态生成和子序列连接等方面介绍了基于覆盖的GUI测试用例生成方法;第五部分通过实验来对比不同方法生成测试用例的事件序列覆盖率和故障覆盖率;最后是全文的总结和参考文献

2 GUI相关定义

2.1 GUI的组件

模式化窗口是GUI的一个窗口,当它被打开后,会将用户可操作的范围限定在该窗口之内。与模式窗口相对应的是非模式窗口,它不会限制用户的输入焦点,而是扩展了用户操作范围。模式化窗口及其相关的非模式化窗口可以代表GUI的一个层次,将其定义为GUI组件,以如下三元组MW,UWs,S0表示:
MW={e1,e2,e3,…,en},
UMs={UM1,UM2,…,UMm}
UMi={ea,eb,ec,…,ex},UMiÎ UMs
"UMi,UMi = invoke(e),eÎMW or eÎUMs
S0={p1,p2,p3,…,pn}
pi=property(object,value) piÎS0
MW是一个以事件的形式表示的模式窗口,
UWs是以事件的形式表示的非模式窗口的集合。UWs中的每个非模式窗口UWi都是由MWUWs中的事件打开。S0是组件首次打开后的状态,叫组件的初始状态,它由MW内的一组对象及其属性构成。

2.2 事件流图

每个组件都是由一组处于同一层次的GUI事件所构成,这些事件之间的联系可应用事件流图(Event Flow Graph)来描述。EFG中包含一个组件内所有的事件以及这些事件间的相互联系,可将其定义为一个四元组V,E,B,I
V={v1,v2,v3,…,vn} eventi=exp(vi)
EÍ V×V,"(vx,vy)∈E, vy=follow(vx)
BÍV,B=open(Comx)
IÍV"vx∈I,Comy=invoke(vx)
V是结点集合,一个结点对应组件中的一个事件。E表示直接连接结点的边,vy=follow(vx)表示vy代表的事件可以在vx代表的事件后面执行。B表示组件被首次打开后可以直接执行的事件集。I表示可以打开其它组件的事件集。

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,"(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的测试用例首先需要从一个初始状态开始,然后通过一个事件序列来描述用户的一系列交互动作。由于每个事件的执行都是与前面的事件执行结果相关联,只要其中一个事件的执行出现了问题,就会产生错误结果而影响后续操作,所以测试用例中还需要每个事件的预期输出,用以逐一验证测试执行过程中的实际输出。GUI测试用例定义成如下三元组 S0,E,S
S = {S0; S1; S2; ; Sn}
E = {e1; e2; ; en}
(e1,e2,…,en)=exp(v1,v2,…,vn)
(vi,vi+1)∈edge(EFG) or vi∈I(EFGx),vi+1∈B(EFGy),vi+1∈follows(vi)
Si= ei(Si-1)
S中包含了事件序列E的预期状态的集合,S0是测试用例的初始状态。序列E中的事件与事件流图EFG的结点一一对应,并且序列中相邻的两个事件可以连续执行。每个事件ei在它的当前状态Si-1下,都可以达到它的预期状态Si。

3 GUI故障模型

GUI测试可以分为验证应用程序统一规范的标准化测试、验证图形输出的属性测试、验证输入数据的确认测试和验证业务规则的功能测试等等,而不论何种测试类型,其故障检测过程都是通过执行事件序列、获取检测状态和对比验证内容等过程来实现对故障的检测。因此,可以事件序列为基础,将GUI故障划分为单事件故障、事件交互故障和事件序列故障。
当事件流图中的某个结点vi所代表的事件ei被执行后,产生的实际输出状态与预期输出状态不相符,由此产生的单事件故障描述
$e,e=exp(v),vÎ EFG
SourceState=BeforeExeEvent(e)
ExpectState=GetExpectState(e,SourceState)
CurrentState=e(SourceState)
ExpectState ¹ CurrentState
当一个事件对儿(ex,ey)被执行后,它的实际输出状态与预期输出状态不相符,由此产生的事件交互故障描述
$(ex,ey)=exp(vx,vy)
(vx,vy)Îedge(EFG) or vxÎI(EFGx),vyÎB(EFGy),vy=follow(vx)
SourceState=BeforeExeEventPair(ex,ey)
ExpectState =GetExpectState((ex,ey),SourceState )
CurrentState= (exoey)(SourceState)
ExpectState¹CurrentState
当一个事件序列(e1;e2;e3;…;en)被执行后,它的实际输出状态与预期输出状态不相符,由此产生的事件序列故障描述
$(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;…;en)
ExpectState =GetExpectState((e1;e2;e3;…;en),SourceState)
CurrentState=(e1oe2oe3o…oen)(SourceState)
ExpectState ¹ CurrentState

4 基于覆盖的GUI测试用例生成方法

本文将基于事件的覆盖准则引入到测试用例生成过程,在事件执行条件的基础上,自动生成满足覆盖准则要求的事件序列及其预期状态。这种方法首先要生成符合覆盖准则和测试用例生成条件要求的子序列,然后在判断子序列的有效性后生成其预期状态,最后将有效子序列逐步连接成目标测试用例。

4.1 测试用例生成条件

一个事件只有在满足特定的条件时,它才能够被执行,而根据不同的前提条件,它的执行结果也会有所不同。因此每个事件需要对应一个执行条件组,只有满足其中的条件时才能够执行。事件执行条件可描述为如下三元组e,Pre,Eff
Pre(e) ={pre1 (e),pre2(e),…,prem(e)}
Eff(e) ={eff1(e),eff2(e),…,effm(e)}
effj(e) = map(prej(e)) j∈[1,m]
pre(e)={pa,pb,pc,…}, eff(e)={px,py,pz,…}
p=property(object,value)
事件e有一组前提条件和一组执行结果,条件组中的每个条件都在结果组中有一个结果和它对应。条件和结果都以对象属性的形式表示。
测试用例生成条件首先要根据基于事件的覆盖准则来确定子序列的长度,然后需要测试用例的初始状态S0,以及在S0下可执行的起始事件ebegin和终止事件eend。测试用例生成条件可以描述成如下四元组cc,S0,ebegin,eend
cc ={cc-1,cc-2,cc-3,...cc-n }
S0 = {p1,p2,p3,…,pm}
●ebegin∈EFG1
$pre(ebegin)ÍS0
eend∈EFGn or eend =length,length=1,2,3...
cc-i表示长度等于i的事件序列覆盖准则,它的选取与GUI的实际规模相关。初始事件ebegin的确定必须在初始状态S0下,使其包含ebegin的一个执行前提条件。结束条件eend可以是一个事件,也可以是事件序列的长度。

4.2 子序列生成

子序列的生成主要分为三个部分:生成调用关系序列EFGs、参照EFGs生成第一个子序列以及生成后续子序列。调用关系序列可以描述成如下形式:
EFGs={EFG1; EFG2; EFG3;…; EFGn }
ebegin∈EFG1
eend∈EFGn
"EFGi∈EFGs,EFGi=follow(EFGi-1) i∈[2,n]
调用关系序列是从调用关系图中获得的路径,表示可以从ebegin出发达到eend的所有组件序列。EFGx=follow(EFGy)表示组件EFGx可由组件EFGy打开。第一个子序列的输入条件和生成结果描述
input
cc ={cc-n}
EFGs={EFG1; EFG2; EFG3;…; EFGm }
S0 = {p1,p2,p3,…}
ebegin∈ EFG1
$ pre(ebegin) Í S0
output
sub_sequence={ea; eb; . . .; ex}
ea = ebegin
length(sub_sequence) = n
! visited(sub_sequence,EFGs,CRG)
"ex∈next_sequence,EFG(ex)=EFG(ex+1) or EFG(ex+1)=follow(EFG(ex))
后续子序列在已得到的子序列基础上生成,其输入条件和生成结果描述
input
cc ={cc-n}
EFGs={EFG1; EFG2; EFG3;…; EFGm }
S = {p1,p2,p3,…}
sub_sequence = {e1;e2;…;ei;…en}
output
next_sequence = { ei;ei+1;…en;…en+i-1
} i∈[2,n]
length(next_sequence) =n
! visited(next_sequence,EFGs,CRG)
Si-1 =(e1 o e2 o…o ei-1)S
"ex∈next_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开始执行所达到的状态,即后续子序列的初始状态。

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)} pi∈S
p(u)=win_current(window,true)
p(l)=win_current(window,false)
S(l)={p1,p11,p12,…p1m,p2,p21,p22,…,p2n,…} pi=p(l)
S(u)=S - S(l)
预期状态S由可用状态S(u)和无用状态S(l)构成,p(u)表示当前窗口window可以获得输入焦点,p(l)表示当前窗口不可以获得输入焦点。S(l)通过p(l)限定所有不能获得输入焦点的属性,S(u)通过p(u)限定所有可以获得输入焦点的属性。预期状态生成过程分为生成事件的预期状态和生成子序列的预期状态两个阶段。
根据事件的执行结果不同,可将其分为多种类型,如打开模式窗口、打开非模式窗口、关闭模式窗口、关闭非模式窗口和在当前窗口等,不同类型的事件e在状态Sa,Sa(u),Sa(l)下生成的预期状态Sb,Sb(u),Sb(l)如下所示:
Type=open_model
$prex(e)∈Sa
com=GetModelWindow(effx(e))
S0=GetInitialState(com)
Sb(l)=Sa(l)+Sa(u)
Sb(u)=S0
Type=open_modeless
$prex(e)∈Sa
com=GetModelessWindow(effx(e))
S0=GetInitialState(com)
Sb(l)=Sa(l)
Sb(u)=Sa(u)+S0
Type=close_model
S0=GetModelState(Sa(l))
Sb(l)=Sa(l) - S0
Sb(u)=S0
Type=close_modeless
$prex(e)∈Sa
com=GetModelessWindow(effx(e))
S0=GetModelessState(Sa(u),com)
Sb(l)=Sa(l)
Sb(u)=Sa(u) - S0
Type=keep_current
$prex(e)∈Sa
S0 = Sa(u)Ç effx(e)
Sb(l)=Sa(l)
Sb(u)=Sa(u) - S0 +eff(e)
在前面介绍的子序列生成方法和事件预期状态生成方法基础上,事件序列的预期状态生成方法可描述
input
S0 = {p1,p2,p3,…,pm}
E= {e1;e2;...;en}
T(ei) ={open_model |open_modeless | close_model |close_modeless |keep_current}
Pre ={Pre(e1),Pre(e2),…,Pre(en)}
Eff ={Eff(e1),Eff(e2),…,Eff(en)}
output
Si=GenEventExpectState(Si-1,ei),i= 1…n
Sn = (e1 o e2 o … o en-1 o en) S0
对于子序列E={e1;e2;e3;...;en}中的所有事件ei,如果都满足上述条件,则可以得到它的预期状态Sn = (e1 o e2 o … o en-1 o en) S0;如果其中的事件ej不满足上述条件,则无法生成该子序列的预期状态。这样在生成子序列预期状态的同时,可以判断出它的可执行性。

4.4 子序列连接

在生成了子序列的预期状态后,它成为一个具有初始状态和预期状态的可执行事件序列,称为有效子序列。一个有效子序列Ea和它的后续有效子序列 Eb=Next(Ea)描述
Ea={e1;e2;…;ej;ej+1;…;en}
IS(Ea)=S0
ES(Ea) = Sn =(e1 o e2 o … o en)S0
Eb=Next(Ea)={ej;ej+1;…;en;…;en+j-1}
IS(Eb)= Sj-1= (e1 o e2 o … o ej-1)S0
ES(Eb) =(ej o ej+1 o … o en o…en+j-1) Sj-1
IS是子序列的初始状态,ES是子序列的预期状态。EaEb具有重叠的部分,可将Eb连接到Ea的后面,构成一个新的序列。Eb连接到Ea的结果E=Link(Ea,Eb)描述
Ea={e1;e2;…;ej;ej+1;…;en}
Eb= {ej;ej+1;…;en;…;en+j-1}
E=Link(Ea,Eb)={e1;e2;…;ej;ej+1;…;en;…;en+j-1}
IS(E)= IS(Ea)
ES(E) =ES(Eb)
测试用例的生成过程就是将多个有效子序列{E1;E2;E3;...;En}逐步连接到一个目标测试用例TC,其中Ei+1Ei的后续子序列,第一个子序列E1中的第一个事件是测试用例生成条件cc;S0;ebegin;eend中的ebegin,最后一个子序列En中的最后一个事件是cc;S0;ebegin;eend中的eend。应用有效子序列的连接方法Link,将有效子序列集合E={E1,E2,E3,...,En}连接成测试用例TC的过程描述
Ei={ea;eb;ec; …;ex},EiÎE
Ei=Next(Ei-1) iÎ[2,n]
TC=E1
TC=Link(TC,Ei) i=2…n
IS(TC)=IS(E1)
ES(TC)=ES(En)
=
=

5 实验结果

在引言中我们提到了几种GUI测试用例自动生成方法,如应用工具录制脚本的录制/回放方法、应用有限状态机模型的基于状态方法和应用GUI结构的基于结构等方法。本节通过几个实验,将这些方法与基于覆盖的测试用例生成方法相对比,观察它们对事件序列的覆盖效果和对GUI故障的覆盖效果。实验以MI公司的测试工具WinRunner中附带的示例程序Flight Reservation作为研究对象,它包含8个组件和54个事件。

5.1 事件序列覆盖效果

这个实验在组件内部进行,观察几种方法生成的测试用例对组件内部事件序列的覆盖效果。选择Flight Reservation中的MAIN组件作为研究对象,它一共包含25个事件,选用长度等于3的事件序列覆盖准则cc={cc-3}来评估覆盖程度。
首先在没有对该组件生成任何测试用例的条件下,分别选用录制/回放、基于状态、基于结构和基于覆盖的方法生成长度等于21的5组测试用例,使MAIN组件的覆盖程度依次达到15%,25%,35%,45%,55%,观察不同方法所需的测试用例数量。实验结果如图1所示。
图1 组件内事件序列覆盖效果1
在组件MAIN达到55%的覆盖程度基础上,再分别选用录制/回放、基于状态、基于结构和基于覆盖的方法生成长度等于21的5组测试用例,使覆盖程度逐步递增5%,从55%达到80%,观察不同方法所需的测试用例数量。实验结果如图2所示。
图2 组件内事件序列覆盖效果2
接下来的实验在Flight Reservation的8个组件间进行,观察几种方法生成的测试用例对组件间的事件序列覆盖效果。首先在没有生成任何测试用例的条件下,分别选用录制/回放、基于状态、基于结构和基于覆盖的方法生成5组长度等于21的组件间交互测试用例,使8个组件间的覆盖程度达到15%,25%,35%,45%,55%,观察不同方法所需的测试用例数量。实验结果如图3所示。
图3 组件间事件序列覆盖效果1
在组件间已经达到55%的覆盖程度基础上,再分别选用录制/回放、基于状态、基于结构和基于覆盖的方法生成长度等于21的5组测试用例,使组件间覆盖程度逐步递增5%,从55%达到80%,观察不同方法所需的测试用例数量。实验结果如图4所示。
图4 组件间事件序列覆盖效果2
从前面的几个事件序列覆盖效果实验可以得出,在相同条件下,要达到一定的覆盖程度,其它方法生成测试用例数量比基于覆盖方法大的多;要提高一定的覆盖增量,随着覆盖程度的增加,其它方法所需的测试用例也越来越多,而基于覆盖的方法却可以保持同样的数量递增。这样,在更高的覆盖条件下,由于没有对覆盖进行控制,其它的方法无论产生多少测试用例都无法有效的提高事件序列覆盖率,而这种基于覆盖的方法只要生成测试用例,就一定可以提高相应的覆盖程度。

5.2 GUI故障覆盖效果

为了观察几种方法生成测试用例的故障覆盖效果,假设Fi={f1,f2,…,f20}是程序Flight Reservation中存在的故障集合,从F1F4分别代表单事件故障、事件交互故障、长度为3的事件序列故障和长度为4的事件序列故障。Ti是 测试用例的集合,Ti从1到4分别代表应用录制/回放方法、基于状态的方法、基于结构的方法和基于覆盖的方法生成的测试用例。
针对8个组件和54个交互事件,分别应用这些方法生成不同长度的测试用例Ti={t1,t2,…,t1000},其分布如图5所示。每种方法生成的测试用例在各自的执行过程中可检测出来的故障如图6至图9所示。
图5 测试用例分布情况
图6 录制/回放方法
图7 基于状态方法
图8 基于结构方法
图9 基于覆盖方法
从图6至图9可以看出,由于对事件序列进行控制,基于覆盖的方法可以在最短的时间内检测出所有单事件故障、事件交互故障和事件序列-3故障,而其它方法的故障检测效率却差的多。
下面应用事件序列覆盖率和故障覆盖率,对比各种方法生成的测试用例的故障检测效果。事件序列覆盖率中的N(CC-i)表示长度等于i的事件序列数目,故障覆盖率中的N(Fi)表示类型为Fi的故障的实际数目。事件序列覆盖率对比如表1所示,故障覆盖率对比如表2所示。

表1 几种方法的事件序列覆盖率对比
录制/回放
基于状态
基于结构
基于覆盖
cc-1
100%
100%
100%
100%
cc-2
100%
100%
100%
100%
cc-3
87%
94%
98%
100%
cc-4
33%
43%
51%
68%
表2 几种方法的故障覆盖率对比
录制/回放
基于状态
基于结构
基于覆盖
F1
90%
95%
100%
100%
F2
85%
90%
100%
100%
F3
75%
85%
95%
100%
F4
20%
30%
45%
60%

6 结束语

本文在事件覆盖准则的基础上,提出了一个基于覆盖的GUI测试用例生成方法。它可以快速生成符合覆盖准则要求的事件序列,并在确保该事件序列可执行的同时,自动生成其测试状态和验证内容。解决了传统测试用例生成方法遗漏的重要测试步骤、必要检测点和关键验证点等问题。与国内外同类技术相比,应用该方法生成的测试用例在故障检测效率及故障覆盖率等方面都具有明显的优势。

参考文献

[1]Mahajan,R.,and Shneiderman,B. Visual & textual consistency checking tools for graphical user interfaces. Technical Report CS-TR-3639,University of Maryland,College Park,May 1996
Myers,B. A. State of the Art in User Interface Software Tools,vol. 4. Ablex Publishing,1993,ch. pp110-150
Hammontree,M. L.,Hendrickson,J. J.,and Hensley,B. W. Integrated data capture and analysis tools for research and testing an graphical user interfaces. In Proceedings of the Conference on Human Factors in Computing Systems (New York,NY,USA,May 1992),ACM Press,pp. 431–432
Mosley,Daniel J.,Bruce A. Posey. “Building and Executing Effective Real-Word Test Scripts with Rational Suite TestStudio 2001.” Workbook from seminar offered by CSST Technologies,Inc.,and the Archer Group
Zambelich,Keith. “Totally Data-Driven Automated Testing,Using Key-Word Input to Drive the Automated Testing Process.” Whitepaper,Automated Testing Specialists
Donat,M. Automating Formal Specification Based Testing. In Proc. Conf. on Theory and Practice of Software Development (TAPSOFT 97) (Lille,France,1997),M. Bidoit and M. Dauchet,Eds.,vol. 1214 of Lecture Notes in Computer Science,Springer-Verlag,Berlin,pp. 833–847
Kasik,D. J.,and George,H. G. Toward automatic generation of novice user test scripts. In Proceedings of the Conference on Human Factors in Computing Systems: Common Ground (New York,13–18 Apr. 1996),ACM Press,pp. 244–251
Fogel,L. J.,Owens,A. J.,and Walsh,M. J. Artificial Intelligence through Simulated Evolution. John Wiley & Sons,New York,1966
Atif ,Mary Lou Soffa. Hierarchical GUI Test Case Generation Using Automated Planning. IEEE transactions on software engineering. vol .27 no 2,Feb.2002
[10]Chow,T. S. Testing software design modeled by finite-state machines. IEEE trans. on Software Engineering SE-4,3 (1978),178–187
[11]Atif ,Mary Lou Soffa. Coverage Criteria for GUI Testing. ACM press,Sep.2001

上一篇:基于CORDIC算法数字下变频器设计

下一篇:基于二叉排序树的商品信息动态检索研究