JMeter录制脚本全攻略:从零搭建性能测试自动化流水线
1. 项目概述为什么录制脚本是性能测试的“临门一脚”刚接触性能测试的新手常常会卡在第一步脚本怎么写手动在JMeter里一个个添加HTTP请求配置参数、头信息不仅效率低下还容易出错特别是面对一个包含几十上百个接口的复杂业务流程时。这时“录制”功能就成了我们的救命稻草。它就像一台“请求复印机”能自动捕获你在浏览器或App上的所有操作并将其转化为JMeter可识别的测试脚本。这不仅仅是“偷懒”更是保证脚本准确性、还原真实用户行为的关键一步。我见过不少团队因为手动编写脚本遗漏了关键参数或步骤导致压测结果完全偏离线上真实情况白白浪费了资源和时间。因此掌握JMeter录制脚本是性能测试工程师从入门到精通的必备技能它能让你快速搭建起压测场景的骨架把精力更集中在场景设计、参数化和结果分析这些更有价值的事情上。2. 核心思路与工具准备搭建你的录制“流水线”录制脚本的核心思路其实很简单让JMeter扮演一个“中间人”或“代理服务器”的角色。所有从客户端如你的浏览器发往目标服务器的网络请求都会先经过这个JMeter代理JMeter在转发请求的同时把请求的详细信息URL、方法、参数、头部等记录下来生成对应的测试元件。这套“流水线”要顺畅运转前期准备至关重要。2.1 JMeter的安装与环境配置工欲善其事必先利其器。首先得把JMeter请到你的电脑上。Java环境检查JMeter是基于Java开发的所以第一步是确保你的系统已经安装了JDKJava Development Kit8或以上版本。打开命令行Windows的CMD或PowerShellMac/Linux的Terminal输入java -version如果能看到版本信息说明已安装。如果没有需要先去Oracle官网或Adoptium等开源站点下载安装。下载JMeter访问Apache JMeter的官方网站jmeter.apache.org进入“Download”区域。这里我强烈建议下载“Binaries”版本下的.zip压缩包例如apache-jmeter-5.6.3.zip而不是“Source”版本。对于绝大多数用户二进制版本开箱即用是最佳选择。解压与启动将下载的.zip文件解压到你喜欢的任意目录比如D:\Tools\apache-jmeter-5.6.3。进入解压后的bin目录你会看到启动脚本Windows双击jmeter.bat。首次启动可能会稍慢并会打开一个命令行窗口不要关闭它和JMeter的图形界面GUI。Mac/Linux在终端中进入bin目录执行./jmeter命令。注意很多新手会困惑于弹出的命令行窗口。这个窗口是JMeter的运行日志输出窗口如果JMeter GUI关闭了这个窗口也会自动关闭。切勿直接点击窗口的关闭按钮来退出JMeter这可能导致非正常退出。正确做法是在JMeter GUI界面点击菜单栏的“文件”-“退出”。2.2 理解HTTP(S) Test Script Recorder安装好JMeter后我们就要认识今天的主角HTTP(S) Test Script Recorder。它在JMeter中被称为“非测试元件”意思是它不直接参与测试执行而是用于辅助构建测试脚本。它的工作原理就是前面提到的“代理模式”。当你启动它时JMeter会在本地开启一个代理服务默认端口8888。你需要将浏览器或手机的代理设置指向这个服务。此后你的所有HTTP/HTTPS流量都会流经JMeter它便能一一捕获。这里有一个关键点对于HTTPS流量由于涉及加密直接代理会报错。因此JMeter在首次启动录制器时会提示你安装一个自签名的根证书到你的系统或浏览器受信任的根证书颁发机构中。只有信任了这个证书JMeter才能解密HTTPS流量并进行录制。这是录制HTTPS网站必不可少的一步过程是安全的因为证书仅用于本地调试。3. 录制流程步步拆解从零生成你的第一个脚本理论讲完我们进入实战环节。假设我们要对一个简单的电商网站首页浏览、登录、查看商品详情的流程进行录制。3.1 创建测试计划与线程组启动JMeter你会看到一个默认的“测试计划”。可以给它重命名为一个有意义的名称比如“电商核心流程录制”。右键点击“测试计划” - “添加” - “线程用户” - “线程组”。线程组是JMeter脚本的容器所有录制的请求都会放在它下面。我们可以将线程组命名为“录制容器”。3.2 配置并启动HTTP(S) Test Script Recorder右键点击“测试计划” - “添加” - “非测试元件” - “HTTP(S) Test Script Recorder”。这个元件会被添加到测试计划层级与线程组并列。关键配置项详解端口默认8888。你可以修改但要记住这个端口号后续配置代理要用到。目标控制器这是一个极其重要的选项。点击下拉框选择我们刚才创建的“录制容器”线程组。这意味着所有录制下来的请求都会自动被放入这个线程组中。如果不设置录制的请求会散落在测试计划根目录难以管理。分组建议选择“每个组放入一个新的控制器”。这样每个不同页面的请求会自动被归类到一个个“事务控制器”下结构更清晰。请求过滤点击“请求过滤”标签页。这里是保证脚本干净、高效的关键。包含模式添加.*\.(html|php|asp|jsp|do|action)。这表示只录制这些动态页面请求过滤掉图片、CSS、JS等静态资源。静态资源通常由CDN处理压测后端接口时不需要。排除模式可以添加.*\.(js|css|png|jpg|gif|ico|woff|woff2)来双重保险排除静态资源。Content-type过滤如果你主要测试RESTful API可以在“包含”里添加application/json在“排除”里添加空值。这样能精准录制到API请求。3.3 配置浏览器代理并安装根证书安装JMeter根证书在HTTP(S) Test Script Recorder界面点击“Start”按钮。第一次启动时JMeter会弹窗提示并在bin目录下生成一个名为ApacheJMeterTemporaryRootCA.crt的证书文件。你需要将这个证书安装到系统的受信任根证书颁发机构。Windows双击.crt文件选择“安装证书”存储位置选择“本地计算机”下一步选择“将所有的证书都放入下列存储”点击“浏览”选择“受信任的根证书颁发机构”然后完成。Mac双击.crt文件会打开“钥匙串访问”应用。找到该证书默认会添加到“登录”钥匙串。你需要将其拖拽到“系统”钥匙串然后双击该证书在“信任”设置里将“使用此证书时”设置为“始终信任”。配置浏览器代理以Chrome浏览器为例推荐使用或Firefox。安装“SwitchyOmega”这类代理管理插件是最高效的方式。新建一个情景模式代理协议为HTTP代理服务器为127.0.0.1如果JMeter在本机端口为8888。或者也可以使用系统代理设置。但使用插件可以灵活切换不影响其他网络活动。3.4 执行用户操作并完成录制确保HTTP(S) Test Script Recorder已启动按钮显示为“Stop”并且浏览器代理已正确指向JMeter端口8888。在浏览器中访问你的目标网站例如http://demo.testfire.net这是一个经典的测试银行网站。开始模拟用户操作输入网址回车 - 在首页点击登录链接 - 输入用户名密码点击登录 - 登录成功后点击某个账户详情。观察JMeter的“录制容器”线程组下会实时地、像录像一样生成一个个HTTP请求采样器并且根据你的“分组”设置可能还生成了“事务控制器”来组织这些请求。操作完成后回到JMeter点击“Stop”按钮停止录制。务必记得在浏览器中关闭或切换掉代理设置否则你的浏览器将无法正常上网。4. 录制后脚本的优化与增强直接录制的脚本只是一个“毛坯房”离可以用于正式压测的“精装房”还有距离。我们必须对其进行优化。4.1 清理与组织脚本结构录制的脚本通常包含很多我们不需要的请求比如favicon.ico、广告追踪、第三方统计脚本等。我们需要手动检查并删除这些无关请求。同时利用JMeter的“逻辑控制器”来优化结构事务控制器将一系列相关的操作如“登录流程”访问登录页、提交登录表单、跳转首页放入一个“事务控制器”中。这样在生成报告时可以统计整个事务的响应时间、成功率等业务意义更强。仅一次控制器将只需要在测试开始时执行一次的操作放进去比如“获取登录Token”或“读取全局配置”。循环控制器对需要重复操作的步骤进行包装。4.2 关键步骤参数化与关联这是将“死脚本”变“活”的灵魂操作。参数化脚本中的固定值如用户名、密码、商品ID需要替换为变量。例如登录请求中的用户名和密码不应该硬编码。使用CSV数据文件创建一个users.csv文件包含多行用户名和密码。在JMeter中添加“CSV数据文件设置”元件指定文件路径和变量名如USER,PASS。在登录请求中将用户名和密码字段的值改为${USER}和${PASS}。这样JMeter在运行时就会从文件中读取不同的数据模拟多个真实用户。使用用户定义的变量对于一些全局的、不变的值如基础URL可以放在“用户定义的变量”中方便统一管理。关联这是录制脚本中最容易出错也最重要的部分。很多请求的参数依赖于前一个请求的响应。例如登录后服务器返回一个sessionId或token后续所有请求都需要在请求头中携带这个token。后置处理器在登录请求下添加一个“正则表达式提取器”或“JSON提取器”。正则表达式提取器如果响应是文本或HTML用正则表达式匹配出token的值并保存到一个变量如MY_TOKEN中。JSON提取器如果响应是JSON格式这是更简单直接的方式。指定JSON路径表达式如$.data.token将提取的值存入变量。引用变量在后续需要token的请求中在HTTP信息头管理器或参数中以${MY_TOKEN}的形式引用它。4.3 添加断言与监听器断言用于验证请求是否成功。仅仅收到HTTP 200响应并不代表业务成功。例如登录请求可能返回200但响应体里是{code: -1, msg: 密码错误}。我们需要添加“响应断言”检查响应体中是否包含“登录成功”等关键字或者JSON路径断言检查code字段是否为0。断言失败的请求在结果树中会标记为失败这对于分析测试结果至关重要。监听器用于查看结果。录制调试阶段“查看结果树”是必不可少的它能让你看到每个请求和响应的详细信息。但正式压测时务必禁用或删除所有监听器因为监听器会消耗大量内存和IO严重影响压测机性能导致结果失真。正式压测应使用“简单数据写入器”将结果写入CSV或JTL文件事后再用“聚合报告”等监听器进行分析。5. 高级技巧与避坑指南掌握了基础流程再来看看那些“教科书上不会写”的实战经验和坑。5.1 移动端App脚本录制录制手机App的脚本原理相同但操作环境在手机上。确保手机和运行JMeter的电脑在同一个局域网。在JMeter中启动HTTP(S) Test Script Recorder记下电脑的局域网IP如192.168.1.100和端口8888。在手机的Wi-Fi设置中修改当前连接的Wi-Fi网络配置代理为“手动”服务器主机名填写电脑的IP端口填写8888。在手机浏览器中访问http://电脑IP:8888下载并安装JMeter提供的根证书步骤同浏览器。操作你的AppJMeter即可捕获请求。注意部分App使用了证书绑定SSL Pinning技术会拒绝JMeter的自签名证书导致无法录制。这种情况需要更复杂的处理如对App进行逆向修改这超出了基础范围。5.2 处理动态参数与加密请求现代Web应用大量使用动态Token如CSRF Token、防重放Nonce和前端加密。直接录制的脚本第二次回放就会失败因为Token已过期或参数不对。动态Token通常隐藏在登录页的HTML表单或某个初始化接口的JSON响应里。用“正则表达式提取器”或“JSON提取器”把它抓出来在提交请求时作为参数传递。前端加密如果密码等参数在前端被加密了常见于RSA公钥加密录制到的是加密后的密文。直接回放看似可以但如果你想参数化不同密码就行不通了。这时需要让开发提供加密的JavaScript函数或者使用JMeter的JSR223预处理器调用相同的加密算法来生成密文。这是性能测试中的高级课题需要一定的开发能力。5.3 常见问题排查表问题现象可能原因解决方案启动录制器报Address already in use: connect端口8888被其他程序如其他JMeter实例、Charles、Fiddler占用。1. 在CMD用netstat -ano | findstr :8888查找占用进程并结束它。2. 修改JMeter录制器的端口号比如改为8899并同步修改浏览器代理设置。浏览器无法上网或访问HTTPS网站提示不安全1. 浏览器代理设置错误。2. JMeter根证书未安装或未受信任。1. 检查代理IP和端口是否正确JMeter录制器是否已启动。2. 重新安装JMeter根证书到“受信任的根证书颁发机构”并重启浏览器。录制不到任何请求1. 目标控制器未设置。2. 请求过滤规则过于严格把目标请求排除了。3. 手机录制时电脑防火墙阻止了连接。1. 检查“目标控制器”是否指向了正确的线程组。2. 暂时清空“请求过滤”中的所有规则录制成功后再逐步添加过滤。3. 临时关闭电脑防火墙或添加入站规则允许8888端口。回放脚本失败提示404或500错误1. 录制的请求中包含主机名/IP但环境变了。2. 缺少必要的Cookie或Session。3. 动态参数如Token未处理。1. 使用“HTTP请求默认值”元件统一设置协议、服务器名称和端口。2. 添加“HTTP Cookie管理器”JMeter会自动管理Cookie。3. 检查并实现参数关联提取动态Token。压测时JMeter GUI卡死或无响应在GUI模式下进行高并发压测监听器如查看结果树实时渲染消耗巨大资源。绝对不要在GUI模式下进行正式压测使用命令行模式jmeter -n -t yourscript.jmx -l result.jtl。用非GUI模式运行将结果输出到文件事后用GUI打开聚合报告分析。5.4 性能测试脚本的“健康检查”一个优化好的脚本在投入正式压测前应该通过以下检查去冗余是否删除了所有不必要的请求静态资源、第三方调用参数化所有用户相关的数据登录凭据、搜索关键词是否都已参数化并准备了足够多样本量的数据文件关联所有依赖前序响应的参数Token、ID是否都已正确提取并传递断言每个关键业务请求是否都添加了业务层面的断言而不仅仅是HTTP状态码超时与重试是否设置了合理的连接超时、响应超时对于非幂等操作如支付要谨慎使用重试逻辑。资源清理是否在测试计划中添加了“后置线程组”或使用“BeanShell采样器”来清理测试数据如注销用户、删除测试订单这对于可持续的自动化测试尤为重要。录制脚本是起点而非终点。它快速给了我们一个可工作的原型但将其打磨成一个稳定、可靠、可重复使用的性能测试资产需要投入大量的精力在参数化、关联和结构调整上。这个过程本身就是对被测系统接口和业务逻辑的一次深度梳理其价值远大于生成脚本本身。我个人的习惯是录制生成基础脚本后会花数倍的时间来优化和增强它因为一个健壮的脚本是后续所有性能分析和容量评估工作的基石。

