jmeter
JMeter 简介
Apache JMeter 是Apache 组织开发的开源、跨平台压力测试工具,基于 Java 语言编写,不需要安装,解压即用。
✅ 核心用途
- 接口功能测试:发送 HTTP 请求,添加断言,验证接口返回是否符合预期(你现在做的登录接口测试)
- 性能 / 压力测试:模拟多用户并发访问,测响应时间、吞吐量、错误率
- 分布式压测:一台主控机 + 多台 agent 从机,模拟超大并发
- 支持测试对象:Web 接口、HTTP/HTTPS、数据库 JDBC、FTP、TCP、WebSocket 等
不适合做浏览器 UI 自动化(它不是浏览器,不会渲染页面,只发送网络请求)
✅ 核心组件(⭐️)
- 测试计划:根节点,一个 jmx 脚本就是一个测试计划
- 线程组:虚拟用户(并发用户),控制并发数、循环次数、压测时长
- 取样器 (Sampler):发送请求。常用:HTTP 请求(接口)、JDBC 请求
- 断言 (Assertion):校验结果。判断请求返回是否符合预期(响应断言、JSON 断言)
- 配置元件:提供参数。用户定义变量、CSV 数据文件、HTTP 信息头管理器
- 监听器:查看结果。察看结果树、聚合报告、摘要报告
- 前置 / 后置处理器:
- 前置:请求前处理(用户参数)
- 后置:请求后提取数据(JSON 提取器、正则提取器,做接口关联)
✅ 工作原理
JMeter 通过线程模拟虚拟用户,每个线程独立执行取样器发送请求;
请求完成后执行断言校验,最后监听器收集响应时间、成功失败等指标。
✅ 优缺点
- 优点
- 开源免费,跨平台(Windows/Linux)
- 支持分布式压测
- 插件丰富,报表能力强
- 支持接口自动化 + 性能测试一体
- 缺点
- Java 开发,大并发下占用内存较高
- 不渲染页面,无法测前端 JS 渲染
- GUI 模式只用来调试脚本,正式压测必须用命令行非 GUI 模式
一句话:JMeter 是 Apache 开源的 Java 压测工具,主要用于接口功能测试和性能压力测试,通过线程模拟虚拟用户发送请求,配合取样器、断言、监听器完成测试;GUI 调试脚本,正式压测使用命令行模式。
安装教程
https://www.cnblogs.com/xiaolehong/p/18128032
- 安装jdk【jmeter 是java 开发工具,会用到jdk】
- 查看 jdk 版本:
java -version - 配置环境变量
win11 环境变量

获取jdk 安装路径:C:\Program Files\Java\jdk1.8.0_60
配置环境变量
添加JAVA_HOME

path中添加 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

path中添加 C:\Program Files\Java\jdk1.8.0_60\bin

新建CLASSPATH .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

- 解压 jmeter 压缩包
- 进入 bin 目录
- Windows启动:jmeter.bat 【可发送到桌面,生成桌面快捷方式】
- linux启动:jmeter.sh
- 点击 jmeter.bat 启动jmeter
使用过程
初步使用
- 新建线程组

- 添加http 请求

- 添加 查看结果树

- 添加响应断言

- 运行,查看结果
添加依赖接口
- 新建线程组
- 新建两个接口
- 添加 http cookie 管理器【例如登录 带cookie 请求后面的接口】

请求默认值【设置统一请求协议,请求ip地址,请求端口号。写接口时可不填这三项】

变量设置
- 添加线程组,添加接口,接口值设置
${变量} - 添加用户参数


- 设置多个用户时,改变线程数【一个线程请求一次,一个线程就是一个用户】,运行查看结果
通过导入的文档获取参数信息
- 添加 CSV Data Set Config


- 接口设置变量
- 运行
关联接口
- 新建线程组,添加多个关联接口
- 添加正则表达式提取器

- 界面

- 引用名称(Name of created variable):Jmeter变量的名称,存储提取的结果;即下个请求需要引用的值、字段、变量名,后文中引用方法是$
- 正则表达式(Regular Expression):使用正则表达式解析响应结果,()括号表示提取字符串中的部分值,前后是提取的边界内容。如:
(.+?) - ():括起来的部分就是要提取的。
- 匹配任何字符串。
- +: -次或多次。
- ?:不要太贪婪,在找到第一个匹配项后停止。
- 模板(Template):正则表达式的提取模式。
如果正则表达式有多个提取结果,则结果是数组形式,模板1 11,2 22等等,表示把解析到的第几个值赋给变量;从1开始匹配,以此类推。
若只有一个结果,则只能是1 11;如:$1$ - 匹配数字(Match No):正则表达式匹配数据的结果可以看做一个数组,表示如何取值:0代表随机取值,正数n则表示取第n个值(比如1代表取第一个值),负数则表示提取所有符合条件的值。
- 缺省值:匹配失败时候的默认值;通常用于后续的逻辑判断,一般通常为特定含义的英文大写组合,比如:ERROR等。
jemeter 断言设置
选中你的 HTTP 请求取样器 → 右键 → 添加 → 断言 → 响应断言
断言放在 HTTP 请求下面,只对这一个接口生效;放在线程组下,对组内所有接口生效Apache JMe...

