ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

JMeter脚本录制实战:从代理配置到证书安装全流程指南

JMeter脚本录制实战:从代理配置到证书安装全流程指南 JMeter 脚本录制这件事很多新手第一步就卡住了。明明按照网上的教程一步一步走浏览器怎么也打不开页面或者打开之后 JMeter 里一个请求都没有再要么全是红色报错。我早期刚接触 JMeter 的时候也在这上面折腾了好几天后来把所有环节拆开一个个排查才发现绝大多数问题都出在环境配置、证书安装和浏览器代理设置这三件事上。这篇文章就把我自己录制的完整流程和踩过的坑都写出来帮你快速跑通 JMeter 脚本录制这条路。1. 录制前必须搞清楚的三件事1.1 脚本录制的本质是什么很多初学者会把 JMeter 脚本录制想得很神秘其实它的本质非常简单JMeter 在你电脑上启动一个代理服务器然后你让浏览器把所有请求都走这个代理JMeter 作为中间人把请求“看”一遍并记录下来最后整理成测试脚本。这个原理和抓包工具是一样的。你平时用 Charles、Fiddler 抓 App 的请求抓到的就是 HTTP/HTTPS 报文。JMeter 干的是同样的事只不过它把抓到的请求直接转换成了自己的线程组采样器结构省去了手工抄写接口参数的时间。理解了这一点后面的操作就有方向了。录制只是手段最终目的是拿到一份可以被压测或功能验证的脚本。所以录制完了不是结束还要对脚本做过滤、参数化、断言等一系列处理这块我在第 4 节会详细讲。1.2 不同录制方案的优缺点对比JMeter 官方对脚本录制提供的标准方案是 HTTP 代理服务器但实际工作中我见过不少人用别的方式我也尝试过各种方案这里把它们的优劣列出来方便你按自己的场景选。录制方案优点缺点适用场景HTTP 代理服务器官方原生支持无需额外安装软件可录制 HTTPS 请求配置步骤多需要处理证书需要设置浏览器代理最通用推荐新手掌握Badboy / Selenium 等工具录制可视化操作录制能生成部分 JMeter 脚本已停止维护或兼容性差生成的脚本结构混乱老教程常用现在不建议手工编写脚本脚本结构清晰参数可控没有录制垃圾请求需要完整掌握接口文档编写效率低接口文档完善的场景抓包工具转脚本可以用 Charles 等工具抓包后手工转成 JMeter 请求转换工作量大不如直接用代理录制方便移动端抓包辅助分析时我个人的建议是新手第一遍老老实实走 HTTP 代理服务器方案。这个方案虽然步骤多但每一步都是 JMeter 常用的基础操作你把这些操作练熟了后面遇到问题才会知道病灶在哪里。1.3 环境准备JDK 与 JMeter 安装在开始录制之前先把环境装好。JMeter 是纯 Java 应用所以第一步是装 JDK。很多新手一上来就装 JMeter结果双击启动脚本没反应十有八九是 JDK 没装或者版本不匹配。JDK 版本选择上JMeter 5.x 系列要求 JDK 8 及以上JMeter 5.5 之后建议 JDK 8 或 JDK 11最新的 JMeter 5.6 则要求 JDK 8 以上且推荐 11 或 17。保守起见装 JDK 11 是比较稳的选择兼容性最好。装完 JDK 后在命令行输入java -version能看到版本号就说明环境没问题。接着去 Apache JMeter 官网下载压缩包Windows 选择 zip 包Linux 和 Mac 选择 tgz 包。下载后直接解压即可不需要安装。进入bin目录Windows 下双击jmeter.bat启动Mac/Linux 下运行sh jmeter启动。启动后如果界面字体太小可以在jmeter.bat或jmeter启动脚本里调整JVM_ARGS或者直接在 Options 菜单里改外观和字号。2. 录制前的基础配置细节2.1 线程组与测试计划的创建规范录制前先理清测试计划的结构不要一上来就随便录。我是习惯先在测试计划上把用途写清楚再创建线程组。右键测试计划选择“添加 - 线程用户 - 线程组”线程组里有几个关键参数录制阶段不用管得太细但可以顺手设置一个合理值。线程数代表模拟多少个用户Ramp-Up 时间代表多少秒内启动完这些用户循环次数代表每个用户跑几遍。录制阶段填线程数 1、Ramp-Up 1、循环次数 1 就够了毕竟只是录脚本不是压测。等你脚本整理好了再回去调这些参数做真正的压力测试。另外提醒一下测试计划里有一个“独立运行每个线程组”的选项如果你一个计划里建了多个线程组比如登录线程组、业务线程组、清理线程组建议勾选这个选项让它们按顺序执行。录制阶段虽然用不上但提前养成好习惯可以少踩后面的坑。2.2 HTTP 代理服务器的参数选择技巧这是录制最核心的一步。右键线程组选择“添加 - 非测试元件 - HTTP 代理服务器”打开之后你会看到几个关键配置项。全局设置里端口号默认是 8888这个端口就是 JMeter 代理监听的端口你等会儿要在浏览器里填的代理端口就是它。如果你的 8888 端口被其他程序占了可以改成 8889 之类的但要注意改完之后浏览器那边也要跟着改。目标控制器选择你刚才创建的线程组这样录制的请求才会归到线程组下面不然会堆在测试计划根节点上整理起来非常麻烦。请求筛选部分我强烈建议在录制前就配置好“排除模式”把图片、CSS、JS、字体这类静态资源排除掉。常见的小尾巴包括.*\.js、.*\.css、.*\.png、.*\.jpg、.*\.ico、.*\.gif。这样录出来的脚本干净很多不用录制完再去手动删一大堆无用的请求。HTTPS 抓包的地方有一个“HTTPS 安全证书”区域里面能设置证书有效期天数默认 7 天。录制 HTTPS 脚本必须让 JMeter 生成一个 CA 证书然后导入到浏览器或系统里。录制开始前先点一下下面的“生成根 CA 证书”按钮JMeter 会在用户主目录的apache-jmeter/bin或库目录里生成一个ApacheJMeterTemporaryRootCA.crt文件待会儿要用。提示代理服务器录制完成后记得点击“停止”按钮不然代理会一直占用端口后面其他工具想用这个端口会报占用错误。2.3 HTTPS 证书安装的关键细节HTTPS 脚本录制绕不开证书这一步这也是新手最头疼的地方。HTTP 代理录制 HTTP 请求时不需要证书但一旦录制 HTTPS 页面浏览器会提示“您的连接不是私密连接”或者“代理服务器证书无效”这就是因为浏览器不信任 JMeter 生成的这个临时 CA 证书。解决办法取决于你用的是什么浏览器。Chrome 和 Edge 都是调用系统证书库所以要把证书导入到操作系统里。以 Windows 为例双击那个.crt文件选择“安装证书”存储位置选“本地计算机”然后选择“将所有证书都放入下列存储”点击“浏览”选择“受信任的根证书颁发机构”一路下一步完成导入。Firefox 比较特殊它自己维护一套证书库不走系统证书。即使你导入到 Windows 系统里Firefox 依然会报错。要么你干脆不用 Firefox 录制要么就在 Firefox 的设置里搜索“证书”打开“查看证书”面板在“证书颁发机构”标签页里导入 JMeter 生成的证书并勾选“信任由此证书颁发机构来标识网站”。证书导入成功后浏览器地址栏仍然可能出现锁上带感叹号的标志这是正常的因为是自签名证书。只要你没有收到代理错误提示说明代理连通了可以正常开始录制。3. 录制实操全流程3.1 浏览器代理设置的标准姿势证书处理完了下一步是让浏览器把请求转给 JMeter 代理。这里很多人会用错方法我直接说标准操作。在 Chrome 地址栏输入chrome://settings搜索“代理”打开“打开您计算机的代理设置”。在“手动设置代理”区域把“使用代理服务器”开关打开地址填127.0.0.1端口填8888也就是你在 JMeter HTTP 代理服务器里配置的那个端口。设置好之后点保存。这里有个容易忽略的细节代理设置完成之后不要急着点 JMeter 的“启动”按钮。我建议先确认一下 JMeter 代理有没有启动再操作浏览器打开目标网站。不然代理开着但 JMeter 没启动浏览器会一直转圈打不开页面新手还以为是自己网络断了折腾半天才发现是顺序错了。正确的录制顺序是先在 JMeter 里启动 HTTP 代理服务器看到日志区域打印出“Proxy up and running at port 8888”之类的信息再操作浏览器访问目标站点。这样请求一产生就能被 JMeter 捕获到。3.2 录制过程中的操作节奏控制录制开始后你要像正常用户一样操作被测系统。但这里有一个节奏问题很多人录完发现请求乱成一团或者数据不对就是因为录制时操作太快、路径太乱。建议录制前先列一下操作路径。比如你要录一个订单提交流程就先在纸上或者脑子里排好顺序登录 - 进入商品列表 - 搜索商品 - 查看详情 - 加入购物车 - 提交订单 - 支付 - 查看订单状态。录的时候严格按照这个顺序一步步来每做完一个动作稍微停顿一两秒让浏览器把该发的请求都发完JMeter 完整捕获后再进行下一步。为什么强调这个因为 JMeter 录制是按时间顺序记录请求的如果你在操作过程中频繁切换页面、刷新、点错按钮录制出来的脚本里会混入大量无关请求后面整理脚本的时候你还要一个个判断哪个是核心请求非常浪费时间。录制的过程中JMeter 的左侧树形结构会实时出现请求节点你可以一边录一边瞄一眼看请求有没有正常进来。3.3 HTTPS 请求录制失败的高频原因录制 HTTPS 请求时如果发现 JMeter 里面没有捕获到请求或者浏览器一直报“代理服务器出现问题”之类的错误先不要急按下面这个顺序排查我遇到过的基本都能对上号。第一确认 JMeter 代理端口和浏览器代理端口是否一致。这个看起来简单但真的会有人 JMeter 里填了 8888浏览器那边填 8080那肯定录不到。第二确认证书导入的浏览器和当前录制用的浏览器是同一种。这里特别提醒有些人用 Chrome 导入证书然后又拿 Edge 或者 Firefox 去录制证书不通用就会失败。特别是不用 Firefox 录制它的证书库独立很容易出这种低级错误。第三确认 JDK 版本。早期我用 JDK 8 录制 HTTPS 脚本时一切正常但有些高版本 JDK 对 TLS 协议的支持有变化。如果你录制时浏览器立刻报“ERR_SSL_PROTOCOL_ERROR”之类的错可以试试换 JDK 11 或者调整 JMeter 的系统属性来放宽 TLS 版本。第四检查杀毒软件和防火墙。有些杀毒软件会监测本机代理拦截浏览器的代理流量。录制的时候可以临时退出安全软件或者把 JMeter 加白名单录制完再恢复。4. 录制完成后的脚本清洗与优化4.1 过滤无用的静态资源请求录制完成后线程组下面会有一大串请求其中很大一部分是图片、样式表、脚本文件。这些静态资源在功能测试里无关紧要在压力测试时又会增加无谓的负载所以必须清理。如果在录制前你已经在 HTTP 代理服务器的“排除模式”里加好了过滤规则那这一步会轻松很多。但如果当时没加现在也可以在录制完统一处理。选中线程组下面的请求节点按请求路径排序看到png、jpg、css、js、ico、woff结尾的请求直接右键删除。另外一个隐藏静态资源是接口里的埋点请求。很多网站会频繁上报用户行为数据比如点击事件、页面停留时间、浏览轨迹等。这些请求在录制时也会被完整捕获但它们并不是被测业务的核心链路压测时可以不包含。判断方法很简单看请求路径里有没有类似的 tokencollect、report、track、log、analyse。清洗的原则是把自己关心的业务链路上的请求留下其他全部清掉。不要怕删错后面跑脚本的时候发现缺了什么再单独补请求就行。4.2 参数化录制的脚本不能直接压测录好的脚本直接拿去压测一定会出问题因为录制下来的参数值是写死的。比如登录请求里带着当时的用户名密码、时间戳、随机字符串、订单号等这些值对不同的压测用户来说应该是变化的写死的话服务器很快就会发现异常接口开始报错。参数化最常用的做法是从 CSV 文件读取数据。比如你的接口需要一个手机号参数你先准备一个phone.csv文件里面放几十上百个手机号。然后在 JMeter 里添加“CSV 数据文件设置”设置好文件路径和参数名称比如变量名填phone。接下来在请求参数里把原来的手机号替换成${phone}这样每次循环就会从 CSV 文件里取一个新的手机号。还有一种常见情况是关联。比如先登录拿到一个 token后面的请求都需要带上这个 token。录制时 token 是写死在请求头里的但压测时每个用户的 token 都不一样这就要用到 JMeter 的正则表达式提取器或者 JSON 提取器。先从登录响应里提取出 token存成变量再在后续请求里用${token}引用。这是脚本录制到实际可用之间最重要的一步宁可多花时间也要弄明白。4.3 断言让脚本自动判断结果对不对录制脚本跑起来后怎么知道请求到底成功没有光看响应数据太费眼睛了而且效率低。用断言来自动判断是标准做法。最常用的是响应断言。点中某个请求右键“添加 - 断言 - 响应断言”在“测试模式”里选择“响应文本”然后添加一个你确定会返回的字符串。比如登录接口成功后大概率会返回code:0或者登录成功那就把这两个词加到断言里。如果请求跑完没在响应里找到这个词断言就会失败在查看结果树里显示红叉这样一眼就能看出哪些请求有问题。性能测试里还会用到 Duration Assertion也就是持续时间断言。比如一个接口要求必须在 500 毫秒内响应超过就算不通过那就在断言里设置 500ms。这在录制后的脚本优化阶段特别有用可以直接看出每个请求的实际耗时是否达标。4.4 调试用的查看结果树组件录制完脚本首次跑通之前一定要在测试计划里加一个“监听器 - 查看结果树”。它的作用是把每个请求的请求数据和响应数据原样展示出来方便你逐条检查。我自己的调试流程是先单线程跑一遍脚本然后打开查看结果树逐个请求看响应内容确认每个请求都拿到了正常响应。遇到红色报错的请求先看“响应数据”标签页里的错误信息大多数情况能直接从里面定位到是参数写死、缺少关联还是请求头不对。定位到问题就改改完重新跑一遍直到所有请求都是绿色通过再进行后面真正的压测。等脚本稳定并开始正式压测时记得把查看结果树禁用掉因为查看结果树会把每一个响应都完整保存下来大量用户压测时会产生巨量的日志导致 JMeter 本身性能下降甚至内存溢出。5. 录制与使用过程中的常见问题5.1 问题排查速查表下面这些是录制过程中出现频率最高的问题我按症状把原因和解决办法整理成一个速查表遇到问题直接查。常见问题可能原因解决办法浏览器打不开网页代理已设置但 JMeter 代理未启动先启动 JMeter 代理再操作浏览器JMeter 中录不到任何请求代理端口不一致或浏览器未走代理核对 JMeter 与浏览器代理端口一致登录页面能打开但后续请求失败HTTPS 证书未正确导入重新导入 JMeter 生成的 CA 证书到受信任根证书库录制到的请求里中文乱码请求编码与 JMeter 默认编码不一致修改请求的 Content Encoding 为 UTF-8录完回放全部红叉录制时参数写死缺少关联做参数化用正则提取器或 JSON 提取器关联代理端口被占用上次代理没有正常停止检查 8888 端口占用进程或改用其他端口Firefox 始终提示证书无效Firefox 不走系统证书库在 Firefox 证书管理器中单独导入 JMeter 证书5.2 录制结果为空时的排查思路录了几分钟发现 JMeter 左侧树里一个请求都没有这是我最经常被问到的场景。这里给一个排查的先后顺序照着做能解决九成的问题。先看 JMeter 代理服务器有没有在运行状态。如果日志里出现了异常堆栈比如端口被占用那就先解决端口问题。再看浏览器里的代理设置有没有生效可以在浏览器地址栏输入http://ip138.com或者直接用浏览器打开一个简单页面如果页面能正常加载说明代理是通的。最后看证书是否影响到了 HTTPS 请求把目标网站地址从https://临时改成http://再试一次如果 HTTP 能录到而 HTTPS 录不到那就是证书的问题重新走一遍证书导入流程。这个排查思路的核心是先区分是“代理没通”还是“代理通了但请求没录上”。如果代理没通浏览器根本打不开网页如果代理通了但录不上那问题基本出在证书或者目标控制器配置上。5.3 回放脚本时响应报错的典型情况脚本录完、清理完成、参数化也做了回放时仍然报错怎么办这里说三个我踩得最深的场景。第一个是登录失效。录制的登录请求里可能有时效性要求比如一天后过期、验证码过期、token 过期。回放时虽然有参数化但验证码如果是从 CSV 里读的静态值而系统要求验证码实时生成那就必须处理。最直接的方案是让开发提供测试环境专用的万能验证码或者改用接口调用方式绕过验证码环节。第二个是请求头缺失。浏览器发送请求时会带上各种各样的请求头比如Referer、Origin、User-Agent、Cookie等。录制下来的脚本里确实带了这些头但有些是因为浏览器自动管理的比如Accept-Encoding: gzip。JMeter 回放时不一定会自动处理所有头字段某些字段缺失会导致服务器校验失败。遇到这种问题对照录制请求和实际浏览器请求的请求头差异把必要的头补上。第三个是数据依赖没做关联。登录返回的 token 没有提取后续请求还在用录制时的旧 token那回放必然失败。解决思路就是前面说的 JSON 提取器或正则表达式提取器。6. 从录制到压测的落地经验脚本录制只是 JMeter 学习的一个入口录好之后真正要做的是让脚本能稳定跑起来、能支撑起并发压力测试。我个人在实际操作中养成了一套固定流程分享出来供你参考。录制完成后我会先把脚本清洗干净加上必要的断言和参数化然后用单线程跑一遍确认所有请求能正常通过。接着再逐步增加线程数比如先 10 个并发跑一轮观察 TPS、响应时间和错误率。这时候如果出现错误就回过头去检查脚本而不是直接加大并发量。很多新手做压测一上来就 1000 并发脚本本身问题一堆压出来的数据没有任何参考价值还会把服务器打挂完全是在给自己埋雷。还有一点很重要录制脚本时用真实账号和真实操作路径不要刻意走极端。有些人为了让录制更快速跳过了思考时间、连续快速点击多个按钮这样录出来的脚本时间间隔太小压测出来的数据会失真。真实用户操作是有停顿、有思考时间的录制出来的脚本也应该带一些自然的间隔压测结果才更有代表性。最后再分享一个小技巧如果你录制的是一套长期需要维护的测试用例不要把所有东西都塞在一个线程组里。可以把登录单独放一个线程组核心业务放另一个线程组公共的数据准备和清理放第三个线程组用线程组之间的顺序控制来串联。这样后期维护时业务逻辑变了只需要改对应线程组不会牵一发动全身。这是我踩过很多次坑之后总结出来的经验希望对你有用。
返回列表