相关新闻

从零搭建可私有化部署的AI Agent:Hermes三层记忆架构与实战指南

从零搭建可私有化部署的AI Agent:Hermes三层记忆架构与实战指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 最近在尝试将 AI Agent 从“玩具”升级为“生产力工具”时,发现了一个普遍痛点:很多教程要么停留在概念和 API…

2026/7/6 9:53:09 阅读更多 →
Python+Selenium UI自动化测试框架搭建:从PO模式到Pytest实战

Python+Selenium UI自动化测试框架搭建:从PO模式到Pytest实战

1. 项目概述与核心价值 最近在团队里做技术复盘,发现很多测试同学在尝试UI自动化时,总是一上来就埋头写脚本,结果代码越写越乱,维护成本高到离谱,最后项目不了了之。这让我想起几年前自己踩过的那些坑,所以…

2026/7/6 9:49:00 阅读更多 →
Kimi    LeetCode 3495. 使数组元素都变为零的最少操作次数 Rust实现

Kimi LeetCode 3495. 使数组元素都变为零的最少操作次数 Rust实现

这是 LeetCode 3495 的 Rust 实现。题目理解- 每个查询 [l, r] 定义数组 nums [l, l1, ..., r] - 每次操作选两个数 a, b,替换为 ⌊a/4⌋ 和 ⌊b/4⌋ - 求将所有元素变为 0 的最少操作次数核心思路一个数 x 变为 0 需要的操作次数是满足 4^p > x 的最小 p&#…

