首页 > 系统相关 >JMeter进阶使用变量及BeanShell 预处理程序实现复杂调试

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

时间:2023-11-10 21:32:26浏览次数:28  
标签:String 程序实现 myToken BeanShell sb inputText import 进阶

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 预处理程序就可以很方便处理了

下面来实际验证

验证请求

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

成功返回

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

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

定义参数

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

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

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

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

BeanShell预处理程序

JMeter进阶使用变量及BeanShell 预处理程序实现复杂调试_压力测试_05

处理程序

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 后置处理程序

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


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目录中

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

显示调试日志

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

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

这里来验证

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

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

添加HTTP请求2

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

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

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

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

标签:String,程序实现,myToken,BeanShell,sb,inputText,import,进阶
From: https://blog.51cto.com/u_12668715/8308761

相关文章

  • MySQL数据库进阶实战:优化性能、提高安全性和实现高可用性
    当涉及到MySQL数据库的进阶实战时,有许多方面需要考虑,包括性能优化、安全性、高可用性和复杂查询等。以下是一个关于MySQL数据库进阶实战的文章大纲,您可以根据需要进行扩展和详细说明。MySQL数据库进阶实战:优化性能、提高安全性和实现高可用性引言MySQL是一款广泛使用的开源关系型数......
  • podman 容器管理 docker替代,进阶版本?
    简介Docker的一个缺点是它有一个中央守护进程,它以root用户的身份运行,这对安全有影响。但这正是Podman的用武之地。padman完全兼容docker命令和镜像。Podman是一个无守护进程容器引擎,用于开发、管理和在你的Linux系统上以root或无root模式运行OCI容器。安装安......
  • 前端开发进阶:前端开发中如何高效渲染大数据量?
    在日常工作中,有时会遇到一次性往页面中插入大量数据的场景,在数栈的离线开发(以下简称离线)产品中,就有类似的场景。本文将通过分享一个实际场景中的前端开发思路,介绍当遇到大量数据时,如何实现高效的数据渲染,以达到提升页面性能和用户体验的目的。渲染大数据量时遇到的问题在离线的数据......
  • 【python进阶】14大模块200页知识体系md笔记,第5篇:python下的linux命令使用
    本文从14大模块展示了python高级用的应用。分别有Linux命令,多任务编程、网络编程、Http协议和静态Web编程、html+css、JavaScript、jQuery、MySql数据库的各种用法、python的闭包和装饰器、mini-web框架、正则表达式等相关文章的详细讲述。全套Python笔记直接地址:请移步这里共......
  • JavaScript进阶
    闭包闭包(closure)是一个函数以及其捆绑的周边环境状态(lexicalenvironment,词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。在JavaScript中,闭包会随着函数的创建而被同时创建。<body><script>//闭包:内层函数+外层函数变量/......
  • Go Web开发进阶项目实战-Go语言实战课程体系,企业项目开发经验与技巧
    书接上回,上次我们搭建好了项目入口文件,同时配置了路由体系,接着就可以配置项目的模板了,这里我们采用Iris内置的模板引擎,事实上,采用模板引擎并不意味着前后端耦合,模板中的数据保持其独立性即可,也就是说模板的数据操作交互方式采用http接口请求的形式,Iris并不参与模板逻辑,只返回Jso......
  • docke compose /docker 进阶
    dockercompose启动和关闭stopstartup-ddowndocker-composedown和docker-composestop都是用于停止DockerCompose中定义的服务的命令,但它们之间有一些重要的区别。docker-composestop:docker-composestop命令会停止DockerCompose文件中定义的所有服务,......
  • 【Flask框架】全知识点笔记4章60页MD文档,今日篇:flask视图和路由进阶
    本文的主要内容:flask视图&路由、虚拟环境安装、路由各种定义、状态保持、cookie、session、模板基本使用、过滤器&自定义过滤器、模板代码复用:宏、继承/包含、模板中特有变量和函数、Flask-WTF表单、CSRF、数据库操作、ORM、Flask-SQLAlchemy、增删改查操作、案例、蓝图、单元测......
  • 我的世界1.20.1模组开发---7.添加物品(进阶版)
    介绍  前面我们已经介绍过了如何添加我们mod的物品,单那些物品都只是一些用于合成的物品。例如我们的各种矿石、建筑方块等,这些物品只能用于合成或者装饰,这次我们就来添加一个具有实际功能的物品,比如一些模组里的魔法杖或者武器之类的。这些物品通过按下指定的按键会有其他的功......
  • Maven入门和进阶笔记
    一、Maven简介和快速入门1.1Maven介绍Maven是一款为Java项目构建管理、依赖管理的工具(软件),使用Maven可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。Maven就是一个软件,掌握软件安装、配置、以及基本功能(项目构建、依赖管理)使用就是本课程的主要目标!1.2......