1、h t t p:/ww wj s j k x c o mD O I:/j s j k x 到稿日期:返修日期:基金项目:四川省自然科学基金(N S F S C );四川大学专职博士后研发基金(S C U )T h i sw o r kw a ss u p p o r t e db yt h eN a t u r a lS c i e n c eF o u n d a t i o no fS i c h u a nP r o v i n c e,C h i n a(N S F S C )a n dS i c h u a nU n i v e r s i t yP o s t d o c t o
2、r a lS c i e n c eR e s e a r c hF o u n d a t i o n(S C U )通信作者:杨秋辉(y a n g q i u h u i s c u e d u c n)基于依赖模型的R E S T接口测试用例生成方法研究刘盈盈杨秋辉姚邦国刘巧韵四川大学计算机学院成都 (y y l i u e v e f o x m a i l c o m)摘要R E S T接口中普遍存在依赖关系,导致生成合理的接口调用序列与输入参数变得十分困难.现有的大多数方法只考虑了其中一种依赖关系,并需要人工执行繁杂的前置操作,生成的测试用例有效性仍然较低.针对以上问题,文中提出
3、了一种基于依赖模型的测试用例生成方法.通过解析O p e n A P I文档,该方法提取了接口内的操作间依赖关系与参数间依赖关系,并据此建立了两种依赖模型,从模型生成测试用例,最后从方面确定测试预言.实验结果表明,该方法的输入度量覆盖率达到了 ,状态码类别、状态码、响应资源类型的覆盖率分别达到了 ,并能在限定时间内检出接口内部缺陷;与R E S T l e r和R E S T e s t相比,该方法的输出度量覆盖率最大提高了,触发了最多次的异常响应状态码,检测到接口异常响应的比例最大提高了.该方法为R E S T接口的测试用例生成问题提供了有价值的参考.关键词:R E S T接口;测试用例生成
4、;操作间依赖;参数间依赖;B E R T模型中图法分类号T P S t u d yo nR E S TA P IT e s tC a s eG e n e r a t i o nM e t h o dB a s e do nD e p e n d e n c yM o d e lL I U Y i n g y i n g,YANGQ i u h u i,YA OB a n g g u oa n dL I U Q i a o y u nC o l l e g eo fC o m p u t e rS c i e n c e,S i c h u a nU n i v e r s i t y,C h
5、 e n g d u ,C h i n aA b s t r a c t T h ep r e v a l e n c eo f d e p e n d e n c i e s i nR E S TA P Im a k e s i t d i f f i c u l t t og e n e r a t e a r e a s o n a b l e s e q u e n c eo fA P I c a l l sw i t h i n p u tp a r a m e t e r s M o s t e x i s t i n ga p p r o a c h e so n l yc o
6、n s i d e r o n eo f t h e s ed e p e n d e n c i e sa n dr e q u i r e c u m b e r s o m em a n u a l p r e l i m i n a r i e s,t h u s t h eg e n e r a t e dt e s t c a s e sa r es t i l l l e s se f f e c t i v e T oa d d r e s s t h ea b o v ep r o b l e m,a t e s t c a s eg e n e r a t i o nm e
7、 t h o db a s e do nd e p e n d e n c ym o d e l i sp r o p o s e d B yp a r s i n g t h eO p e n A P I d o c u m e n t a t i o n,t h i sm e t h o de x t r a c t s t h e i n t e r o p e r a t i o nd e p e n d e n c i e s a n d i n t e r p a r a m e t e rd e p e n d e n c i e s,e s t a b l i s h e s
8、t w od e p e n d e n c ym o d e l s,g e n e r a t e st e s tc a s e sf r o mt h em o d e l s,a n dd e t e r m i n e st e s to r a c l e s E x p e r i m e n t a lr e s u l t ss h o wt h a tt h ep r o p o s e dm e t h o da c h i e v e s i n p u tm e t r i cc o v e r a g e,a n d ,a n d c o v e r a g e
9、f o r s t a t u sc o d ec a t e g o r y,s t a t u sc o d e,a n dr e s p o n s er e s o u r c et y p e,r e s p e c t i v e l y,a n dc a nd e t e c t i n t e r n a l i n t e r f a c ed e f e c t sw i t h i na l i m i t e dt i m e C o m p a r e dw i t hR E S T l e r a n dR E S T e s t,t h ep r o p o s
10、e dm e t h o d i m p r o v e s t h em a x i m u m o f o u t p u tm e t r i cc o v e r a g e,t r i g g e r e s t h em o s t n u m b e r o f a b n o r m a l r e s p o n s e s t a t u s c o d e s,a n dd e t e c t s am a x i m u mo f i n c r e a s e i n t h ep e r c e n t a g eo f a b n o r m a l r e s
11、p o n s e s T h em e t h o dp r o v i d e sav a l u a b l er e f e r e n c e f o r t h e t e s t c a s eg e n e r a t i o np r o b l e mo fR E S TA P I K e y w o r d s R E S TA P I,T e s t c a s eg e n e r a t i o n,I n t e r o p e r a t i o nd e p e n d e n c y,I n t e r p a r a m e t e rd e p e n
12、d e n c y,B E R Tm o d e l引言目前,大 多 数 云 服 务 都 通 过R E S T(R e p r e s e n t a t i o n a lS t a t eT r a n s f e r)接口进行访问.R E S T接口基于HT T P/S协议,提 供 了 一 种 统 一 的 方 式 来 创 建(P O S T/P UT)、管 理(P A T CH/P UT/P O S T)、删除(D E L E T E)以及获取(G E T)云资源.作为目前主流的接口开发风格,R E S T接口具有结构清晰、易于理解和扩展方便等特点,在工业界和学术界一直广受关注.为了保证
13、R E S T接口的质量,开放软件在发布前必须经过详细的接口测试.年,S a l t S e c u r i t y的接口安全报告中指出:过去一年中,有 的组织发生过接口安全事故,严重者甚至导致了敏感数据外泄,造成不可估量的损失.因此,关于R E S T接口的测试研究具有重要的实际意义.目前,已有多个研究提出了关于R E S T接口的黑盒测试方法 .然而,一方面,目前相关的黑盒测试方法大多针对接口的单个操作进行测试,难以检测出由多个连续操作所触发的缺陷;另一方面,由于可能的输入参数构成了一个庞大的参数空间,在不考虑参数间依赖关系限制的情况下,无法在有限时间成本内遍历整个空间,难以生成合法的参数
14、组合.针对以上问题,本文在已有研究的基础上,提出了一种基于依赖模 型的 测 试用 例生 成 方 法.该 方 法 主 要 针 对 遵 循O p e n A P I规范的R E S T接口应用开发,具有较广泛的应用前景.相关工作在R E S T接口的各操作之间,可能存在这样的关系:操作A的响应数据是操作B的输入数据,那么操作A必须在操作B之前执行.在进行R E S T接口测试时,类似B,A 这样不合理的操作序列将无法覆盖到待测接口的有效状态转移,导致大幅度降低测试效率.针对该问题,A t l i d a k i s等提 出 了R E S T l e r工具,通过分析接口操作间的生产者消费者依赖关系
15、,从响应信息中学习无效的操作组合来动态生成操作序列;V i g l i a n i s i等 提 出 了R E S T E S T G E N工 具,通 过 编 码A P I文档中可用操作之间的数据依赖,来生成常规场景和错误场景的测试用例.而在R E S T接口的各参数之间,可能存在这样的关系:参数Y的存在性会受到参数X的影响,例如,若参数X被设置,那么参数Y必须同时被设置.在测试时,若未考虑到此类依赖关系,输入参数的生成空间将会呈指数级增长,难以在有限时间内搜索到合法参数组合.针对该问题,M a r t i n L o p e z等建立了一套描述参数依赖的特定领域语言 I D L(I n t
16、 e r p a r a m e t e rD e p e n d e n c yL a n g u a g e),提取了种类型的参数间依赖关系并形成I D L文档.基于O p e n A P I与I D L文档,该研究实现了R E S T e s t框架,通过生成合法与非法输入参数组合来更快速地对被测接口进行更深入的测试评估.但是,目前针对R E S T接口内部依赖关系的研究,大部分仅考虑了其中一类依赖;并且,在目前处理参数间依赖问题的流行方案中,大多数基于特定领域语言,需要测试人员手动执行繁杂的前置操作,自动化程度较低.因此,针对现有方法的不足,本文提出了一种基于依赖模型的测试用例生成方法
17、.方案描述在本 文 提 出 的 方 案 中,其 输 入 只 需 要 待 测 接 口 的O p e n A P I文档,基于比较规则与自然语言处理模型,实现了接口操作间依赖与参数间依赖关系的自动提取,据此建立了依赖关系模型,从测试序列生成和接口参数生成两个维度生成测试用例.图为方案的整体流程图.图方案的流程图F i g A p p r o a c hf l o wc h a r t 操作间依赖建模在R E S T接口的多个调用之间可能会存在共享数据,而这类共享数据隐式地确定了操作间的合理调用顺序,即产生该数据的调用应先于消费该数据的调用发生.因此,根据此类数据依赖可以确定操作间的执行次序.基于上
18、述思路,本文根据相关研究实现了数据依赖判断算法,如算法所示.同时,考虑到不同对象的各字段可能会使用相同的名称命名,因此进入算法前,将数据对象名与字段名进行了合并,例如p e t对象的i d字段,将会被重命名为p e t i d.另外,考虑到可能存在输入错误的情况,因此本文加入编辑距离作为比较规则.算法判断是否存在数据依赖输入:待分析的两个数据d,d输出:是否存在数据依赖 I f(d,d均为原子类型):r e t u r nI s S a m e T y p e(d,d)I f(d,d均为复合类型):r e t u r nI s S a m e S c h e m a(d,d)r e t u r
19、 nF a l s e P r o c e d u r e I s S a m e T y p e(d,d)I f(d字段名d字段名)o r(编辑距离(d,d)t h r)o r(S n o w b a l l(d)S n o w b a l l(d):r e t u r nT r u e r e t u r nF a l s e P r o c e d u r e I s S a m e S c h e m a(d,d)i s S a m e T r u e F o rd中的每一个子结构s u b:I fd中包含s u b结构:i s S a m e i s S a m ea n d递归判断
20、(d,d子结构是否相同)r e t u r n i s S a m eC o m p u t e rS c i e n c e计算机科学V o l ,N o ,S e p 算法输入为待分析的两个数据,输出为判断其之间是否存在数据依赖关系.首先判断数据的数据类型,当均为原子类型时,进入算法的第行,比较两个数据的字段名是否完全相等或编辑距离是否小于等于阈值(本文设置为),若为假,则进一步使用S n o w b a l l算法提取字段名所代表的单词词干,根据词干比较结果判断是否存在数据依赖;当数据为复合类型时,进入算法的第 行.由于O p e n A P I规范中的复合类型使用S c h e m a
21、对象定义,因此算法的第 行需要递归地比较两个S c h e m a对象的子结构是否相同.获得数据依赖后,建立操作间依赖图模型(O p e r a t i o nD e p e n d e n c yG r a p h,O D G).O D G为一个有向图,用G(N,N,Nf,E)表示.其中,N为接口所有操作的集合;N为起始节点集合,表示不依赖任何操作的操作集合;Nf为终止节点集合,表示不被任何操作所依赖的操作集合;E为有向边集合,对于任意操作o,o(o,oN),若o存在对o的数据依赖,则建立一条有向边eoo,eE.参数间依赖建模为了从O p e n A P I文档中自动提取参数间的依赖关系,本
22、文训练了一个基于B E R T模型的参数间依赖关系分类模型.利用该分类模型对接口内的所有参数进行关系分类,建立参数间依赖模型.基于现有研究提出的多参数依赖关系类别,本文首先考虑了参数两两间的依赖关系.给定操作内任意两个参数p和p,其间可能存在以下种依赖关系中的任一种:)R e q u i r e(p,p)pp,表示当参数p指定时p必须指定,p对p没有影响;)E i t h e r(p,p)pp,表示参数p或p只能指定一个;)B o t h(p,p)pp,表示参数p和p必须同时指定;)N o n e(p,p),表示参数p和p没有关系.数据收集与预处理从相关文献 以及A P I仓库 中收集大量参数
23、描述文本,进行数据清洗后,手工标记文本中的参数实体:在第一个参数实体的前后添加符号,在第二个参数实体的前后添加符号.若涉及的参数多于两个,则进行两两标记后,对结果进行合并,得到所有参数的依赖关系.处理完毕后,以 的比例将数据集划分为训练集、验证集和测试集.样本数据的基本情况如表所列.表样本数据的基本情况T a b l eB a s i c i n f o r m a t i o no f s a m p l ed a t a依赖关系样本数量示例数据R e q u i r e ()I f p r o j e c t_i di ss p e c i f i e d,e m a i l a n du
24、 s e r_i d i sr e q u i r e d()I fp r o j e c t_i di ss p e c i f i e d,e m a i l a n d u s e r_i di sr e q u i r e d()I f p r o j e c t_i d i ss p e c i f i e d,e m a i la n d u s e r_i di sr e q u i r e dE i t h e r Y o um u s ts p e c i f yo n eo f u s e r_i d,u s e r_n a m eB o t h l o n g i t u
25、 d e m u s tb eu s e dw i t h l a t i t u d eN o n e A p p l ya n o f f s e tt ot h e q u e r y总计 构建分类模型由于O p e n A P I规范建议开发者以自然语言来描述参数间的约束关系,因此可以考虑使用自然语言处理技术来辅助提取和分析此类关系.参数间依赖关系的推断类似于一般的关系抽取任务,需要进行命名实体识别与关系分类两个步骤.因此,本文使用Wu等 提出的关系抽取模型R B E R T进行依赖关系分类.该模型主要分为两个部分:第一部分为特征提取,即获得参数描述文本的嵌入表示;第二部分为一个线性分
26、类器,如图所示.图基于B E R T模型的参数间依赖关系分类模型结构F i g S t r u c t u r eo f c l a s s i f i c a t i o nm o d e l b a s e do nt h eB E R Tm o d e lf o r i n t e r p a r a m e t e rd e p e n d e n c y模型以一段连续文本为输入,其中包含的两个参数文本已在预处理阶段进行标识,记为p和p.同时,以C L S 标识文本的起始位置.经过B E R T模型后,获得该段文本的向量表示,其中向量Hi至Hj为参数p对应隐层输出,向量Hk至Hm为参数
27、p的隐层输出,分别对两部分隐层输出进行平均后,获得两个参数的向量表示,经过激活操作后输入至一个全连接层,得到H与H;同样,C L S 对应的隐层输出H进行激活操作后输入至全连接层,获得H.最后,将H,H,H进行拼接后,输入到全连接层,使用S o f t m a x获得分类概率p.模型使用交叉熵作为损失函数,在验证集上进行评估、调整后,得到主要超参数值:批量大小,学习率 ,训练轮次,D r o p o u t r a t e .由于参数间的依赖关系分类属于文本分类问题,因此考虑使用精确率P r e c i s i o n、召回率R e c a l l以及F 指标来评估模型性能.除此之外,由于使用
28、的数据具有不平衡的特点,并且每个类别具有同等的重要性,因此使用M a c r o F 指标来评估分类器的效果,计算式如式()所示:M a c r o FiFi()构建参数间的依赖模型用构建的分类模型进行参数间依赖关系分类,建立参数间依赖模型.首先遍历整个操作列表,提取每个操作的所有刘盈盈,等:基于依赖模型的R E S T接口测试用例生成方法研究参数项与描述文本,筛选出包含多个参数名的文本,使用分类模型进行关系分类.例如,若参数Y的描述文本中包含字段“R e q u i r e dw h e nu s i n gX”,而参数X的文本中不包含此类关系描述,则此 时 可 通 过 分 类 模 型 得
29、到 依 赖 关 系(X,Y,R e q u i r e).处理完毕所有操作后,对包含相同参数对的分类结果进行检查,去除矛盾的依赖关系,最终获得参数间的依赖关系模型.基于依赖模型生成测试用例一个完备的测试用例主要包含部分,即操作序列、参数组合以及测试预言.生成操作序列生成新序列的过程,即从候选操作集中选择操作,附加至当前操作序列的最后.文献 提出使用广度优先搜索策略(B F S),但随着操作序列不断生成,候选操作集将越来越大,使用B F S策略需要对候选集中的每一个操作生成新的操作序列,保存这些状态需要消耗巨大的资源.因此,本文使用一种基于随机搜索的序列生成方法.算法操作序列生成输入:操作间依赖
30、关系模型G(N,N,Nf,E);最大序列长度L;最大运行时间T i m e L i m i t输出:操作序列集合s e q s s e q s T i m e S t a r tt i m e()f o r i t oLd o s e q ss e q s R a n d o mG e n e r a t e S e q()r e p e a t s e q,s a t i s f i e d,s e q R a n d o m C h o o s e(s e q s)f o rE a c hn i nNd o I fH a s D e p e n d e n c y O n(n,s e q)
31、t h e n s a t i s f i e ds a t i s f i e d n s e q A p p e n d(s e q,R a n d o m C h o o s e(s a t i s f i e d)s e q ss e q s s e q T i m e E n d t i m e()U n t i lT i m e E n d T i m e S t a r t T i m e L i m i t()r e t u r ns e q s算法以操作间依赖关系模型G、最大初始序列长度L以及最大运行时间T i m e L i m i t为输入,以生成的操作序列集合s e q
32、 s为输出.算法中的第行,从起始节点集N中随机选择若干节点,初始化若干长度小于预设值的序列,形成序列集合.算法中的第行,每次从序列集合中随机选择一条序列,根据依赖模型G可确定与该条序列中的操作存在数据依赖的操作集合,从该集合中随机选择一个操作,将其添加至序列末尾,完成一次对序列的扩展.每生成一个测试序列都需要判断时间成本是否耗尽,如算法的第 行.相比B F S算法,该方法由于并未记录遍历操作过程中可能产生的 所有 序列,因此 有 效 减 少 了 资 源 开 销,运 行 效 率更高.确定参数组合与参数值为了确定调用接口时应提供的输入参数组合,根据已有研究,将种参数间依赖关系映射至约束满足(C o
33、 n s t r a i n t sS a t i s f a c t i o nP r o b l e m,C S P)问题域,用三元组(V,D,C)进行表示.其中,变量V为操作内的所有参数,定义域D为每个参数类型与布尔变量的并集,布尔变量用于记录该参数是否已被设置,约束条件C由参数间的依赖关系模型转化而来.针对具体的参数向量vi,转化关系如表所列,注意N o n e关系对参数无约束作用,可以直接忽略.表参数间依赖映射为C S P约束T a b l e I n t e r p a r a m e t e rd e p e n d e n c ym a p p i n ga saC S Pc
34、o n s t r a i n t参数间依赖关系C S P映射R e q u i r e:I fviT h e nvjCCm a p(vi)m a p(vj)E i t h e r:viX O RvjCCm a p(v i)m a p(v j)B o t h:viAN DvjCCm a p(vi)m a p(vj)表中,m a p(k)CCv S e tt r u e,i|V|,j|V|,v S e t代表参数v是否为该操作的必需参数.使用谷歌开源工具O R T o o l s 进行约束求解,求解结果即为该操作的合法参数组合.针对参数组合中各参数的赋值问题,使用动态响应字典进行数据复用.为了解
35、决动态响应字典中初始数据的缺失问题,在测试运行前,首先对R E S T接口的O p e n A P I文档进行一次静态分析,从中提取可用的示例数据,将其作为静态数据记录在动态响应字典中.在没有可复用数据时,根据不同的参数类型,采用不同的方法随机生成对应类型数据.所有参数赋值完毕后,需要构造HT T P请求并执行,若执行成功,则将该次操作的响应数据存至字典中,以便下次请求进行数据复用.生成测试预言由于本文主要针对接口的功能验证来生成测试用例,因此考虑接口在功能实现层面的测试预言.根据O p e n A P I文档对接口 功 能 的 定 义,可 从 状 态 码、J S ON S c h e m a
36、和K e y V a l u e这个方面生成测试预言.)使用响应状态码生成测试预言:接口设计人员通常会在O p e n A P I文档中标明正确或错误处理请求时,客户端将收到的响应状态码,据此可以确定测试预言.)使用J S ON S c h e m a生成测试预言:J S ON S c h e m a是定义负载数据约束的标准,数据发送和接收者基于该约束对数据进行验证,以保证交换数据的正确性.因此,根据J S ON S c h e m a中的限制关系可对接口调用结果生成测试预言.)使用K e y V a l u e生成测试预言:完全使用自动化方法对响应信息进行检查是一项十分困难的工作.因此,本文
37、提供了一种半自动化的K e y V a l u e测试预言生成方法.该方法首先使用状态码和J S ON S c h e m a约束生成测试预言,然后由测试人员手动根据操作序列设计输入参数并记录预期响应,最后扩展自动生成的测试预言.该方法生成的测试用例可用于R E S T接口的回归测试.实验验证 实验数据使用G i t h u b上已 公 开 的个R E S T接 口 项 目 进 行 实验,这些项目已被应用于相关研究,.表列 出了 各项目的 详 细 信 息.其 中,P e t s t o r e项 目 为O p e n A P I官 方C o m p u t e rS c i e n c e计算
38、机科学V o l ,N o ,S e p 示例项目,其数据直接 保 存于 内存 中,因 此 未 使 用 其 他 数据库.本文选择的实验对象涉及不同编程语言、开发框架与数据库,并且具有 不 同复 杂度,能够 较好 地 代表 真实 世界的R E S T接口.表实验对象的详细信息T a b l eE x p e r i m e n t a l s u b j e c td e t a i l s实验对象开发语言开发框架访问点数量操作数量数据库规模(L O C)B l o g P o s t sP y t h o nF l a s kS q l i t e P e t s t o r eJ a v a
39、S p r i n gB o o t R e s t n e w sK o t l i nS p r i n gB o o tH C a t w a t c hJ a v aS p r i n gB o o tP o s t g r e S Q L C y c l o t r o nJ a v a s c r i p tE x p r e s s M o n g o D B 评估指标)O p e n A P I文档覆盖度量由于本文方案基于O p e n A P I文档对接口进行功能测试,因此考虑采用基于功能的测试覆盖率指标.当前应用最广的是M a r t i n L o p e z等提出的覆盖
40、度量,该研究将覆盖度量分为两类:输入覆盖度量和输出覆盖度量.输入覆盖度量主要包括路径覆盖、操作覆盖、参数覆盖、参数值覆盖与请求资源类型覆盖;输出覆盖度量主要包括状态码覆盖、状态码类别覆盖以及响应资源类型覆盖.这些覆盖度量的计算式如式()所示:C o v e r a g e(m e t r i c)t e s t e d_n u m(m e t r i c)t o t a l_n u m(m e t r i c)()其中,m e t r i c表示所使用的覆盖标准,可取上述覆盖标准中的任一种,在选定的覆盖标准m e t r i c下,t o t a l_n u m(m e t r i c)表示O
41、 p e n A P I文档中定义的对应元素总数量,t e s t e d_n u m(m e t r i c)表示测试过程中覆盖到的元素数量.)错误检测能力 X X响应状态码表示接口内部的实现缺陷,该状态码在测试过程中出现的情况也反映了测试用例的检错能力.本实验计算了异常响应比率,即 X X响应状态码的占比,计算式如式()所示:异常响应比率XX响应状态码数量响应状态码总数()该比率反映了已运行用例的总体检错能力,其值越高表示检错能力越强.结果分析 实验:生成的测试用例质量评估首先在B l o g p o s t项目上对该方案进行了可行性验证.该项目包含一个人工植入的缺陷,且只有在考虑了操作间
42、的依赖时,才能触发该缺陷.实验时,所使用的分类模型 精确率为 ,M a c r o F 值为 ,召回率为 .在该项目上运行方案 m i n,设置最大序列长度为,使用R e s t a t s 工具统计O p e n A P I文 档 中 各 覆 盖 度 量 的 覆 盖 率,结果如表所列.表B l o g P o s t s项目O p e n A P I文档的覆盖情况T a b l eB l o g P o s t sp r o j e c tsO p e n A P Id o c u m e n t a t i o nc o v e r a g e类别度量总数被覆盖数覆盖率/输入覆盖路径 操作
43、 参数 参数值请求资源类型 输出覆盖 状态码 响应资源类型 从表可知,本文方案能够对B l o g P o s t s接口的输入度量实现完全覆盖,表明生成的测试用例能够对被测接口的不同部分进行测试;同时,输出度量覆盖率均大于,这表明测试用例能够覆盖到接口内大部分的业务逻辑.在第个请求响应循环后,本文方案发现了B l o g P o s t s中的人工植入缺陷,并在第 次和第 次请求中重复检测到了该缺陷.实验:本文方案与R E S T l e r和R E S T e s t工具的对比实验本文主要关注R E S T接口的测试用例生成问题,故与同类型研究R E S T l e r和R E S T e
44、 s t进行对比实验,以验证方案的有效性.R E S T e s t将O p e n A P I文档翻译为I D L语言,进而建立测试模型,分别生成正确和错误场景的测试数据.本文方案的输入为原始的O p e n A P I文档,无须对文档进行进一步处理.R E S T l e r通过分析操作间的生产者消费者关系,迭代构造请求序列,从响应信息中学习无效的操作组合来生成操作序列.本文方案使用O D G模型,根据到目前为止已选择的操作集合,动态地计算下一个要测试的操作.由于输入度量覆盖仅与生成的测试用例有关,所有方案均能在限定时间内达到完全覆盖,因此实验时仅统计输出度量覆盖.在各方案运行 h后,统计
45、个项目上的状态码、状态码类别以及响应资源类型覆盖,结果如表所列.表不同方法在各项目上的输出度量覆盖T a b l eO u t p u tm e t r i cc o v e r a g eo fd i f f e r e n tm e t h o d so ne a c hp r o j e c t(单位:)项目状态码类别覆盖R E S T l e rR E S T e s t本文方法状态码覆盖R E S T l e rR E S T e s t本文方法响应资源类型覆盖R E S T l e rR E S T e s t本文方法P e t s t o r e R e s t n e w s
46、C a t w a t c h C y c l o t r o n 刘盈盈,等:基于依赖模型的R E S T接口测试用例生成方法研究从表可知,本文方案所生成的测试用例输出度量覆盖能力优于R E S T l e r,接近于R E S T e s t.由于R E S T e s t在生成测试用例时考虑了两种场景,因此更容易获得不同类型的响应,故覆盖能力最佳.R E S T l e r主要使用静态设置的数据字典以及文档提供的样例输入来生成参数,相比之下,所触发的响应类型比 较有 限.而 本文 使用 动态 响应 字 典来 记 录运行时信息,在参 数 赋值 阶段 能 够进 行数 据复 用,因 此可以充分
47、利用前序信息来提高输出覆盖率.另外,当字典中不存在可复用数据 时,本 文方 案 使用 随机 方法 生成 数 据,这类数据更 容 易 导 致 接 口 返 回 错 误 类 型 的 状 态 码.与R E S T l e r相比,在 状态 码类 别覆盖、状态码覆盖和响应资源类型的覆盖上,本文方案分别高出了 ,以及.为了评估几种方案所生成测试用例的检错能力,统计测试完成后所收到的各类型状态码的占比,结果如图所示.同时,由于各方案在相同时间内生成的测试用例数量存在较大差异,因此,在图中对各方案触发的 X X状态码的数量进行了标注(括号内数值).(a)P e t s t o r e(b)R e s t n
48、e w s(c)C a t w a t c h(d)C y c l o t r o n图不同方案在不同项目上的响应状态码分布情况F i g D i s t r i b u t i o no f r e s p o n s es t a t u sc o d e s f o rd i f f e r e n tp r o g r a m so nd i f f e r e n tp r o j e c t s从 X X状态码的占比可以看出,除了在C a t w a t c h项目上,R E S T e s t方案表现最优,在其余项目上,本文方案均优于R E S T l e r和R E S T e
49、 s t.其中,在C y c l o t r o n项目上,本文方案的检错效果最佳.通过分析发现,由于C y c l o t r o n项目中操作数量和参数数量较多,因此包含了较多的操作间依赖与参数间依赖关系;而C a t w a t c h中只包含了个查询操作,各操作间不存在依赖关系,因此擅长对单个操作进行测试的R E S T e s t的效果较好.同时,从括号内标注的 X X状态码的数量对比中可以看出,在相同时间内,本文方案生成的测试用例在各项目上触发的异常响应状态码数量最多,同样证明了本文方案的检错能力更佳.可行性实验表明,本文方案生成的测试用例能够检测出R E S T接口中已知的缺陷,
50、达到较高的O p e n A P I文档覆盖率,具有实际业务意义.对比实验表明,在接口内访问点数量和操作数量较多的情况下,可能包含了大量操作间依赖与参数间依赖关系,本文方案由于综合考虑了两种依赖关系,因此无论是在O p e n A P I文档的覆盖能力上,还是通过异常响应状态码检测接口错误的能力上,与现有流行方案相比都有较好的表现.综上所述,在接口内包含了较多访问点与操作的应用中,本文方案能够充分利用依赖关系和响应信息,生成具有实际业务意义的操作序列,提高接口覆盖率与检错率.结束语针对如何生成具有实际业务意义的R E S T接口测试用例,提出了一种基于依赖模型的R E S T接口用例生成方法.