2026/7/6 9:49:00 阅读更多 →

最新新闻

Linux防火墙端口管理:firewalld、iptables、ufw 3种方案深度对比与选择指南

Linux防火墙端口管理:firewalld、iptables、ufw 3种方案深度对比与选择指南

Linux防火墙端口管理:firewalld、iptables、ufw 3种方案深度对比与选择指南在Linux服务器管理中,防火墙配置是确保系统安全的关键环节。面对不同的发行版和业务需求,系统管理员常常需要在firewalld、iptables和ufw这三种主流防火墙工具之间做…

2026/7/6 10:44:32 阅读更多 →
可视化指挥闭环:城市安防视频孪生时空感知技术详解

可视化指挥闭环:城市安防视频孪生时空感知技术详解

可视化指挥闭环:城市安防视频孪生时空感知技术详解摘要传统城市安防指挥体系存在视频孤岛、时空基准割裂、预警处置脱节、调度无空间量化支撑、事后复盘证据碎片化五大核心痛点,指挥链路停留在“看画面、接警情、人工派单”的线性被动模式,无…

2026/7/6 10:44:32 阅读更多 →
如何快速上手eulerfs-test:从配置到执行的完整教程

如何快速上手eulerfs-test:从配置到执行的完整教程

如何快速上手eulerfs-test:从配置到执行的完整教程 【免费下载链接】eulerfs-test test scripts for eulerfs 项目地址: https://gitcode.com/openeuler/eulerfs-test 前往项目官网免费下载:https://ar.openeuler.org/ar/ eulerfs-test是openEul…

