多测师是一家拥有先进的教学理念,强大的师资团队,业内好评甚多的接口自动化测试培训机构!

17727591462

联系电话

您现在所在位置:接口自动化测试培训 > 新闻资讯

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

更新时间:2022-07-28 09:21:31 作者:多测师 浏览:21

  背景

  在实现接口自动化测试的时候,无论如何设计,都会走上数据驱动之路,最终归结于参数化/参数关联的问题上来,做这类自动化的最终问题分两类:一类技术类、一类业务类,何为技术、业务呢?

  业务流程,即请求接口的顺序、数据流向,在框架中体现于测试用例的设计,若是单接口只关注入参,若是单接口则需关注接口之间的业务关联,即请求接口有先来后到,否则数据就无法对应上!

  技术呢,就是去实现业务场景测试中所需要的处理过程,如组装接口请求、参数关联、日志系统等等,最终不得不提一句的是高内聚低耦合:保证单/多接口之间减少关联性,发挥一个函数的最大功效。

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关于如何设计和替换接口请求参数的过程。

  当然这只是冰山一角,更多是需要发现、善于思考才能合理有效的解决问题。

  以上内容为大家介绍了jmeter接口自动化测试框架通用参数替换方案,本文由多测师亲自撰写,希望对大家有所帮助。了解更多接口自动化测试相关知识:https://www.aichudan.com/xwzx/

联系电话

17727591462

返回顶部