jmeter --> 后置处理器 --> BeanShell后置处理程序

BeanShell 脚本语言------ 它是一种基于 Java 语法的轻量级脚本语言,核心特点是「完全兼容 Java 基础语法」,同时支持脚本语言的动态特性,无需编译即可执行,非常适合快速编写自定义逻辑。

BeanShell脚本可直接调用JMeter内置变量和Java 类库,实现灵活的业务逻辑。


常用内置变量

  • prev:获取当前取样器的响应信息(最常用),例如:
    --- prev.getResponseDataAsString():获取响应体字符串;
    --- prev.getResponseCode():获取响应状态码;
    --- prev.getURL():获取请求 URL;
  • vars:操作 JMeter 局部变量(仅当前线程组有效),例如:
    --- vars.put("key", "value"):设置局部变量;
    --- vars.get("key"):获取局部变量;
  • props:操作JMeter 全局变量(所有线程组共享),
    --- 用法同vars(如 props.put("globalKey", "value"));
  • log:输出日志到 JMeter 控制台 / 日志文件,例如:
    --- log.info("响应数据:" + prev.getResponseDataAsString());

1. 页面解析

java 复制代码
== 暂时一下beanshell语法的书写。
== 下面是两种将时间打印到日志的方法。

// 将含毫秒的时间戳打印到日志中
// 1. 获取毫秒级是时间戳(long类型)
long timeSampMs = System.currentTimeMillis();
// 2. 转为String,存为JMeter变量(变量名自定义)
vars.put("timeSampMs",String.valueOf(timeSampMs));
// 3. 将变量打印到日志;
long.info("当前毫秒级时间戳:"+vars.get("timeSampMs"))


// 将获取的格式化时间戳("YYYY-MM-dd HH:MM:ss")打印到日志中
// 1. 导入时间格式化类(必须加,否则报错)
import	java.text.SimpleDateFormat;
import	java.util.Date;
// 2. 定义时间格式(可自定义)
SimpleDateFormat adf = new SimpleDateFormat("YYYY-MM-dd HH:MM:ss")
// 3. 获取当前时间并格式化,存为Jmeter变量(变量名自定义)
String timeStampFormat = sdf.format(new Date()); 
vars.put("timeStampFormat ",timeStampFormat);
// 4. 将格式化时间打印到日志;
long.info("当前毫秒级时间戳:"+vars.get("timeSampMs"))

(1)重置解释器

控制 BeanShell 解释器的生命周期,即每次执行脚本时是否重置解释器实例,直接影响脚本执行效率和变量状态;

配置值 作用 执行效率 变量状态 适用场景
false(默认) 不重置解释器,复用同一个解释器实例 高(脚本仅编译一次,后续直接执行) 解释器中的全局变量(如脚本中定义的静态变量、类变量)会保留上次执行的状态 1. 脚本逻辑固定,无全局变量污染风险; 2. 高并发 / 大量取样器场景(追求性能); 3. 多次执行脚本需复用变量状态(如累计计数)
true 每次执行脚本前,销毁旧解释器并创建新实例 低(每次执行都需重新编译脚本、初始化解释器) 解释器中的全局变量完全重置(无残留状态) 1. 脚本中定义了全局变量 / 静态变量(避免上次执行的变量影响本次结果); 2. 脚本逻辑频繁修改(需确保执行最新脚本); 3. 避免不同取样器执行时的状态污染(如多线程下全局变量冲突)

(2) 参数 向BeanShell脚本传递外部动态值

脚本通过 args 数组 读取参数(下标从 0 开始,args[0] 对应第一个参数,args[1] 对应第二个,以此类推);

  • 用法:参数之间用空格分隔,例如输入 param1 param2 param3;
  • 脚本中获取:
    String param1 = args[0];(基本获取,获取第一个参数,转为字符串),
    int param2 = Integer.parseInt(args[1]); (类型转换,参数默认是字符串,需手动转为数字 / 布尔等类型),
    int paramCount = args.length;(参数长度,获取传递的参数总数,避免数组越界)
java 复制代码
/* 实操示例
		步骤1. 在【参数】输入框中输入:name(或 age,后续可直接修改参数切换字段)
		步骤2:编写脚本	
*/
// 1. 获取响应体字符串
String response = prev.getResponseDataAsString();
// 2. 获取参数(第一个参数是要提取的字段名)
String targetField = args[0]; // args[0] = "name"(从参数传入)
// 3. 解析响应体,提取指定字段(简化 JSON 解析,实际可结合 fastjson)
String fieldValue = "";
if (response.contains("\"" + targetField + "\":")) {
    fieldValue = response.split("\"" + targetField + "\":\"")[1].split("\"")[0];
};
// 4. 设置局部变量,存储结果到 JMeter 变量
vars.put("extractedValue", fieldValue);
// 5. 日志输出
log.info("提取字段【" + targetField + "】的值:" + fieldValue);

/*
		步骤 3:灵活切换场景
		想提取 "age":直接修改参数为 age(无需改脚本);
		想提取 "city":参数改为 city 即可
*/

(3) 文件名 加载外部 BeanShell 脚本文件(.bsh 或 .txt 格式)

通过加载 BeanShell 脚本文件替代在 JMeter 界面的 "脚本编辑区" 写代码。
文件格式:后缀为 .bsh(BeanShell 原生后缀)或 .txt(文本格式也支持);
文件路径:填写脚本文件的绝对路径或相对路径;
脚本内容:与 JMeter 界面 "脚本编辑区" 的代码完全一致,可直接使用 prev、vars、log 等内置变量;

相关推荐
卖个几把萌2 天前
【02】JMeter登录保存cookie用于后面的接口
测试工具·jmeter
测试老哥2 天前
Jmeter吞吐量控制器详解
自动化测试·软件测试·python·测试工具·jmeter·测试用例·压力测试
lllsure4 天前
【快速入门】JMeter
jmeter
天才测试猿5 天前
Jmeter基础知识详解
自动化测试·软件测试·测试工具·jmeter·测试用例·接口测试·性能测试
islandzzzz6 天前
使用JMeter进行API性能压测(执行篇)
jmeter
张永清-老清6 天前
每周读书与学习->JMeter主要元件详细介绍(三)逻辑控制器
测试工具·jmeter·压力测试·性能调优·jmeter性能测试·性能分析·每周读书与学习
xiecoding.cn6 天前
Apache JMeter下载和安装图文教程(附安装包,适合新手)
jmeter·apache jmeter·jmeter下载·jmeter 下载·jmeter下载安装·jmeter官网下载·jmeter工具下载
胜天半月子9 天前
性能测试 | 性能测试工具JMeter直连数据库和逻辑控制器的使用
数据库·测试工具·jmeter·性能测试