10(十)Jmeter使用JSR233计算签名

本次是接口中,需要计算一个sign,需要前置使用bodydata和一些特定参数,进行HmacSHA256方法进行计算

没找到直接获取请求body的方法,就把请求body直接复制到脚本中了,这样需要维护两个地方,后续找机会再研究。

以下是postman中Pre-request Script的代码

python 复制代码
pm.environment.set("timestamp", new Date().getTime());

var param = replaceVar(request.url.split("?")[1]);
// body
var body = replaceVar(request.data);

// 计算签名
console.log(param + body);
console.log(pm.environment.get("appSecret"));
var signBase64 = CryptoJS.HmacSHA256(param + body, pm.environment.get("appSecret")).toString(CryptoJS.enc.Base64);
console.log(signBase64);
pm.environment.set("Signature", "NeuVision " + signBase64);

// 替换字符串中包含的环境变量
function replaceVar(tempStr) {
    var varArray = [];
    var bodyArr = tempStr.split("{{");
    for (var i = 0; i < bodyArr.length; i++) {
        if(bodyArr[i].indexOf("}}") != -1) {
            varArray.push(bodyArr[i].split("}}")[0]);
        }
    }
    for(var varname of varArray) {
        tempStr = tempStr.replace("{{" + varname + "}}", pm.environment.get(varname));
    }
    return tempStr;
}

然后Jmeter中使用JSR223前置处理器,进行计算

首先添加JSR223预处理器

代码如下:

python 复制代码
load('D:/apache-jmeter-5.4.1/bin/crypto-js-4.0.0/crypto-js.js');
load('D:/apache-jmeter-5.4.1/bin/JSON-js-master/json2.js');
//通过vars.get()获取外部Jmeter变量
appId = vars.get("appId");
appSecret= vars.get("appSecret");
uid= vars.get("uid");
rid= vars.get("rid");
secret= vars.get("secret");
timestamp= vars.get("timestamp");
//var 给变量再赋值一次,可以不做。
var param = appId;
var appSecret = appSecret;
//创建json对象
var bo = {
 "uid":uid,
 "rid":rid,
 "appId":appId,
 "secret":secret,
 "ctimestamp":timestamp
};
//将json对象转换成字符串
var body = JSON.stringify(bo);
//log.info("appId&body:"+ param + body);
// 计算签名
var signBase64 = CryptoJS.HmacSHA256( param + body  ,(appSecret)).toString(CryptoJS.enc.Base64);
//log.info("base64签名:"+signBase64);
//计算好的前面推给外部使用
vars.put("Signature", "NeuVision " + signBase64);

计算签名时,需要用到CryptoJS这个方法,需要用到外部包导入。

链接:https://pan.baidu.com/s/1tjSkgfmp4KoAGautZYJKZg

提取码:cavm

然后JSR223设置如下

调试时,遇到一个问题,压测试,5个线程,循环5次。其实rid无论是外部读取,还是随机变量生成,还是脚本内自己生成put给外部使用。计算签名在JSR223中直接运行脚本,只能读取第一次5个线程时的5个rid,第二次循环时,其他接口的rid已经使用第二轮随机生成的参数了,但是脚本中还是第一轮。

如:线程5个,循环3次,请求中rid{1,2,3,4,5,6,7,8......24,25},JSR223脚本rid{1,2,3,4,5,1,2,3,4,5,1,......4,5}。这样导致验签失败。

所以使用图中方法,将脚本保存至js文件中,然后JSR223直接调用,就解决该问题。具体原因未知。反正看不懂底层代码。

JMeter中JSR223 PreProcessor常用内置函数

(1)log:用来记录日志文件,写入到jmeber.log文件,使用方法:

log.info("Test ABC!");

(2)vars:操作jmeter变量,提供读取/写入访问变量的方法,常用方法:

vars.get(String key);//从jmeter中获得变量值;

vars.put(String key,String value);//数据存到jmeter变量中;

var a = b;创建变量a,并赋值

下面记录一些问题:

JSR233处理器loadJS文件失败,讲文件导入至,lib/ext中

https://repo1.maven.org/maven2/kg/apc/jmeter-plugins-manager/1.6/jmeter-plugins-manager-1.6.jar

相关推荐
川石课堂软件测试3 天前
自动化测试常见的异常处理
python·jmeter·mysql·docker·容器·单元测试·grafana
wuhuhuan3 天前
JMeter 性能测试教程
jmeter
行者-全栈开发4 天前
JMeter + InfluxDB + Grafana:搭建生产级压测实时监控与告警体系
jmeter·grafana·时序数据库·influxdb·实时监控·backendlistener·告警性能测试
wuhuhuan5 天前
【JMeter 学习打卡 Day 7】从会用到会用对,完成一次完整压测
学习·jmeter
行者-全栈开发7 天前
JMeter 自定义 Sampler 开发:从零写 TCP 私有协议压测插件
jmeter·tcp协议·源码解析·插件开发·gradle构建·自定义sampler·abstractsampler
wuhuhuan7 天前
【JMeter 学习打卡 Day 5】控制流程和节奏的利器
学习·jmeter
wuhuhuan8 天前
【JMeter 学习打卡 Day 4】多用户登录 + 动态 token 关联
学习·jmeter
wuhuhuan8 天前
jmeter高级用法-ForEach控制器和BeanShell断言
jmeter
weixin_4407305012 天前
手工接口测试使用总结
jmeter·接口测试
Amir_zy12 天前
JMeter吞吐量与并发数:要求TPS达到200,并发至少是多少?
jmeter