为确保 Groovy、JDK 和 JMeter 三者的版本兼容性,需遵循以下核心原则和步骤:
组件 | 推荐版本范围 | 关键兼容规则 |
---|---|---|
JDK | Java 8/11/17 (LTS) | - JMeter 5.6+ 支持 Java 11/17 |
Groovy | Groovy 3.0.7+ 或 4.0+ | - Groovy 3.x 支持 Java 8-17 - Groovy 4.x 支持 Java 11-21 |
JMeter | JMeter 5.6+ | - JMeter 5.6+ 内置 Groovy 3.0.7 - 若需更高版本,需手动替换 lib 目录的 JAR |
JDK 版本:
java -version
# 输出示例:openjdk 17.0.11
JMeter 版本:
启动 JMeter → 顶部菜单栏显示版本(如 5.6.3
)
或命令行:
jmeter -v
Groovy 版本:
JMeter 内置版本:
查看 JMETER_HOME/lib
目录下的 groovy-*.jar
(如 groovy-3.0.7.jar
)
项目依赖版本(若自定义):
# Maven 项目检查 pom.xml
grep '' pom.xml
# Gradle 项目检查 build.gradle
grep 'org.apache.groovy' build.gradle
JDK: Java 11 或 17
JMeter: 5.6.3
Groovy: 3.0.7(JMeter 内置)
优点: 无需额外配置,稳定性最佳。
JDK: Java 17
JMeter: 5.6.3
Groovy: 4.0.21(手动替换)
替换步骤:
下载 Groovy 4.x JAR:https://groovy.apache.org/download.html
删除 JMETER_HOME/lib/groovy-3.0.7.jar
将 groovy-4.0.21.jar
放入 JMETER_HOME/lib/
重启 JMeter
JDK: Java 21
JMeter: 5.6.3(需手动升级依赖)
Groovy: 4.0.21(必须)
额外操作:
在 JMETER_HOME/bin/jmeter
中设置:
JAVA_HOME=/path/to/jdk-21
步骤 1:编写测试脚本
在 JMeter 中添加 JSR223 PreProcessor,输入以下代码:
log.info("JDK Version: " + System.getProperty("java.version"))
log.info("Groovy Version: " + GroovySystem.version)
步骤 2:运行脚本
查看 JMeter 日志输出,确认版本匹配:
INFO o.a.j.e.StandardJMeterEngine: JDK Version: 17.0.11
INFO o.a.j.e.StandardJMeterEngine: Groovy Version: 4.0.21
Unsupported class file major version
原因:JDK 版本高于 Groovy 支持范围。
解决:
降级 JDK 至兼容版本(如 Java 17)。
或升级 Groovy 到 4.0+。
原因:Groovy JAR 版本冲突。
解决:
删除 lib
目录下所有 groovy-*.jar
,重新放入正确版本。
原因:Groovy 3.0.7 默认解释执行,非编译。
解决:
在 JSR223 组件中选择 Groovy 语言。
勾选 Cache compiled script(缓存编译脚本)。
固定版本:在团队中统一 JDK、JMeter、Groovy 版本。
使用 LTS 版本:优先选择 Java 11/17、JMeter 5.6.x。
隔离环境:使用 Docker 容器化部署:
FROM eclipse-temurin:17-jdk
RUN wget https://dlcdn.apache.org/jmeter/binaries/apache-jmeter-5.6.3.zip && \
unzip apache-jmeter-5.6.3.zip
通过以上方法,可确保 Groovy、JDK 和 JMeter 版本兼容,避免因环境配置导致的脚本执行异常。
操作系统:Windows 10+/Linux/macOS
用户权限:管理员/root权限(用于安装软件)
网络:可访问互联网以下载安装包
下载 JDK 17:
访问 Oracle JDK 17 或 Eclipse Temurin JDK 17
选择 Windows x64 Installer
下载
安装:
双击安装程序,按提示操作
默认安装路径:C:\Program Files\Java\jdk-17.0.x
配置环境变量:
右键 此电脑
→ 属性
→ 高级系统设置
→ 环境变量
新建系统变量:
变量名:JAVA_HOME
变量值:C:\Program Files\Java\jdk-17.0.x
编辑 Path 变量:
添加 %JAVA_HOME%\bin
验证安装:
java -version
下载 JDK 17:
wget https://download.java.net/java/GA/jdk17.0.2/dfd4a8d0985749f896bed50d7138ee7f/8/GPL/openjdk-17.0.2_linux-x64_bin.tar.gz
解压并安装:
sudo tar -xzf openjdk-17.0.2_linux-x64_bin.tar.gz -C /usr/lib/jvm/
配置环境变量:
sudo nano /etc/environment
# 添加以下内容:
JAVA_HOME="/usr/lib/jvm/jdk-17.0.2"
PATH="$PATH:$JAVA_HOME/bin"
# 保存后执行:
source /etc/environment
验证安装:
java -version
Homebrew 安装:
brew install openjdk@17
配置环境变量:
echo 'export PATH="/opt/homebrew/opt/openjdk@17/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
验证安装:
java -version
下载 JMeter:
官网:Apache JMeter - Download Apache JMeter
选择 Binaries
→ apache-jmeter-5.6.3.zip
解压安装:
Windows:解压到 D:\Tools\apache-jmeter-5.6.3
Linux/macOS:
unzip apache-jmeter-5.6.3.zip -d /opt/
配置环境变量:
Windows:
变量名:JMETER_HOME
变量值:D:\Tools\apache-jmeter-5.6.3
编辑 Path:添加 %JMETER_HOME%\bin
Linux/macOS:
echo 'export JMETER_HOME="/opt/apache-jmeter-5.6.3"' >> ~/.bashrc
echo 'export PATH="$JMETER_HOME/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
验证安装:
jmeter -v
# 应输出:5.6.3
无需额外操作,JMeter 5.6.3 默认包含 groovy-3.0.7.jar
下载 Groovy 4.0.21:
官网:https://groovy.apache.org/download.html
选择 Binary release (ZIP)
→ apache-groovy-binary-4.0.21.zip
替换 JAR 文件:
删除 JMETER_HOME/lib/groovy-3.0.7.jar
将 groovy-4.0.21.jar
复制到 JMETER_HOME/lib/
验证 Groovy 版本:
在 JMeter 中添加 JSR223 Sampler,输入:
log.info("Groovy Version: " + GroovySystem.version)
查看日志输出是否为 4.0.21
下载 protoc
:Releases · protocolbuffers/protobuf · GitHub
解压 protoc-25.1-win64.zip
,将 bin/protoc.exe
添加到 Path
# 安装 protoc
curl -LO https://github.com/protocolbuffers/protobuf/releases/download/v25.1/protoc-25.1-linux-x86_64.zip
unzip protoc-25.1-linux-x86_64.zip -d $HOME/.local
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
# 使用预装 JDK 17 + JMeter 5.6.3 的镜像
docker run -it --rm \
-v $(pwd)/scripts:/scripts \
-v $(pwd)/results:/results \
justb4/jmeter:5.6.3 \
-n -t /scripts/test.jmx -l /results/result.jtl
创建测试脚本 (compatibility_test.jmx
):
添加 HTTP Request 到 https://httpbin.org/get
添加 JSR223 PreProcessor:
log.info("JDK: " + System.getProperty("java.version"))
log.info("Groovy: " + GroovySystem.version)
vars.put("protoData", new com.your.proto.Message().toString())
运行测试:
jmeter -n -t compatibility_test.jmx -l result.jtl
检查日志:
确认无 Unsupported major.minor version
错误
日志中应输出:
INFO o.a.j.p.j.s.JSR223PreProcessor: JDK: 17.0.11
INFO o.a.j.p.j.s.JSR223PreProcessor: Groovy: 4.0.21
问题现象 | 可能原因 | 解决方案 |
---|---|---|
JMeter启动报JNI 错误 |
JDK架构与JMeter不匹配 | 确保JDK与操作系统位数一致(同用64位) |
Groovy脚本执行超慢 | 未启用编译缓存 | 在JSR223组件中勾选 Cache compiled script |
protoc 命令未找到 |
Path配置错误 | 检查 protoc 是否在系统 Path 中 |
JMeter无法读取环境变量 | 未重启终端或IDE | 关闭所有终端窗口并重新启动 |
通过以上步骤,您将获得一个完全兼容的 Groovy + JDK + JMeter 测试环境。
以下是基于 WebSocket 使用 Protobuf 协议进行通信时,生成 .proto
文件对应的 Java 代码,并在 JMeter 中测试的详细步骤:
protoc
编译器参考前文步骤安装 protoc 3.17.3
并配置环境变量。
.proto
文件假设你的 WebSocket 服务使用 Protobuf 格式传输数据,例如 message.proto
:
syntax = "proto3";
package example;
message Request {
string query = 1;
}
message Response {
string result = 1;
}
在 .proto
文件目录下执行:
protoc --java_out=./generated message.proto
生成的 Request.java
和 Response.java
会保存在 generated/example
目录。
javac -d ./out generated/example/*.java
jar cvf message-protobuf.jar -C out .
生成 message-protobuf.jar
,后续需将此 JAR 放入 JMeter 的 lib
目录。
JMeter 默认不支持 WebSocket,需安装插件:
下载 WebSocket Samplers by Peter Doornbosch
将下载的 WebSocketSamplers-1.2.4.jar
放入 JMeter 的 lib/ext
目录。
重启 JMeter。
将 message-protobuf.jar
和 Protobuf 的 Java 运行时库(如 protobuf-java-3.17.3.jar
)复制到 JMeter 的 lib
目录。
重启 JMeter。
右键 Test Plan → Add → Threads (Users) → Thread Group。
右键 Thread Group → Add → Sampler → WebSocket Open Connection。
配置参数:
Server URL: ws://your-server:port/path
(WebSocket 服务地址)
Connection Timeout: 5000
(ms)
右键 Thread Group → Add → Pre Processor → JSR223 PreProcessor。
选择语言为 Groovy
,编写序列化脚本:
import example.Request;
// 创建 Protobuf 请求对象
Request request = Request.newBuilder()
.setQuery("test")
.build();
// 将 Protobuf 对象转为字节数组
byte[] payload = request.toByteArray();
// 将字节数组保存到变量中
vars.put("requestBytes", payload);
右键 Thread Group → Add → Sampler → WebSocket Write Sampler。
配置参数:
WebSocket Session: default
(与 Open Connection 一致)
Message Type: Binary
(Protobuf 使用二进制传输)
Message: ${requestBytes}
(引用前置处理器生成的字节数组)
右键 Thread Group → Add → Post Processor → JSR223 PostProcessor。
选择语言为 Groovy
,编写反序列化脚本:
import example.Response;
// 从响应中获取二进制数据
byte[] responseBytes = prev.getResponseData();
// 反序列化为 Protobuf 对象
Response response = Response.parseFrom(responseBytes);
// 提取结果并保存到变量
vars.put("result", response.getResult());
右键 WebSocket Write Sampler → Add → Assertion → Response Assertion。
配置检查点(如验证 ${result}
是否包含特定值)。
右键 Thread Group → Add → Listener → View Results Tree。
右键 Thread Group → Add → Listener → Summary Report。
启动 WebSocket 服务
确保服务端已运行并监听指定端口(如 ws://localhost:8080/ws
)。
运行 JMeter
点击 ▶️ 启动测试,观察 View Results Tree 中的请求和响应详情。
二进制传输模式
WebSocket 需使用 Binary
类型发送 Protobuf 字节流,而非文本。
依赖管理
确保所有 Protobuf 相关的 JAR(包括生成的 message-protobuf.jar
和官方 protobuf-java-3.17.3.jar
)已放入 JMeter 的 lib
目录。
调试技巧
在 JSR223 脚本 中使用 log.info()
打印变量值:
log.info("Result: " + vars.get("result"));
ClassNotFoundException: com.google.protobuf.Message
原因: 未导入 protobuf-java-*.jar
。
解决: 将 Protobuf 的 Java 运行时库放入 JMeter 的 lib
目录。
原因: 服务端返回的数据格式不符合 Protobuf 定义。
解决: 使用 Wireshark 或服务端日志检查实际传输的二进制数据。
通过以上步骤,你可以实现在 JMeter 中通过 WebSocket 发送和接收 Protobuf 格式的数据。
在IntelliJ IDEA中编写JMeter的JSR223,需要结合IDE的编码环境和JMeter的脚本执行逻辑。以下是详细步骤:
安装IntelliJ IDEA:确保已安装最新版本(社区版或旗舰版)。
安装JDK:配置JDK 8或更高版本(建议JDK 17),并在IDEA中设置。
安装Groovy插件(推荐):
File -> Settings -> Plugins
,搜索"Groovy",安装并重启IDEA。
新建项目:
File -> New -> Project
,选择:
模板:Maven或Gradle项目(推荐Maven,便于依赖管理)。
语言:Java或Groovy。
JDK:选择已配置的JDK。
命名项目:如JSR223-PreProcessor-Demo
。
在项目的pom.xml
(Maven)或build.gradle
(Gradle)中添加JMeter核心库依赖:
org.apache.jmeter
ApacheJMeter_core
5.6.2
dependencies {
implementation 'org.apache.jmeter:ApacheJMeter_core:5.6.2'
}
新建Groovy脚本文件:
Right-click src/main/groovy -> New -> Groovy Script
,命名为DemoPreProcessor.groovy
。
编写脚本逻辑:
import org.apache.jmeter.threads.JMeterVariables
import org.apache.jmeter.util.JMeterUtils
// JMeter内置对象(自动注入)
def vars = JMeterVariables.INSTANCE.get()
def log = JMeterUtils.getLog()
// 示例:生成动态参数并存储到变量
def randomValue = new Random().nextInt(100)
vars.put("dynamicParam", randomValue.toString())
log.info("Generated dynamicParam: " + randomValue)
模拟JMeter上下文:在IDE中直接运行脚本可能无法访问真实JMeter变量,建议:
在脚本中添加单元测试,模拟vars
和log
对象。
将脚本复制到JMeter的JSR223 PreProcessor中实际测试。
导出脚本:将DemoPreProcessor.groovy
保存到JMeter测试计划目录(如scripts/
)。
配置JMeter元件:
添加 JSR223 PreProcessor 到HTTP请求。
选择语言为Groovy
。
设置脚本来源:
直接粘贴代码:复制Groovy脚本内容到输入框。
外部文件引用:勾选"Cache compiled script",路径填写scripts/DemoPreProcessor.groovy
。
性能优化:启用脚本缓存(Cache compiled script)以提高性能。
依赖管理:若脚本使用第三方库,需将JAR包放入JMeter的lib/ext
目录。
日志调试:使用log.info()
输出日志,在JMeter的View Results Tree
中查看。
IntelliJ IDEA编写脚本 -> 导出为.groovy文件 -> JMeter加载脚本 -> 执行测试计划
通过以上步骤,你可以在IntelliJ IDEA中高效编写和调试JSR223预处理器脚本,并集成到JMeter测试计划中。