我的测试学习站TEST LEARNING HUB
开始学习
首页/精华文章/2. JMeter 压测脚本怎么设计

2. JMeter 压测脚本怎么设计

JMeter 是性能测试面试中最常被问到的工具。很多同学会创建线程组、添加 HTTP 请求、看聚合报告,但真正的压测脚本设计远不止这些。一个合格的 JMeter 脚本应该包含线程模型、请求配置、参数化、关联、断言、事务控制器、集合点、定时器、监听器、环境变量和结果输出。更重要的是,脚本要能模拟真实业务,而不是机械地重复请求一个接口。

面试中问“JMeter 压测脚本怎么设计”,要按业务链路和脚本结构来回答。比如登录后下单,需要先登录、提取 token、查询商品、创建订单、支付或模拟支付回调,再断言业务结果。

一、先明确压测目标

写 JMeter 脚本前,先确认:

  • 压测哪个业务;
  • 目标并发是多少;
  • 目标 TPS 是多少;
  • 响应时间指标是什么;
  • 错误率要求是什么;
  • 压测持续多久;
  • 是否需要登录态;
  • 是否有接口关联;
  • 是否需要参数化数据。

没有目标的脚本,只是接口调用脚本。

二、线程组怎么设计

线程组用于模拟用户并发。

关键参数:

  • 线程数;
  • ramp-up 时间;
  • 循环次数;
  • 持续时间;
  • 启动延迟。

例如 100 个线程,ramp-up 100 秒,表示 100 秒内逐步启动 100 个用户,而不是瞬间全部启动。

不要一上来就加很大线程数,要逐步加压。

三、HTTP 请求默认值

可以用 HTTP Request Defaults 配置公共信息:

  • 协议;
  • 域名;
  • 端口;
  • 公共路径;
  • 超时时间。

这样每个请求不需要重复写 base_url,环境切换也更方便。

四、Header 管理

使用 HTTP Header Manager 管理请求头:

  • Content-Type;
  • Authorization;
  • Cookie;
  • User-Agent;
  • TraceId。

如果接口需要 token,可以通过变量引用:

Authorization: Bearer ${token}

五、参数化怎么做

参数化用于避免所有线程使用同一份数据。

常见方式:

  • CSV Data Set Config;
  • 用户定义变量;
  • 函数生成随机数;
  • 时间戳;
  • 前置处理器。

例如登录账号、手机号、商品 ID、订单数据都可以参数化。

六、接口关联怎么做

接口关联是 JMeter 脚本重点。

例如登录接口返回 token,后续接口要使用 token。

可以用:

  • JSON Extractor;
  • Regular Expression Extractor;
  • XPath Extractor;
  • JMESPath Extractor。

示例:从响应中提取 token 保存为变量 ${token}。

七、断言怎么设计

压测脚本必须加断言,否则请求返回错误页面也可能被当成成功。

常见断言:

  • Response Assertion;
  • JSON Assertion;
  • Duration Assertion;
  • JSR223 Assertion。

断言内容:

  • HTTP 状态码;
  • 业务 code;
  • message;
  • 关键字段;
  • 响应时间。

性能测试中要特别关注业务成功率。

八、事务控制器

Transaction Controller 用于把多个请求作为一个业务事务统计。

例如“下单”事务可能包含:

  • 查询商品;
  • 创建订单;
  • 查询订单;
  • 提交支付。

事务控制器可以统计整个业务链路的响应时间,而不是单个接口。

九、定时器和思考时间

真实用户不会连续毫无间隔地点击。

可以用定时器模拟思考时间:

  • Constant Timer;
  • Gaussian Random Timer;
  • Uniform Random Timer。

思考时间设置过小,会造成不真实压力;设置过大,会降低 TPS。

十、监听器怎么用

调试阶段可以用:

  • View Results Tree;
  • Summary Report;
  • Aggregate Report。

正式压测不建议开启大量图形监听器,因为会消耗资源。

正式压测建议保存结果到 jtl 文件,再离线分析。

十一、脚本调试流程

  1. 单线程跑通;
  2. 校验请求参数;
  3. 校验关联变量;
  4. 校验断言;
  5. 小并发试跑;
  6. 逐步加压;
  7. 正式压测。

不要脚本没调通就直接高并发压测。

十二、面试回答模板

如果面试官问“JMeter 压测脚本怎么设计”,可以这样回答:

我设计 JMeter 脚本会先明确压测目标和业务链路,再搭建线程组,设置线程数、ramp-up 和持续时间。公共域名和超时时间放在 HTTP Request Defaults,请求头通过 Header Manager 管理。对于登录态,会先调用登录接口,用 JSON Extractor 提取 token,后续请求通过 ${token} 引用。测试数据用 CSV Data Set Config 参数化,避免多个线程使用同一账号或同一订单数据。业务链路用 Transaction Controller 统计整体响应时间,并添加响应断言或 JSON 断言校验业务 code。调试时先单线程跑通,再小并发验证,最后逐步加压,正式压测时减少图形监听器,保存 jtl 结果用于分析。

十三、常见追问

追问:JMeter 线程数等于并发用户数吗?

可以近似理解为虚拟用户数,但真实并发还和请求响应时间、思考时间、循环方式有关。

追问:为什么要参数化?

避免所有线程使用同一数据造成数据冲突、缓存命中或业务不真实。

追问:为什么正式压测不建议开 View Results Tree?

图形监听器会占用大量内存和 CPU,影响压测机性能。

十四、练习清单

  1. 创建线程组;
  2. 设置 ramp-up;
  3. 添加 HTTP 请求;
  4. 配置 Header;
  5. 配置 CSV 参数化;
  6. 使用 JSON Extractor;
  7. 添加响应断言;
  8. 使用事务控制器;
  9. 添加定时器;
  10. 保存 jtl 结果。

JMeter 脚本设计的核心是模拟真实业务、保证数据正确、断言业务成功,并且让结果可分析。

配套刷题: