背景
业务流程,即请求接口的顺序、数据流向,在框架中体现于测试用例的设计,若是单接口只关注入参,若是单接口则需关注接口之间的业务关联,即请求接口有先来后到,否则数据就无法对应上!
技术呢,就是去实现业务场景测试中所需要的处理过程,如组装接口请求、参数关联、日志系统等等,最终不得不提一句的是高内聚低耦合:保证单/多接口之间减少关联性,发挥一个函数的最大功效。
设计
在做自动化测试框架设计的时候,往往我们会把一些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),我们将立即处理