Jmeter BeanShell实现复杂应用场景

JMeter进阶使用变量及BeanShell 预处理程序实现复杂调试。

有一些测试需要做一些预处理程序才能做http请求,在JMeter下可以通过使用参数+BeanShell 预处理程序加工后再发起请求即可。例oauth服务需要通过username,password,client_id,client_secret,grant_type进行请求,这里的密码涉及安全性不能用明文进行传输,需要做预处理

应用提供如下信息:

用户名:username=user

密码:password=888888

盐值:salt=2gjokme8k5p0u3n8ca1n

客户端ID:client_id=test

客户端秘钥:client_secret=16air0bu4l0yjnfkkxfc

授权模式:grant_type=password

发送密码的规则为password=sha(md5(8888882gjokme8k5p0u3n8ca1n))=a43dd2bfc28bbaf137ab5a45d634f44eed06adcf

这里需要先将(密码+盐值)先进行md5,再进行sha才是要发送的最终参数,这里如果只测试一个用户时间,先通过其它程序取得再传入也是很方便,但如果需要做多个用户的测试就非常麻烦了,需要不停的去加工后才能在jmeter里更换,调试起来不方便,如果用参数+BeanShell 预处理程序就可以很方便处理了

下面来实际验证

验证请求

成功返回

 

下面用参数+BeanShell 预处理程序来实现

🎯 定义参数:

如果换个用户,只需修改这里即可

HTTP请求里值用${xxxx}来定义变量参数,来接收定义的参数或BeanShell 预处理程序生成的变量,这里${passwordPar} 是BeanShell 预处理程序生成的

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

 🎯 BeanShell预处理程序 

处理程序

import sun.misc.BASE64Encoder;import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException; import java.util.Arrays;import java.util.Map;import java.util.Set;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;    public static String md5AndSha(String inputText)    {        return sha(md5(inputText));    }    public static String md5(String inputText) {        return encrypt(inputText, "md5");    }    public static String sha(String inputText) {        return encrypt(inputText, "sha-1");    }    public static String encrypt(String inputText, String algorithmName) {        if (inputText == null || "".equals(inputText.trim())) {            throw new IllegalArgumentException("请输入要加密的内容");        }        if (algorithmName == null || "".equals(algorithmName.trim())) {            algorithmName = "md5";        }        String encryptText = null;        try {            MessageDigest m = MessageDigest.getInstance(algorithmName);            m.update(inputText.getBytes("UTF8"));            byte[] s = m.digest();            return hex(s);        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }return encryptText;    }public static String hex(byte[] arr) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < arr.length; ++i) {  sb.append(Integer.toHexString((arr[i] & 0xFF) | 0x100).substring(1, 3)); }  return sb.toString();}public static String MD5(String data) throws Exception {  MessageDigest md = MessageDigest.getInstance("MD5");  byte[] array = md.digest(data.getBytes("UTF-8"));    StringBuilder sb = new StringBuilder();    for (byte item : array) {      sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));    }    return sb.toString().toUpperCase();}public   String generateSignature( Map  data, String key, String signType) throws Exception {       // Set<String> keySet = data.keySet();       Set  keySet = data.keySet();        String[] keyArray = keySet.toArray(new String[keySet.size()]);        Arrays.sort(keyArray);        StringBuilder sb = new StringBuilder();        for (String k : keyArray) {            if (k.equals("sign")) {                continue;            }            if (data.get(k).toString().trim().length() > 0) //为空,则不参与签名                sb.append(k).append("=").append(data.get(k).toString().trim()).append("&");        }        sb.append("key=").append(key);        System.out.println(sb);        if ("MD5".equals(signType)) {            return MD5(sb.toString()).toUpperCase();        }else {            throw new Exception(String.format("Invalid sign_type: %s", signType));        }}

public void getPasswordPar(){      String clientId=vars.get("client_id");  String clientSecret=vars.get("client_secret");  String username=vars.get("username");  String password=vars.get("password");  String salt=vars.get("salt");   String grant_type=vars.get("grant_type");   String passwordPar=md5AndSha(password+salt);     vars.put("passwordPar",passwordPar);   log.info("加密passwordPar begin");           log.info(passwordPar);  log.info("加密passwordPar end");        }
log.info("BeanShell 预处理程序");/* * 获取加密参数passwordPar */getPasswordPar();

当请求取得结果后,也可以用BeanShell 后置处理程序将请求返回做解析加工,取出想要的数据,然后存入变量供下一个请求来处理

🎯 BeanShell 后置处理程序

 

import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;
log.info("BeanShell 后置处理程序");
//取得请求返回结果log.info("请求返回结果 begin");String response = prev.getResponseDataAsString();log.info(response); log.info("请求返回结果 end"); 
JSONObject json=  JSONObject.parseObject(response);String myToken=json.getString("access_token");//将access_token存入变量中vars.put("myToken",myToken);log.info("取得access_token为:"+myToken);

🎯使用第三方库

这里后置处理程序用到fastjson库,记得下载放下JMeter库文件lib目录中

 

显示调试日志 

在BeanShell 后置处理程序,还可以取得返回结果再存入变量中,如vars.put("myToken",myToken);即是将取得的access_token存入变量myToken

这里来验证

定义新一个变量myToken值默认设为myToken,看会不会有变化

🎯 添加HTTP请求2

路径改为/getName?token=${myToken},这里路径中的${myToken}用于接收参数

 

发起请求,查看HTTP请求2的返回结果,myToken确定改变了

 

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值