设计jmeter接口自动化测试框架通用参数替换方案

发表于:2021-9-06 09:42  作者:佚名   来源:掘金

字体: | 上一篇 | 下一篇 |我要投稿 | 推荐标签: 性能测试工具 Jmeter

  背景
  在实现接口自动化测试的时候,无论如何设计,都会走上数据驱动之路,最终归结于参数化/参数关联的问题上来,做这类自动化的最终问题分两类:一类技术类、一类业务类,何为技术、业务呢?
  业务流程,即请求接口的顺序、数据流向,在框架中体现于测试用例的设计,若是单接口只关注入参,若是单接口则需关注接口之间的业务关联,即请求接口有先来后到,否则数据就无法对应上!
  技术呢,就是去实现业务场景测试中所需要的处理过程,如组装接口请求、参数关联、日志系统等等,最终不得不提一句的是高内聚低耦合:保证单/多接口之间减少关联性,发挥一个函数的最大功效。
  设计
  在做自动化测试框架设计的时候,往往我们会把一些hard code的数据进行参数化,动态从接口响应或通过函数实现替换的过程再发起请求。譬如下图:
  从请求地址来看,这是一个单接口的测试用例设计,登录接口,分析一下,其实它不一定需要参数化设计,为啥,因为它只有一种成功的期望结果,唯一正确的就是它使用正确的手机号登录;那么其他错误的参数请求,只是它为什么会失败?就是我们给的参数不正确,那么只需要覆盖几种错误参数的请求即可。
  那么在示例图中,如果是一个常规的业务场景:用户注册--登录--实名--绑卡--交易--查看订单--余额--退出;那么可能出现的情况是:登录的账号需是注册的账号,实名绑卡的手机号也许是注册的手机号等等; 还有交易之后的订单号是查看订单的请求参数之一,所有在线操作的接口都需要token等等,这些接口请求就是环环相扣,每一个操作直接都存在依赖关系;这时需要对入参进行参数化,实现可替代的通用方法。
  实现
  分享一篇JMeter关于beanshell批量处理参数的java脚本:
  import java.util.regex.Matcher;
  import java.util.regex.Pattern;
  //获取变量的值,使用一个变量接收,但此时变量接收后并不能直接作为参数使用
  //String mobile=vars.get("phone");
  //String empty=vars.get("empty");
  //String passwd=vars.get("passwd");
  //json字符串,此处是举例,应该是csv用例中的params参数;可以是从csv或其他变量元件获取
  String content = vars.get("params");
  //编码时字符串双引号需要转义,使用变量参数时,则不需要
  //String params="{\"appVersion\":\"V10.3\",\"channel\":0,\"deviceName\":\"iOS\",\"deviceType\":\"1\",\"deviceid\":\"123456\",\"loginType\":0,\"mobile\":\"#mobile#\",\"password\":\"#passwd#\",\"pushToken\":\"string\",\"systemVersion\":\"1\",\"verifyCode\":\"1\",\"zone\":\"86\"}";
  log.info("get参数类型:"+ content.getClass());
  log.info("打印原参数:"+content);
  //将接收变量的值赋给一个变量,此时的变量是可以被引用的${param},与vars.get()相互使用;
  //vars.put("empty",empty);
  //vars.put("passwd",passwd);
  //vars.put("mobile",mobile);
  //正则表达式
  String pattern="#(.+?)#";
  //正则表达式匹配编译对象
  Pattern pt = Pattern.compile(pattern);
  Matcher m = pt.matcher(content);
  //新的字符类型:当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
  StringBuffer newContent = new StringBuffer();
  //注意此处就不使用if条件判断,
  while (m.find()) {
  //上面条件满足是否有匹配内容,if判断是否有key
  if (m.group().contains(m.group(1))) {
  log.info("找到参数:"+vars.get(m.group(1)));
  //这个追加替换方法,修改了原来的字符串,又不会重新创建字符串 
  m.appendReplacement(newContent, vars.get(m.group(1))); 
  log.info("替换之后:"+newContent);
  }
  }
  m.appendTail(newContent);
  log.info("替换后的参数:"+newContent.toString());
  //将正则匹配替换换后的参数赋值给新的变量
  vars.put("newParams",newContent.toString());
  // 最后将${newParams}传入sampler取样器
  原理
  在设计测试用例时,对于需要进行参数替换的请求参数设计有特点的字符,可以通过代码手段找到该需要替换的字段,
  从而进行交换重新赋值然后使用;但是有个前提是在替换之前必先获取,然后再赋值替换;
  最后才是得到替换后的参数,这时发起请求才能得到正确的响应。这里就是jmeter关于如何设计和替换接口请求参数的过程。
  当然这只是冰山一角,更多是需要发现、善于思考才能合理有效的解决问题。
  总结
  其实同样的问题,不论是工具还是代码实现,都可以思路复用;一样的道理无关于编程语言。
  提示一下:在本篇用到设计中,需要有前后置处理协同合作。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理

评 论

论坛新帖



建议使用IE 6.0以上浏览器,800×600以上分辨率,法律顾问:上海信义律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2021, 沪ICP备05003035号
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪公网安备 31010102002173号

51Testing官方微信

51Testing官方微博

扫一扫 测试知识全知道