jmeter

JMeter 简介

Apache JMeter 是Apache 组织开发的开源、跨平台压力测试工具,基于 Java 语言编写,不需要安装,解压即用。

✅ 核心用途

  1. 接口功能测试:发送 HTTP 请求,添加断言,验证接口返回是否符合预期(你现在做的登录接口测试)
  2. 性能 / 压力测试:模拟多用户并发访问,测响应时间、吞吐量、错误率
  3. 分布式压测:一台主控机 + 多台 agent 从机,模拟超大并发
  4. 支持测试对象:Web 接口、HTTP/HTTPS、数据库 JDBC、FTP、TCP、WebSocket 等

不适合做浏览器 UI 自动化(它不是浏览器,不会渲染页面,只发送网络请求)

✅ 核心组件(⭐️)

  1. 测试计划:根节点,一个 jmx 脚本就是一个测试计划
  2. 线程组:虚拟用户(并发用户),控制并发数、循环次数、压测时长
  3. 取样器 (Sampler):发送请求。常用:HTTP 请求(接口)、JDBC 请求
  4. 断言 (Assertion):校验结果。判断请求返回是否符合预期(响应断言、JSON 断言)
  5. 配置元件:提供参数。用户定义变量、CSV 数据文件、HTTP 信息头管理器
  6. 监听器:查看结果。察看结果树、聚合报告、摘要报告
  7. 前置 / 后置处理器:
    • 前置:请求前处理(用户参数)
    • 后置:请求后提取数据(JSON 提取器、正则提取器,做接口关联)

✅ 工作原理
JMeter 通过线程模拟虚拟用户,每个线程独立执行取样器发送请求;
请求完成后执行断言校验,最后监听器收集响应时间、成功失败等指标。

✅ 优缺点

  1. 优点
  • 开源免费,跨平台(Windows/Linux)
  • 支持分布式压测
  • 插件丰富,报表能力强
  • 支持接口自动化 + 性能测试一体
  1. 缺点
  • Java 开发,大并发下占用内存较高
  • 不渲染页面,无法测前端 JS 渲染
  • GUI 模式只用来调试脚本,正式压测必须用命令行非 GUI 模式

一句话:JMeter 是 Apache 开源的 Java 压测工具,主要用于接口功能测试和性能压力测试,通过线程模拟虚拟用户发送请求,配合取样器、断言、监听器完成测试;GUI 调试脚本,正式压测使用命令行模式。

安装教程

https://www.cnblogs.com/xiaolehong/p/18128032

  1. 安装jdk【jmeter 是java 开发工具,会用到jdk】
  2. 查看 jdk 版本:java -version
  3. 配置环境变量
    win11 环境变量
    image

获取jdk 安装路径:C:\Program Files\Java\jdk1.8.0_60

配置环境变量
添加JAVA_HOME
image
path中添加 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
image
path中添加 C:\Program Files\Java\jdk1.8.0_60\bin
image
新建CLASSPATH .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
image

  1. 解压 jmeter 压缩包
  2. 进入 bin 目录
  • Windows启动:jmeter.bat 【可发送到桌面,生成桌面快捷方式】
  • linux启动:jmeter.sh
  1. 点击 jmeter.bat 启动jmeter

使用过程

初步使用

  1. 新建线程组
    image
  2. 添加http 请求
    image
  3. 添加 查看结果树
    image
  4. 添加响应断言
    image
  5. 运行,查看结果

添加依赖接口

  1. 新建线程组
  2. 新建两个接口
  3. 添加 http cookie 管理器【例如登录 带cookie 请求后面的接口】
    image

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

变量设置

  1. 添加线程组,添加接口,接口值设置 ${变量}
  2. 添加用户参数
    image
    image
  3. 设置多个用户时,改变线程数【一个线程请求一次,一个线程就是一个用户】,运行查看结果

通过导入的文档获取参数信息

  1. 添加 CSV Data Set Config
    image
    image
  2. 接口设置变量
  3. 运行

