总结:解决链路间参数传递问题可以简化为解决接口间参数传递问题。 当然,这个问题其实有很多解决方案。 总之,自动化用例的维护和开发成本主要集中在维护接口之间的参数传输。
简介
做过接口自动化测试的同学可能在全链路测试过程中注意到,很多业务场景都是通过单个接口实现的。事实上它是由单个接口实现的。 它由许多接口组成。 链接已实施。 例如,假设您在淘宝上购物。
与单一接口测试不同,这种链接式接口自动化测试需要接口之间的参数存在依赖关系。 通常,链接内的接口输入参数不能进行硬编码,而是取决于“上游”响应中的某些字段值。 因此,我们需要将其提取出来并动态地传递给下一个接口,如下图所示。
解决链接之间的参数传递问题可以简化为解决Masu之间的参数传递问题。 当然,上面给出的例子是比较简单的。 下游和上游依赖关系是一对一的。 现实业务场景中存在更多的多对一场景。 即下游依赖多个上游接口的返回结果。
当然,这个问题的解决方案其实有不少。 以JMeter工具为例,它通过其后处理器提供了各种参数提取方法。
解决方案是将通过正则表达式、JSON Extracor等提取的结果作为变量,动态改变这是关于传递它的价值。 使用下游(变量)。
当然这个解决方案解决方案是 JMeter 工具,这是一个很好的解决方案,而且这个解决方案也是通用的。 即使你开发了自己的接口测试框架(其实我之前工作中帮助开发的接口测试框架解决了接口间参数传递的问题),你仍然可以使用这个方案,基于此开发了一个类似的JMeter。 正则表达式提取工具包允许您输入与字段值匹配的字段键。 如果响应体中某个键有多个值,则返回最后一个匹配的值。 下游接口采用Java。 Replace() 方法替换请求正文中的 ${xx}。
如果您只是寻求易用性,那么这个解决方案就很好。 但这种方案的缺点是接口用例的开发效率比较低,并且编写接口测试用例的成本增加。 这也是我当时面临的一个问题。 大家编写自动化测试用例的大部分时间都花在了接口之间的参数提取和调试上。 此外,该解决方案还会增加维护成本并降低用例的“稳定性”。 这是因为如果上游接口的响应体结构发生变化,可能会影响提取结果,而下游接口的请求体${xx}也需要手动维护。 总之,自动化用例的维护和开发成本主要集中在维护接口之间的参数传输。
有更好的解决方案吗
想象一下。 我可以使用跨链路使用的字段集作为池并从上游响应结果中提取 key-value 吗? 我要去游泳池。 下游接口的请求体是模板化的,使用${xxx}来表示需要替换的变量,使用模板引擎(如Java的Velocity/FreeMarker)将${xxx}替换为“存在的值”在你的泳池里。 ”。 简化的实现图如下。
练习
下面是一个Java示例语言实现,写两个方法A和B。 B取决于方法A的返回结果。
您需要开发的只是上下文类和模板。只需组装工具并模拟您的场景代码即可。
com.alibaba.fastjson.JSONObject 导入;导入 org.apache.commons.beanutils.BeanUtils;导入 java.util.Map;公共类客户端 {public static JSONObject login(){ JSONObject 结果 = new JSONObject(); result.put("token","xsjkjdskdjsksjfksjfksjk"); }// 支付接口依赖于登录接口 public static JSONObject pay(String request){ JSONObject result = new JSONObject();// if (request.contains("xsjkjdskdjsksjfksjfksjk")){ result.put("order " , "122324434335 "); result.put("状态", "成功"); } else { result.put("Status", "Failed"); }返回结果。 } // 场景模拟 public static void main(String[] args) {// 首先调用登录接口 JSONObjectloginResponse = login();// 步骤一、将结果写入上下文 Context context = new Context();// 创建付费接口的请求模板 String request = "{/"token/":/"${token}/"}";try {// 步骤 2. Apache BeanUtils 工具 使用 BeanToMap 方法。 将上下文转换为键值。 keyValues=null; keyValues = BeanUtils.describe(context); // 步骤 3. 组装模板并将 ${token} 替换为上下文中存在键的 valueString。 out_request = VelocityUtils.parse(request , keyValues);// 开始支付订单 JSONObject result = pay(out_request);// 打印接口为result returns 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天上云
经验分享|测试工程师变革测试开发流程
技术基础测试:多线程多进程
接口测试框架开发实践二:接口自动化测试框架设计思路
接口自动化测试框架实践一:接口测试概述
我来了阿里巴巴开始测试
评论前必须登录!
注册