jmeter 用beanShell preProcessor 生成sign并使用

背景

 最近在进行压力测试的时候,需要在发送请求的时候生成签名,因为现在的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 将后续更新。

猜你喜欢

转载自blog.csdn.net/wangxuelei036/article/details/107404372