JMeter 可以通过充当浏览器和授权目标应用程序之间的本地录制代理来生成 HTTP 请求采样器。当前版本将此组件称为HTTP(S) 测试脚本录制器。它会将一次浏览器访问过程捕获到录制控制器中,之后必须对脚本进行清理、关联、验证,并作为协议级测试执行。
什么是 JMeter HTTP 代理服务器?
录音机监听本地端口,通常是 8888浏览器向该代理发送 HTTP 和 HTTPS 请求,JMeter 将匹配的流量转换为选定控制器下的采样器。在回放过程中,JMeter 直接发送请求,不会为每个虚拟用户启动浏览器。
为什么选择录制而不是手动编写脚本?
- 捕获真实的请求顺序、重定向、表单和后台 API。
- 揭示容易被忽略的 XHR 或 fetch 调用。
- 为复杂的用户旅程快速建立基准线。
- 减少标题和参数中的转录错误。
对于文档齐全的小型 API,手动构建仍然更简洁。当浏览器网络行为尚不明确时,录制功能会很有帮助。有关术语,请参阅我们的代理类型指南。
如何在 JMeter 5.x 中录制脚本
- 以图形用户界面模式启动 JMeter,用于创建脚本。
- 在测试计划中添加线程组。
- 在线程组下添加一个录制控制器。
- 在适当位置添加 HTTP 请求默认值和 HTTP Cookie 管理器。
- 添加 HTTP(S) 测试脚本录制器,并选择录制控制器作为其目标。
- 使用包含/排除模式来限制无关流量。
官方的Apache JMeter 录制指南是权威的、特定版本的参考资料。
步骤 1)设置 HTTP 代理服务器
8888设置目标控制器,然后单击 开始.配置测试浏览器,使其具有 HTTP 和 HTTPS 代理主机 127.0.0.1 并且使用相同的端口。如果浏览器运行在另一个虚拟机或容器中,localhost 指的是该环境;请改用已批准且可访问的私有地址。
Proxy host: 127.0.0.1
Proxy port: 8888
Include: https?://test.example.com/.*
Exclude: .*(.png|.jpg|.gif|.css|.woff2)(?.*)?$
第一次过滤不要过于激进,因为应用程序 API 可能使用其他子域名。先记录一次,检查主机,然后再优化模式。
第 2 步)记录你的活动
- 启动录制程序,并且仅在隔离的测试浏览器中信任其临时证书。
- 打开授权的测试环境。
- 以人类速度完成一次清洁行程。
- 完成最后一个业务操作后立即停止录制。
- 恢复浏览器的正常代理设置。
按业务操作重命名采样器,并将相关请求分组到事务控制器下。移除分析、广告、浏览器更新、聊天小部件和重复的静态资源,除非它们明确在范围内。
检查每个采样器是否存在秘密信息。密码应来自受保护的运行时数据,而更改令牌则需要进行关联分析。
步骤 3)运行测试计划
在添加负载之前,先验证一个用户和一个迭代。暂时使用“查看结果树”,检查重定向和响应正文,并添加断言以确保符合预期的业务结果。仅凭 HTTP 200 状态码并不能证明登录或结账成功。
Threads: 1
Ramp-up: 1 second
Loop Count: 1
调试完成后,移除占用资源较多的监听器,并运行非图形用户界面程序:
jmeter -n -t recorded-test.jmx -l results.jtl -e -o html-report
报告目录必须为新目录或为空。逐步增加负载,并监控目标系统和 JMeter。
步骤 4)保存测试结果
将可重复使用的方案保存为 .jmx 文件和生成的数据分开保存:
- JMX: 采样器、控制器、断言、定时器、变量和配置。
- JTL: 原始样品分析结果。
- HTML仪表盘: 百分位数、吞吐量、错误率和活动线程数。
- 服务器指标: CPU、内存、数据库、队列和服务遥测。
对计划进行版本控制,包括非秘密属性和测试数据。记录 JMeter 和 Java 版本、目标构建、环境、用户数量、启动时间和持续时间。
记录HTTPS流量和证书
对于 HTTPS,JMeter 会在录制器启动时生成一个临时证书颁发机构。只需将其导入到专用的测试浏览器中,录制已授权的站点,然后将其删除即可。
- 启动 HTTP(S) 测试脚本录制器。
- 找到生成的 ApacheJMeterTemporaryRootCA 证书。
- 将其作为可信权威导入到隔离配置文件中。
- 记录已批准的HTTPS访问路径。
- 完成后请移除证书。
证书绑定、双向 TLS、托管浏览器、移动应用和新型传输协议可以阻止拦截。切勿削弱生产环境的安全控制。请使用测试环境构建、API 规范或经批准的替代捕获方法。
相关性:使录制的脚本可重放
会话 ID、CSRF 令牌、OAuth 状态、请求签名和资源 ID 在每次运行之间都会发生变化。关联处理会从一个响应中提取一个新值,并将其替换到后续请求中。
- 找到第一个包含动态值的响应。
- 添加 JSON、CSS、XPath 或正则表达式提取器。
- 将结果存储在已命名的 JMeter 变量中。
- 将后续硬编码的值替换为变量引用。
- 当提取过程中未返回任何匹配项时,明确判定失败。
JSON Extractor
Variable: csrfToken
JSON Path: $.csrf.token
Default: NOT_FOUND
Later header:
X-CSRF-Token: ${csrfToken}
参数化提供独立的用户数据,通常来自 CSV 文件。关联分析则捕获执行过程中服务器生成的数据。实际的计划通常需要两者兼备。
故障排除
| 市场问题 | 可能的原因 | 固定 |
|---|---|---|
| 未记录任何请求 | 代理错误、录制器停止运行、端口冲突或绕过规则 | 确认主机和端口,启动录制器,并移除目标排除项。 |
| HTTPS 警告 | 临时CA卡缺失或已过期。 | 生成一个新的录制器证书,并仅将其导入到测试配置文件中。 |
| 交通拥堵 | 扩展程序、遥测数据、其他标签页或大致模式 | 使用干净的配置文件并优化包含/排除过滤器。 |
| 登录重放失败 | 缺少 cookie、令牌、OAuth 流程或关联信息 | 添加 Cookie 管理器、提取动态值和检查重定向。 |
| 浏览器随后离线 | 它仍然指向已停止的本地代理。 | 恢复自动或无代理设置。 |
| JMeter内存错误 | GUI监听器或大型响应存储 | 使用非图形用户界面模式并限制保存的响应数据。 |
| 与浏览器不同 | JMeter 不会渲染或执行页面 JavaScript | 测试底层 API 并使用浏览器工具渲染指标。 |
JMeter 是一款协议性能测试工具,它本身无法测量诸如最大内容绘制 (LCP) 之类的视觉事件。
常见问题
JMeter 中 HTTP 代理服务器名称被什么取代了?
该组件现在称为 HTTP(S) 测试脚本录制器。
我应该使用哪个录像机接口?
任何未使用的本地端口都可以。端口 8888 很常用,浏览器必须使用相同的端口号。
JMeter 可以记录 HTTPS 流量吗?
是的,当隔离的测试浏览器信任 JMeter 的临时记录证书时。
为什么录制好的脚本在重放时会失败?
动态令牌、cookie、身份验证流程、主机差异和缺失数据通常需要关联和参数化。
JMeter 可以录制 Chrome 浏览器吗?
是的。配置一个干净的Chrome配置文件,即可使用JMeter的本地录制器。
我应该通过 JMeter 图形用户界面运行负载测试吗?
不。先在图形用户界面模式下构建和调试,然后在非图形用户界面模式下执行加载。
JMeter 的行为是否像真正的浏览器?
不。它发送协议请求,但不渲染 HTML 或执行浏览器 JavaScript。
录制生产环境的登录信息安全吗?
建议使用测试账号和预发布账号。生产环境数据采集需要明确授权并严格保密。
