【测试】JMeter 性能测试

文章目录

JMeter 性能测试

JMeter 基本使用流程

  1. 启动 JMeter
  2. 在"测试计划"下添加"线程组"
  1. 在"线程组"下添加"HTTP 取样器"
  1. 填写"HTTP 请求"的相关请求数据(协议、IP、端口、方法、路径、参数等)

  2. 在"线程组"下添加"查看结果树"监听器

  3. 点击"启动"按钮运行,查看接口测试结果

JMeter 元件作用域和执行顺序

  • 作用域:由测试计划的树形结构中的元件父子关系确定
  • 执行顺序:取样器不依赖其他元件即可执行,因此不存在作用域问题;其他元件作用域只对子节点起作用

重点组件

线程组
  • 控制 JMeter 执行测试的线程数(一个线程 = 一个测试用户)
  • 线程组配置项
    • 名称、注释
    • 在取样器错误后要执行的动作(继续/启动下一进程循环/停止线程/停止测试/立即停止测试)
    • 线程属性
      • 线程数:发送请求的线程数量
      • Ramp-Up 时间(秒):启动所有线程所需时间
      • 循环次数:配置指定次数或"永远"
      • Same user on each iteration
      • 延迟创建线程直到需要
    • 调度器
      • 持续时间(秒):脚本执行时间
      • 启动延迟(秒):等待指定时间后才开始运行