关联接口

  1. 新建线程组,添加多个关联接口
  2. 添加正则表达式提取器
    image
  3. 界面
    image
  • 引用名称(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...

image
面板参数

  1. Apply to(应用范围)
  • Main sample only ✅【默认推荐】只作用主请求(普通接口都选这个)
  • Main sample and sub-samples:主请求 + 重定向子请求
  1. 要测试的响应字段
  • 响应代码:校验 HTTP 状态码(200、401、500),只写数字
  • 响应文本:校验返回 body 内容(html/json 文本)
  • Response Headers:校验响应头
  1. 模式匹配规则(重点)
  • 包括:响应包含指定文字,支持正则(最常用)
  • Substring:包含指定文字,不支持正则
  • Equals:完全一模一样才通过(区分大小写,不支持正则),校验 200 状态码推荐选 Equals
  • 匹配:完全匹配整个响应,支持正则
  • 否:取反,不包含才成功
  1. 要测试的模式:填写你预期的值,点【添加】可以多个断言内容

JSON 断言【接口返回 JSON 推荐,精准校验json字段】

适合 rest 接口,直接定位 json 字段,比响应断言更精准

  1. HTTP 请求右键 → 添加 → 断言 → JSON 断言
  2. 参数:
  • Assert JSON Path exists:JSON 路径表达式,例如$.code、$.data.token
  • Additionally assert value:勾选,开启值校验
  • Expected Value:期望值,填写200或者"success"

JSONPath 语法:$代表根节点,$.data.msg代表根下 data 里 msg 字段

其他常用断言

  1. 持续时间断言(Duration Assertion)
    校验响应时间,单位毫秒。例如填1000:请求超过 1 秒直接断言失败,用于性能测试。
  2. JSR223 断言(Groovy 脚本,复杂逻辑)
    适合复杂判断,写代码校验。
if(prev.getResponseCode()!="200"){
    AssertionResult.setFailure(true);
    AssertionResult.setFailureMessage("状态码不是200");
}

prev 代表当前取样器结果,Groovy 性能最好。

高频考点

  1. 断言作用:接口请求成功不代表业务正确,断言用来校验返回结果是否符合预期
  2. 响应断言和 JSON 断言区别:响应断言是文本模糊匹配;JSON 断言解析 json 结构,精准定位字段。
  3. 作用域:断言放在 HTTP 请求下,仅对当前接口生效;放在线程组,对所有取样器生效。

❌️ 常见坑

  1. 响应代码校验写code==200 → 直接失败
  2. 要校验 404/500 这类错误码:勾选 Ignore Status,否则 JMeter 默认把 4xx/5xx 标记为请求失败,不会执行断言
  3. 中文乱码导致断言失败:修改 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..."
    }
}

添加步骤

  1. 右键【登录 HTTP 请求】→ 添加 → 后置处理器 → JSON 提取器

⚠️提取器必须放在要提取的接口下面,不能放在线程组!

  1. 参数填写
    | 字段 | 填写示例 | 说明 |
    | --- | --- | --- |
    | Names of created variables | token | 变量名,后面用 ${token} |
    | JSON Path expressions | $.data.token | JSON 路径表达式,$代表根节点 |
    | Match No. | 1 | 1 = 取第一个匹配;-1 提取全部;0 随机 |
    | Default Value | NOT_FOUND | 提取失败时默认值,方便调试 |
    image

  2. 下游接口使用:
    在【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

✅ 完整流程(登录→查询接口)

  1. HTTP 请求 1:登录接口
  2. 登录接口下添加【JSON 提取器】提取 token
  3. HTTP 请求 2:查询接口,请求头携带 ${token}
  4. 给查询接口加【响应断言】校验业务码
  5. 添加察看结果树调试

✅ 跨线程组关联(拓展,面试常问)

默认提取的变量只在当前线程组生效。如果两个接口分属不同线程组,需要 BeanShell 后置处理器把变量转为全局属性:

props.put("globalToken",vars.get("token"));

第二个线程组引用:${__P(globalToken)}

✅ 常见踩坑

  1. ❌后置处理器放错位置:放在线程组或者下游接口,提取不到数据;必须放在上游接口子级
  2. ❌JSONPath 写错,层级不对,提取结果为默认值NOT_FOUND;在察看结果树看变量值
  3. ❌变量引用写错:忘记 ${},直接写 token,不会替换
  4. ❌并发多用户:每个线程独立变量,互不干扰,适合性能测试

一句话:JMeter 接口关联通过后置处理器实现;JSON 类型接口优先使用 JSON 提取器,在上游接口提取返回值保存为变量,下游接口使用 ${变量名} 引用;变量默认线程组内有效,跨线程组关联需要 BeanShell 设置全局属性。

posted @ 2026-10-14 11:37  一只鹿吖  阅读(12)  评论(0)    收藏  举报