面板参数
- Apply to(应用范围)
Main sample only✅【默认推荐】只作用主请求(普通接口都选这个)- Main sample and sub-samples:主请求 + 重定向子请求
- 要测试的响应字段
- 响应代码:校验 HTTP 状态码(200、401、500),只写数字
- 响应文本:校验返回 body 内容(html/json 文本)
- Response Headers:校验响应头
- 模式匹配规则(重点)
- 包括:响应包含指定文字,支持正则(最常用)
- Substring:包含指定文字,不支持正则
- Equals:完全一模一样才通过(区分大小写,不支持正则),校验 200 状态码推荐选 Equals
- 匹配:完全匹配整个响应,支持正则
- 否:取反,不包含才成功
- 要测试的模式:填写你预期的值,点【添加】可以多个断言内容
JSON 断言【接口返回 JSON 推荐,精准校验json字段】
适合 rest 接口,直接定位 json 字段,比响应断言更精准
- HTTP 请求右键 → 添加 → 断言 → JSON 断言
- 参数:
- Assert JSON Path exists:JSON 路径表达式,例如
$.code、$.data.token - Additionally assert value:勾选,开启值校验
- Expected Value:期望值,填写
200或者"success"
JSONPath 语法:
$代表根节点,$.data.msg代表根下 data 里 msg 字段
其他常用断言
- 持续时间断言(Duration Assertion)
校验响应时间,单位毫秒。例如填1000:请求超过 1 秒直接断言失败,用于性能测试。 - JSR223 断言(Groovy 脚本,复杂逻辑)
适合复杂判断,写代码校验。
if(prev.getResponseCode()!="200"){
AssertionResult.setFailure(true);
AssertionResult.setFailureMessage("状态码不是200");
}
prev 代表当前取样器结果,Groovy 性能最好。
高频考点
- 断言作用:接口请求成功不代表业务正确,断言用来校验返回结果是否符合预期
- 响应断言和 JSON 断言区别:响应断言是文本模糊匹配;JSON 断言解析 json 结构,精准定位字段。
- 作用域:断言放在 HTTP 请求下,仅对当前接口生效;放在线程组,对所有取样器生效。
❌️ 常见坑
- 响应代码校验写
code==200→ 直接失败 - 要校验 404/500 这类错误码:勾选 Ignore Status,否则 JMeter 默认把 4xx/5xx 标记为请求失败,不会执行断言
- 中文乱码导致断言失败:修改 jmeter.properties 编码
#sampleresult.default.encoding=ISO-8859-1改为UTF-8
jmeter 关联接口
✅ 概念(⭐)
接口关联(也叫依赖传参):上一个接口返回的数据,提取出来作为下一个接口的入参。
最典型场景:登录接口返回 token,后面查询 / 提交接口请求头带上这个 token。
原理:使用后置处理器,放在【上游接口】下面,接口执行完成后,自动从响应提取值存入 JMeter 变量;下游接口使用
${变量名}引用。
✅ 核心:JSON 提取器(JSON 接口首选,你现在登录接口就用这个)
场景:登录返回 JSON,提取 token
返回示例:
{
"code":200,
"msg":"success",
"data":{
"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
}
添加步骤
- 右键【登录 HTTP 请求】→ 添加 → 后置处理器 → JSON 提取器
⚠️提取器必须放在要提取的接口下面,不能放在线程组!
-
参数填写
| 字段 | 填写示例 | 说明 |
| --- | --- | --- |
| Names of created variables | token | 变量名,后面用${token}|
| JSON Path expressions |$.data.token| JSON 路径表达式,$代表根节点 |
| Match No. |1| 1 = 取第一个匹配;-1 提取全部;0 随机 |
| Default Value |NOT_FOUND| 提取失败时默认值,方便调试 |

-
下游接口使用:
在【HTTP 信息头管理器】添加:Authorization: Bearer ${token},或者请求参数里直接写${token}
常用 JSONPath 语法
$.code根下一级 code$.data.token根→data→token$.list[0].id数组第 1 个元素的 id
✅ 备选:正则表达式提取器(HTML / 文本 / 非 JSON 用)
现在 REST 接口优先 JSON 提取器,正则容易因为空格换行匹配失败。
- 引用名称:
token - 正则表达式:
"token":"(.+?)" - 模板:
$1$(取第一个捕获组) - 匹配数字:
1 - 默认值:
NOT_FOUND
✅ 完整流程(登录→查询接口)
- HTTP 请求 1:登录接口
- 登录接口下添加【JSON 提取器】提取 token
- HTTP 请求 2:查询接口,请求头携带
${token} - 给查询接口加【响应断言】校验业务码
- 添加察看结果树调试
✅ 跨线程组关联(拓展,面试常问)
默认提取的变量只在当前线程组生效。如果两个接口分属不同线程组,需要 BeanShell 后置处理器把变量转为全局属性:
props.put("globalToken",vars.get("token"));
第二个线程组引用:${__P(globalToken)}
✅ 常见踩坑
- ❌后置处理器放错位置:放在线程组或者下游接口,提取不到数据;必须放在上游接口子级
- ❌JSONPath 写错,层级不对,提取结果为默认值
NOT_FOUND;在察看结果树看变量值 - ❌变量引用写错:忘记
${},直接写 token,不会替换 - ❌并发多用户:每个线程独立变量,互不干扰,适合性能测试
一句话:JMeter 接口关联通过后置处理器实现;JSON 类型接口优先使用 JSON 提取器,在上游接口提取返回值保存为变量,下游接口使用 ${变量名} 引用;变量默认线程组内有效,跨线程组关联需要 BeanShell 设置全局属性。

浙公网安备 33010602011771号