背景
最近在进行压力测试的时候,需要在发送请求的时候生成签名,因为现在的REST api大多会传sign(签名)字段,各接口对sign签名的内容、方式可能不一样,但一般模式都是从接口的入参中选择部分内容组成一个字符串,然后再拼接一个 secretKey 或 appKey (像秘钥一样,值固定) ,最后对这个拼接起来的字符串进行MD5的运算或者其他自定义的算法,将结果赋值给sign。完整规范的接口文档都会有sign的算法描述。因此,编写了本篇文章记录以下。
解决步骤
(1)确认签名算法。
(2)如果测试中没有什么特别要求,尽量保持接口数据参数不变动,但是一般来说会加入一个时间参数(根据当前时间生成),因此签名也会相应的变化。
(3)编写好对应的算法生成接口,也可以让开发小伙帮帮你打包弄好。
(4)将JAR包引入到Jmeter。
(5)编写对应的Beanshell Processor 中代码,并将动态数据放入Jmeter 运行参数中。
(6)使用占位符使用参数。
注意 :放入vars中的数据 一定要转成字符串,不然会不生效。
例子
根据签名算法,编写对应的接口
因为自己的项目签名比较复杂,所以就重新写了一个简单的签名方式,可以根据自己项目调整,可以是JSON字符串等其他都OK
/*** MD5生成签名*/public String genMD5(String id, long amount, Date date) {String content = "id=%s&amount=%s&date=%s";content = String.format(content,id,amount,date);return md5(content);}public static String md5(String source) {String des = "";try {MessageDigest md = MessageDigest.getInstance("MD5");byte[] result = md.digest(source.getBytes());StringBuilder buf = new StringBuilder();for (int i = 0; i < result.length; i++) {byte b = result[i];buf.append(String.format("%02X", b));}des = buf.toString().toLowerCase();} catch (Exception e) {e.printStackTrace();throw new RuntimeException("md5 failure");}return des;}
引入自己的JAR
因为自己的工具对于Jmeter来说是三方插件,所以需要打包并加入到Jmeter中。
方式一:将打包放入到 apache-jmeter-5.1\lib\ext 中间中,注意需要先关闭,放入后重新打开Jmeter,否则不会生效。
方式二:点击 TestPlan 最下方 Browse引入包就OK。
添加一个BeanShell preProcessor
编写beanShell preProcessor
语法和Java基本一致,注意一些细节就OK
import com.hopeEdu.sign.utils.Body;
import java.util.*;Body body = Body.geneCreateOrderBodyInfo();
String id = "9527";
int amount = 100;
Date date = new Date();
String sign = body.genMD5(id,amount,date);
log.info("--------sign签名----------");
log.info("sign : " +sign);vars.put("id",id);
//注意要转成字符串,否则会报错或者不生效
vars.put("amount",String.valueOf(amount));
vars.put("date",date.toString());
vars.put("sign",sign);
参数使用
在自己的Body体里面将参数使用占位符引用
运行查看效果
基本就满足大部分的需求了。
那么最后我们在往前推一点,那么beanShell中 如何获取 body 参数呢,并根据需要动态修改并生成新的Body data给Request使用呢?
获取Body 参数可以参考: Jmeter 之BeanShell 获取 header 以及 body
如何动态修改Body data 将后续更新。