HTTP 取样器
  • 配置项
    • 名称、注释
    • Web 服务器:协议(http/https)、端口(80/443)
    • HTTP 请求:方法(GET/POST等)、路径
    • 自动重定向、跟随重定向、使用 KeepAlive、对 POST 使用 multipart/form-data、与浏览器兼容的头
    • 参数(可拼在路径里或写在参数表中)
    • 消息体数据(POST 参数放于此,如 {wd:test}
    • 内容编码:建议使用 UTF-8
查看结果树
  • 取样器结果
    • Thread Name:线程组名称
    • Sample time:发送请求时间
    • Load time:响应时间
    • Response code:接口响应状态码
  • 请求:显示 HTTP 请求头和请求体
  • 响应:显示 HTTP 响应头和响应体
  • 像 Web 浏览器一样存储和发送 Cookie
  • 如果响应包含 Cookie,则自动存储并用于后续对该网站的请求
  • 每个 JMeter 线程有自己的 Cookie 存储区
  • 缓存配置可选择 standard 或 compatibility
  • 可手工添加 Cookie
  • 添加后会自动存储并发送 Cookie(示例中展示了 JSESSIONID)
HTTP 请求默认值
  • 将协议、IP、端口号等公共配置抽取出来,供多个 HTTP 取样器复用
用户定义的变量
  • 添加方式:线程组 → 配置元件 → 用户定义的变量
  • 使用:在 HTTP 请求中通过 ${变量名} 引用
  • 适用场景:变量需要在多个脚本中统一管理和修改
CSV 数据文件设置
  • 用途:模拟多用户登录,提供更多用户名/密码
  • 添加方式:线程组 → 配置元件 → CSV 数据文件设置
  • 操作步骤
    1. CSV 数据文件设置
复制代码
 - 文件名:填写 CSV 文件路径(建议绝对路径)
 - 文件编码:UTF-8
 - 变量名称:读取数据后保存的变量名(多个用逗号分隔)
 - 是否忽略首行:是否从第一行开始读取
 - 分隔符:与 CSV 文件中列分隔符一致
 - 遇到文件结束符再次循环:True 则从头取,False 需勾选"遇到文件结束符停止线程"
  1. 编写 test.csv 文件(示例)

  2. 修改登录接口及其他涉及 username/password 的参数,替换为 ${变量名}

  3. 修改线程组中的线程数,使每次取到的数据不同

  4. 运行结果

JSON 提取器
  • 用途:从接口响应中提取特定字段,供后续接口使用
  • 添加方式:针对某个 HTTP 请求添加 → 后置处理器 → JSON 提取器
  • JSONPath 操作符参考
    • $:根元素
    • @:当前元素
    • *:通配符,所有节点
    • ..:选择所有符合条件的节点
    • .<name>:子元素
    • ['<name>','<name>']:子元素列表
    • [<number>,<number>]:数组索引或索引列表
    • [start:end]:数组切片
    • [?(<expression>)]:过滤器表达式
  • 示例:获取所有 blogId:$..blogId;获取第一个:$..[0]blogId
  • 配置后,后续接口可引用提取的变量(如 ${blogId}

JSON 断言
  • 用途:验证接口响应数据是否符合预期(不仅检查状态码)

  • 添加方式:针对某个 HTTP 请求添加 → 断言 → JSON 断言

  • 配置注意点

    • 若不选 "Additionally assert value",则可判断字段是否存在
    • 若选择此项,则必须填写 Expected Value
    • 若不选 "Match as regular expression",则 Expected Value 必须完整匹配
    • 若选择正则匹配,则可仅填写关键词
同步定时器(集合点)
  • 用途:模拟多用户并发,让多个线程在同一时刻执行操作
  • 添加方式:线程组 → 定时器 → 同步定时器
  • 作用:当线程数量达到指定值后一起释放,产生瞬间压力
  • 类比:红绿灯,所有人等待绿灯同时通过
事务控制器
  • 用途:测试执行嵌套测试元素所花费的总时间,将多个接口统一作为一个事务
  • 添加方式:线程组 → 逻辑控制器 → 事务控制器
  • 默认情况下,一个接口即一个事务;加入事务控制器后可将多个接口合并为一个事务
安装插件
  • 官网:https://jmeter-plugins.org/install/Install/

  • 通过插件管理工具下载其他插件:

    • 下载其他监听器插件

    • 下载线程组插件(Custom Thread Groups)

  • 操作:在 Jmeter Plugins Manager 中,选择 Available Plugins,搜索并安装,点击 Apply Changes and Restart JMeter

Stepping Thread Group
  • 参数配置:
    • This group will start:启动多少个线程
    • First, wait for:等待多少秒才开始压测(默认0)
    • Then start:一开始有多少个线程数(默认0)
    • Next, add:下一次增加多少个线程数
    • threads every:当前运行多长时间后再次启动线程
    • using ramp-up:启动线程的持续时间(如5秒)
    • then hold load for:全部启动后持续运行时间
    • finally, stop / threads every:多长时间释放多少个线程

常见监听器
聚合报告
  • 展示整体性能数据,包含以下指标:
    • Label:请求名称
    • #样本:请求数
    • 平均值:平均响应时间(ms)
    • 中位数:50% 请求的响应时间
    • 90% 百分位、95% 百分位、99% 百分位
    • 最小值、最大值
    • 异常%:调用失败占比
    • 吞吐量:TPS/QPS,每秒处理事务数
    • 接收 KB/sec、发送 KB/sec:网络传输流量
Response Times Over Time
  • 监听整个运行期间的响应时间变化
  • 横坐标:运行时间,纵坐标:响应时间(ms)
  • 用于观察响应时间稳定性和波动
Transactions per Second(TPS)
  • 分析系统吞吐量(TPS = 每秒事务数)
  • 横坐标:运行时间,纵坐标:TPS 值
  • 红色表示通过的 TPS,绿色表示失败的 TPS

测试报告

  • 生成命令:

    复制代码
    JMeter -n -t 脚本文件 -l 日志文件 -e -o 报告目录
    • -n:无图形化运行
    • -t:被运行的脚本
    • -l:将运行信息写入 jtl 日志文件
    • -e:生成测试报告
    • -o:指定报告输出目录(必须为空或不存在)
  • 正确示例命令及执行后生成的文件(包括 index.html)

  • 双击 index.html 即可查看报告

性能测试报告生成后,在rizhi文件夹下