虽然 JMeter 本身功能强大,但在实际工作中,总有一些特定场景需要额外扩展:比如生成复杂的业务数据、实时监控服务器资源、实现更精细的负载模型等。JMeter 支持两种扩展方式:安装第三方插件和自定义开发。本文将介绍如何使用 Plugins Manager 安装常用插件,以及如何通过 Java 开发自定义函数和取样器。
一、JMeter 插件生态概览
JMeter 官方提供了核心功能,而大量高级特性由 JMeter Plugins 项目(https://jmeter-plugins.org)提供。
二、安装 JMeter Plugins Manager
2.1 下载安装
从 https://jmeter-plugins.org/install/Install/ 下载 jmeter-plugins-manager-*.jar
将 JAR 文件复制到 $JMETER_HOME/lib/ext 目录下
重启 JMeter
2.2 使用插件管理器
点击菜单栏 Options → Plugins Manager。Plugins Manager 包含三大标签页:
Installed Plugins:已安装的插件
Available Plugins:可用插件列表,勾选即可安装
Upgrades:已安装插件的更新
三、常用第三方插件详解
3.1 Custom Thread Groups(自定义线程组)
用于实现阶梯式加压和复杂负载模型,比默认线程组更适合负载测试。
安装:在 Available Plugins 中搜索 “Custom Thread Groups” 并安装。
安装后,添加线程组时会多出以下选项:
Stepping Thread Group:阶梯式增加/减少线程
Concurrency Thread Group:按目标并发/吞吐量调度线程
Stepping Thread Group 配置示例:
text
This group will start: 10 threads
Then start: 10 threads, every 30 seconds, using ramp-up: 5 seconds
Then hold load for: 300 seconds
Finally, stop: 10 threads every 10 seconds
该配置模拟:每 30 秒增加 10 个并发,达到峰值后保持 5 分钟,再逐步释放。
3.2 PerfMon Metrics Collector(服务器性能监控)
分布式压测时,不仅要关注 TPS 和响应时间,还需监控被测服务器的 CPU、内存、磁盘 I/O 等指标。PerfMon 插件正是为此而生。
安装:在 Available Plugins 中搜索 “PerfMon” 并安装。
配置步骤:
在被测服务器上启动 ServerAgent:
# 下载 ServerAgentwgethttps://github.com/undera/perfmon-agent/releases/download/2.2.3/ServerAgent-2.2.3.zipunzipServerAgent-2.2.3.zipcdServerAgent-2.2.3 ./startAgent.sh# 默认端口 4444在 JMeter 中添加监听器:右键线程组 → Add → Listener → jp@gc - PerfMon Metrics Collector
配置监控指标:添加要监控的服务器,选择指标类型(CPU、Memory、Swap、Disk I/O、Network I/O 等)。
启动压测:实时曲线会显示在监听器中。
3.3 Throughput Shaping Timer(吞吐量定时器)
普通的定时器(如 Constant Throughput Timer)存在性能问题,且精度不高。Throughput Shaping Timer 能精确控制 RPS,与 Concurrency Thread Group 配合可实现“面向目标的负载测试”。
安装:在 Available Plugins 中搜索 “Throughput Shaping Timer”。
配置示例:
text
Step1: start load: 10 rps, end load: 10 rps, duration: 60s
Step2: start load: 10 rps, end load: 50 rps, duration: 60s
Step3: start load: 50 rps, end load: 50 rps, duration: 180s
这表示:第 1 分钟固定 10 RPS,第 2 分钟从 10 爬升到 50 RPS,后 3 分钟保持 50 RPS。
3.4 Basic Graphs(基础图表)
提供比默认监听器更丰富的图表:
Transactions per Second:实时 TPS 曲线
Response Times Over Time:响应时间曲线
Response Times vs Threads:响应时间与并发数的关系
四、自定义 Java 请求(Java Sampler)
当 JMeter 内置的取样器无法满足需求时(如需要测试自定义 TCP/UDP 协议、调用本地 SDK),可以通过继承 AbstractJavaSamplerClient 类来实现自定义取样器。
4.1 开发步骤
Step 1:创建 Java 工程,引入 JMeter 的 ApacheJMeter_core.jar 和 ApacheJMeter_java.jar(位于 $JMETER_HOME/lib/ext)。
Step 2:创建类继承 AbstractJavaSamplerClient,实现四个主要方法:
getDefaultParameters():定义可配置的输入参数
setupTest():测试开始前执行一次(如初始化连接)
runTest(JavaSamplerContext context):核心逻辑,每次迭代调用
teardownTest():测试结束后执行一次(如释放资源)
示例代码:
importorg.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;importorg.apache.jmeter.protocol.java.sampler.JavaSamplerContext;importorg.apache.jmeter.samplers.SampleResult;publicclassCustomJavaSamplerextendsAbstractJavaSamplerClient{// 定义可配置参数@OverridepublicArgumentsgetDefaultParameters(){Argumentsparams=newArguments();params.addArgument("sleep_time","100");returnparams;}// 每个取样器执行一次@OverridepublicSampleResultrunTest(JavaSamplerContextcontext){SampleResultresult=newSampleResult();result.sampleStart();try{longsleepTime=Long.parseLong(context.getParameter("sleep_time"));Thread.sleep(sleepTime);result.setSuccessful(true);result.setResponseMessage("OK");result.setResponseData("Success".getBytes());}catch(Exceptione){result.setSuccessful(false);result.setResponseMessage(e.getMessage());}result.sampleEnd();returnresult;}}Step 3:打包成 JAR,放入所有 JMeter 节点(Master 和 Slave)的 lib/ext 目录,重启 JMeter。
Step 4:在线程组中添加 Java Request 取样器,选择自定义类,配置参数(如 sleep_time)。
4.2 使用场景
测试非 HTTP 协议的自定义后端服务
调用本地 SDK 或数据库存储过程
生成高精度的复杂测试数据(结合 CSV 读取)
五、自定义函数(Function)
自定义函数用于生成动态数据,比内置函数更灵活。
importorg.apache.jmeter.functions.AbstractFunction;publicclassCustomFunctionextendsAbstractFunction{// 实现 getArgumentDesc、setParameters、execute 等方法}与自定义取样器相比,自定义函数更轻量,适合做数据处理;自定义取样器则适合实现完整的协议交互。
六、插件开发的最佳实践
性能优先:插件应在高并发下保持低开销,避免在 runTest 中创建重量级对象。
线程安全:同一线程内 runTest 是串行执行,但多线程下实例可能会重用,需注意并发安全。
日志规范:使用 JMeter 的 log 对象(如 log.info())输出日志,而非 System.out。
版本兼容性:针对主流 JMeter 版本(如 5.x)编译,测试稳定后再部署。
七、总结
本文核心:
Plugins Manager 是插件安装的统一入口
常用插件推荐:Custom Thread Groups(阶梯加压)、PerfMon(资源监控)、Throughput Shaping Timer(精确控压)
自定义 Java 请求:继承 AbstractJavaSamplerClient 实现 runTest 方法
自定义函数:更轻量,适合数据处理