2026/7/6 10:42:30 阅读更多 →
DedeCms CVE-2024-3148漏洞深度剖析:从SQL注入原理到实战修复

DedeCms CVE-2024-3148漏洞深度剖析:从SQL注入原理到实战修复

1. 项目概述:一次典型CMS漏洞的深度剖析最近在梳理一些老牌内容管理系统(CMS)的安全状况时,DedeCms的一个编号为CVE-2024-3148的漏洞引起了我的注意。这个漏洞发生在makehtml_archives_action模块,是一个典型的SQL注入…

2026/7/6 10:42:30 阅读更多 →
Plone 5 Templates插件:非技术人员的内容结构化编辑方案

Plone 5 Templates插件:非技术人员的内容结构化编辑方案

1. 项目概述:为什么“Templates”插件是Plone 5内容编辑体验的真正分水岭 你有没有在Plone后台编辑页面时,被内容编辑器卡住过?不是因为不会写,而是因为——明明想加一个带图标、标题和三段文字的“服务亮点模块”,结果…

2026/7/6 10:36:18 阅读更多 →
微信公众号网页授权全流程实战:从OAuth2.0原理到本地调试与线上部署

微信公众号网页授权全流程实战:从OAuth2.0原理到本地调试与线上部署

1. 项目概述:为什么网页授权是公众号开发的“敲门砖”如果你正在开发一个需要用户在微信内访问的H5页面,并且希望获取用户的微信身份信息来实现自动登录、个性化展示或者支付等功能,那么“微信公众号网页授权”就是你绕不开的一道坎。这不仅仅…

2026/7/6 10:36:18 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