摘要:解决链路之间的参数传递问题可以简化为解决接口之间的参数传递问题。当然,这个问题的解决方法也不少。综上所述,自动化用例的维护和开发成本主要集中在接口间参数传递的维护上。
介绍
做过接口自动化测试的同学肯定都很熟悉,在全链路测试的过程中,很多业务场景不是由单个接口实现的,而是由很多接口组成的一个链路实现的。比如你在淘宝上购物。
与单接口测试不同的是,这种链路型接口自动测试,由于接口之间的参数依赖关系,往往无法将链路中的接口参数写死,而是依赖于“上游”响应中的一个字段值,因此需要提取出来动态传输到下一个接口,如下图所示。
解决链路之间的参数传递问题可以简化为解决接口之间的参数传递问题。当然我上图的例子比较简单,下游对上游的依赖是一对一的。在实际的业务场景中,更多的是多对一的场景,即下游依赖于上游多个接口的返回结果。
当然,这个问题的解决方法也不少。以JMeter为例,它通过后处理器提供了多种参数提取方法。
解决方法是正则化、JSON Extracor等提取的结果。被用作变量,并且值被动态地转移到下游(变量)以供使用。
当然,这个解决方案对于JMeter工具来说是一个很好的解决方案,而且也是通用的。即使你自己开发接口测试框架,也可以使用这个解决方案(其实我在前雇主参与接口测试框架的研发时就借鉴了这个思路。开发了一个类似于JMeter规则提取器的规则提取工具包。reference toolkit允许您输入要提取的字段键,以匹配其字段值。如果不能提取,则返回默认值。如果响应正文中的一个键有多个值,它将返回最后一个匹配的值。下游接口使用Java replace()方法替换请求体中的${xx}。)。
如果只能用追击,这个方案也行。但这种方案的缺点是接口测试用例的开发效率比较低,增加了编写接口测试用例的成本。这也是我当时遇到的问题。编写自动化测试用例的很大一部分时间花在了参数提取和接口之间的调试上。此外,这种方案还会增加维护成本,导致用例的“稳定性”较低。因为如果上游接口的响应体结构发生变化,可能会影响提取结果,下游接口请求体中的${xx}也需要手动维护。综上所述,自动化用例的维护和开发成本主要集中在接口间参数传递的维护上。
有没有更好的解决办法?
试想一下,如果我们可以把整个链路可能用到的字段集合作为一个池,从上游接口的响应结果中提取key -值,并把它扔到这个池中。下游接口请求是模板化的,用${xxx}代表要替换的变量,用模板引擎(比如Java的velocity/FreeMarker)把${xxx}替换为“池”中已有的值。实现图如下。
这样做
以Java语言实现为例,写两个方法A和B,B依赖于方法A的返回结果。
我们只需要开发上下文类,模板组装工具,模拟场景代码。
导入com . Alibaba . fast JSON . JSON object;导入org . Apache . commons . bean utils . bean utils;导入Java . util . map;public class Client { public static JSON object log in(){ JSON object result = new JSON object();result.put("token "," xsjkjdskdjsksjfksjfksjk返回结果;} // pay接口,依赖于登录接口公共静态JSON对象Pay (string request) {JSON对象结果= new JSON对象();//简单的写了if(request . contains(" xsjkjdskdysjsksjfksjfksjk "){ result . put(" order "," 122324434335 ");result.put("status "," success ");} else { result.put("status "," fail ");}返回结果;}//场景模拟公共静态void main(string[]args){//首先调用登录接口JSON object log in response = log in();//第一步。将结果写入Context Context = new Context();context . settoken(log in response . getstring(" token "));//创建一个支付接口字符串request = " {/" token/":/"${ token }/" "的请求模板;尝试{//步骤2。使用Apache BeanUtils工具的BeanToMap方法将上下文转换为keyValues Map keyValues = nullkey values = bean utils . describe(context);//第三步。组装模板,在上下文中用值字符串out _ request = velocity utils . parse(request,key values)替换${token}。System.out.println("组装请求模板:"+out _ request);//发起JSON对象Result = Pay (out _ request)进行订单下的支付;//打印接口返回结果System.out.println("打印响应结果:"+result . tostring());} catch(exception e){ system . out . println("异常退出");}}}此方案的优点:
我们只需要关注步骤1(将上游响应结果写入上下文)。下面的组装模板可以写成一样的工具,只需要传入模板+上下文内容,不需要关注其他,可以大大节省自动化用例开发和维护的成本。
当然,这篇文章只是抛砖引玉。如果有其他打算,也希望大家多多摊开来交流。
工具清单:
commons-beanutils
org.apache.velocity
com.alibaba.fastjson
org.projectlombok.lombok
先前的建议
多项目管理实践论坛定于12月11-12日通过云端分享。
经验分享|测试工程师转型测试开发流程
技术要求:多线程,多进程。
测试框架开发实践2:接口自动化测试框架的设计思路
自动化接口测试框架实践1:接口测试概述
我在阿里做测试。
评论前必须登录!
注册