粉丝提问:postman代码转换成beanshell片段

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

故事起因

在C站,粉丝购买了题主的专栏,题主承诺有问题都会用心去解决,这不,经常会有粉丝找过来了,开局一张图说:咱在postman前置处理的代码怎么转换成jmeter认识的代码?题主看了看截图,内心OS:这不是很简单?但是粉丝的第一句话就是:第一句代码都被整懵了!所以结果是粉丝丝毫没在意题主的苦口婆心:拜托先将题主的专栏文章都一一读完吧,兴许有收获呢?基础不牢地动山摇,这不是危言耸听!

image

开始试验

声明:JMeter能支持写代码的就是beanshell元件,是的,任何它的元件。

image

过程分析

粉丝说很难的原因是因为没有java代码基础和对jmeter元件的数量使用;如果是关于JMeter不支持的功能,首先想到的就是手写代码带包成插件或者是beanshell编程,题主推荐第一种方式,因为它比较通用些。

  • postman截图的第一句意思:获取13位时间戳;
  • 第二句以及后面频繁出现的var,它是定义变量的关键字;
  • console.log类似JMeter的log.info()都是日志输出;
  • 对于方法:Math、SHA256等都是方法的引用,如果JMeter不支持就需要手写代码;
  • 巧了,JMeter偏偏提供了对应的功能:函数助手了解一下

image

  • 后面的那么多set都是设置全局变量。
# 关于时间函数
${__time(yyyy-mm-dd hh:mm:ss,)} 
${__time(yyyy-mm-dd,)}
# 13位时间戳
${__time(,)}
# 10位时间戳
${__time(/1000,)}  

# 规则字符串
${__UUID}

# 加密算法,它支持MD5、SHA-256;具体参见JMETER功能函数助手介绍
${__digest(SHA-256,string,,true,)}
复制代码

测试计划实现

通过JMeter创建测试计划来实践,思路:由beanshell前置处理器代码处理参数,然后赋值给HTTP sampler,也可以在下一个接口请求直接使用;

  • beanshell前置处理接口入参
    image
  • 入参使用函数引用加密的参数
    image
  • 测试函数功能
    image
  • 校验测试结果
    image

代码片段

// 时间戳字符串
String timeStamp = "${__time(,)}";
// 控制台输出
log.info(timeStamp);
// 定义或者获取token,或获取变量
String token = "aslfjlajlskfslf";
String key = "123456";
// 赋值,在下一个请求:${key}引用
vars.put("key","value_abc");

// 这里关于随机字符串的算法,可能需要自己定义;Jmeter提供了uuid;结构与你的案例符合
String randStr = "${__UUID}";

String sigStr = timeStamp + token + key + timeStamp;
vars.put("sigStr",sigStr);

// 签名算法,在jmeter支持md5,sha256可能需要自己写好;恰恰又有函数支持;如果在同一个脚本中可能有问题,但是在外面作为入参或者引用是没问题的
// String signature = "${__digest(SHA-256,vars.get("sigStr"),,true,)}";
// log.info(signature);
复制代码

小结

经过上面的试验,postman的代码过程都在JMeter实现了,所以对于JMeter工具的使用必须要掌握,在不能满足功能需求的时候,才考虑二次开发,就如加密算法,如果不支持就手写。在上面的引用中,如{__digest()}函数,对于需要加密的字符串时是活的,每次请求都会发生改变,所以如何让它能动态获取才是关键,建议了解:{__V()}、{__eval()}、{__beanshell()}等函数的用途。

猜你喜欢

转载自juejin.im/post/7079792531411730463