十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

JMeter性能测试实战教程:从脚本编写到报告生成与常见排查

JMeter性能测试实战教程:从脚本编写到报告生成与常见排查 JMeter 是目前后端性能测试里最常用的开源工具之一很多人的第一份性能测试脚本、第一份压测报告都是从它开始的。但“会用 JMeter”和“能完成一次有效压测”之间差的往往不是功能列表而是对线程组、参数、监听器、结果分析和排查方式的理解。这篇教程不做功能罗列直接按实际学习路线拆环境准备、第一个脚本、接口场景、命令行压测、报告生成、参数化、常见报错最后落回到岗位面试里最常被问到的性能测试概念。整个过程既可以按顺序操作也可以作为你后续做真实压测时的查漏清单。1. 先搞清楚 JMeter 到底解决什么问题以及新手最容易走偏的地方1.1 JMeter 的核心定位不是“录制脚本”而是构造并发和采集指标JMeter 是 Apache 下面的开源工具基于 Java 开发最擅长的是对 HTTP、HTTPS 接口做压力测试。说得直白一点它的核心能力就两件事一是模拟多个用户同时访问系统二是把请求的响应时间、成功失败数量、吞吐量这些指标采集出来形成结果数据。很多人第一次接触 JMeter 是想录脚本尤其是看到录制功能、代理服务器、HTTP 脚本记录器这些名词后会觉得这个工具应该是“录制回放”为主。实际上日常做后端接口压测时用手写 HTTP 请求比录制更稳定、更可控。录制适合有浏览器的 Web 端流程不适合你只想压一个登录接口或者查询接口的场景。我一般建议新手把 JMeter 先当成一个“并发请求构造器”来理解。你给它一个请求地址设置好请求方式、请求头和请求体然后告诉它模拟多少个用户、持续多长时间它就会按你的要求发起请求并把每个请求的响应数据记录下来。至于报告里面的响应时间、错误率、吞吐量都是额外计算出来的结果。1.2 常见的学习误区一味追求插件、录制和花哨功能在搜索 JMeter 相关热词时会发现很多人会问 jmeter 上传文件、jmeter 安全证书、jmeter 录制 https 脚本、jmeter jpgc - webdriver sampler 这类问题。这些确实是 JMeter 的功能但并不代表你一开始就要掌握。从我的实际经验看新手最容易被带偏的是这两个方向一个是一上来就装各种插件。JMeter 默认功能其实很够用HTTP 请求、线程组、CSV 参数化、JSON 提取器、聚合报告、HTML 报告生成这些原生能力足够完成 80% 的接口性能测试场景。插件主要解决的是服务器性能监控、图形化展示、WebDriver 自动化等扩展需求属于“进阶要学入门别碰”。另一个是非要录脚本不可。录制功能在 JMeter 里不是没有价值但它会带来大量额外元素Cookie 管理器、正则表达式提取器、各种资源请求一个页面能录出几十个请求新手根本不知道哪些是核心请求。真正做接口压测时你只需要关心被测系统的关键接口而不是把所有静态资源都压一遍。2. 环境准备JDK 版本、下载方式、启动验证2.1 先装 JDK再装 JMeter顺序不要反JMeter 是 Java 程序没有 JDK 或 JRE 无法运行。安装 JDK 时要注意版本匹配。JMeter 5.x 版本通常要求 JDK 8 或以上部分新版本推荐 JDK 11 或 JDK 17。这里不要凭记忆硬套直接在你下载的 JMeter 版本说明里确认要求即可。装完 JDK 之后建议在命令行里验证一下环境变量是否生效java -version如果提示找不到 java说明 JAVA_HOME 没配置或没生效。Windows 下确认系统环境变量里的 PATH 包含%JAVA_HOME%\binmacOS 和 Linux 下检查~/.bashrc或~/.zshrc。还有一种情况是机器上装了多个 JDK 版本命令行里输出的是旧版本导致 JMeter 启动报不兼容。遇到这种问题最直接的做法是修改 JMeter 安装目录下的bin/jmeter.batWindows或bin/jmeterLinux/macOS配置显式指定JAVA_HOME避免全局环境变量干扰。2.2 下载安装解压即用不需要复杂安装向导JMeter 官网提供两种包一种是源码包一般不需要另一种是二进制发行包Windows 下通常是 zipLinux/macOS 下也提供 tar.gz。下载二进制包解压到你想要的位置即可。Windows 启动方式进入bin目录双击jmeter.bat。macOS 或 Linux 执行sh jmeter.sh如果是第一次运行建议用命令行方式启动这样可以看到日志输出。如果 GUI 正常弹出来并且命令行没有Exception或Error级别的日志说明环境没问题。2.3 启动后的基础检查项打开 JMeter GUI 后建议先做两个简单检查第一左侧导航能看到“测试计划”节点右键可以创建线程组、HTTP 请求等元素说明插件加载正常。第二在“选项”菜单里检查语言切换是否正常。JMeter 默认可能是英文界面如果看不习惯可以改成简体中文不影响功能。如果双击没有反应最常见的原因就是 JDK 未安装或版本不匹配。先确认java -version输出版本不是 1.7 以下的旧版本。另一个隐蔽问题是磁盘路径包含中文或空格极少数情况下会导致脚本元素保存异常建议把 JMeter 解压到一个纯英文路径。3. 第一个压测脚本从最简单的 HTTP 请求开始3.1 不需要复杂逻辑先用一个公开接口跑通新手学习 JMeter 时最容易卡住的是打开工具后不知道从哪下手。这时候不要想太多直接创建四个元素线程组定义并发用户数、启动时间和执行次数HTTP 请求定义被测接口的协议、地址和参数查看结果树看单个请求的请求信息和响应信息聚合报告看整体响应时间、错误率、吞吐量先说线程组。右键“测试计划” → “添加” → “线程用户” → “线程组”打开后主要有三个参数线程数模拟多少个用户Ramp-up 时间多少秒内启动完所有线程循环次数每个线程执行多少次请求这三个参数要连起来理解。如果线程数设为 100Ramp-up 设为 10意思是 10 秒内逐步把 100 个线程都启动起来。循环次数设为 1就是每个线程跑 1 次请求总请求数就是 100 次。不要只关注线程数而忽略循环次数因为实际压测时总请求量是这两个参数共同决定的。3.2 HTTP 请求怎么填在刚开始做接口测试时我不会找特别复杂的系统一般直接用 GET 请求验证。你可以填一个自己项目中准备测试的环境地址也可以先用本地调试服务或者公开的接口来验证 JMeter 流程。协议、服务器名称或 IP、端口、路径这四项是核心。如果接口是 RESTful 风格还需要在参数部分填请求参数。需要注意一个细节查看结果树的“响应数据”能直观看到接口返回的内容但如果你请求的是 HTTPS 接口并且对方用了自签证书JMeter 可能会提示证书不可信。这个问题并不难解决但你应该先分清是证书问题还是网络问题。如果只是本地做接口调试更稳妥的做法是先用 HTTP 接口跑通整个流程。3.3 聚合报告里每一项指标到底怎么看跑完一次压测后聚凌报告会有几个重要指标这里需要看懂而不是只看有没有请求成功Samples请求总数Average平均响应时间Min / Max最短、最长响应时间Std.Dev.响应时间标准差值越大说明波动越明显Error %错误率Throughput吞吐量单位通常是 requests/sec我一般会先看 Error% 和 Average。如果错误率很高说明接口本身有问题或者测试环境压力已经超过系统的处理能力。如果错误率为 0但平均响应时间已经高到不满足预期那就要继续加压力找到系统的瓶颈点。不要只跑一次就下结论。性能测试最少跑三次以上取趋势稳定的结果。如果第一次平均响应时间是 200ms第二次变成 800ms那首先要看测试环境是否被别人占用了而不是急着调 JMeter 参数。3.4 “单用户跑 1 分钟”这个操作是在验证什么搜索热词里出现了 jmeter 单用户1分钟这个操作在实际工作中很常用。它的核心目的不是测并发而是验证脚本稳定性和接口基线性能。实现方式很简单线程数设为 1循环次数设为永远勾选调度器设置持续时间Duration为 60 秒。这样 JMeter 会以 1 个用户持续发送请求 1 分钟。单用户跑 1 分钟的好处有三个第一确认脚本本身不会报错第二观察单请求时间是否稳定第三给后续并发测试提供一个基础参照。如果单用户下去响应时间都忽高忽低那问题大概率不在 JMeter 配置而在被测系统或测试数据上。4. 接口常见场景POST 请求、上传文件、JSON 提取器与关联4.1 从 GET 到 POST请求头、请求体怎么配置很多接口不只是简单的 GET 请求。做登录、提交订单、保存配置时通常都是 POST 请求并且需要在请求体中传递 JSON 数据。在 JMeter 里添加一个 HTTP 请求选择 “POST” 后有两个地方要关注一个是通过“参数”页签添加键值对适合表单提交。另一个是通过“Body Data”页签发 JSON 字符串适合接口要求application/json的情况。如果接口要求请求头里带Content-Type: application/json建议在 HTTP 请求下添加一个 HTTP Header 管理器复用性更好。一个线程组里的多个请求可以共用同一个 Header 管理器。不要默认所有接口都只加 Content-Type 就行。还是需要看接口文档有些接口还需要加 Authorization、Token、User-Agent 等头信息。4.2 上传文件核心在 Files Upload 页签jmeter 上传文件这个场景主要出现在文件上传接口的压测中。操作方法是在 HTTP 请求里找到 “Files Upload” 页签填入文件路径本地文件绝对路径参数名称接口要求的上传字段名通常是 fileMIME 类型根据文件类型填比如image/jpeg、application/zip同时要注意请求方式一般是 POST并且不要手动去加Content-TypeJMeter 在文件上传时通常会自动生成带 boundary 的 multipart 请求头。如果你手动加上普通 Content-Type反而可能导致上传失败。4.3 JSON 提取器登录后拿到 Token再调其他接口压测登录接口之后通常还要拿返回里的 Token 去请求查询接口或业务接口。这个过程叫关联意思是后一个请求的某个参数值来自前一个请求的响应结果。JMeter 里最常用的是 JSON 提取器。添加路径右键 HTTP 请求 → 添加 → 后置处理器 → JSON ExtractorJSON 提取器。关键配置是Apply to一般选 Main sample onlyNames of created variables变量名比如 tokenJSONPath expressions对应响应体里的路径比如$.data.tokenDefault Values提取失败时的默认值建议填一个不会导致后续请求误成功的值方便你发现提取失败后续请求需要用到 Token 时直接写成${token}。如果 Token 放在请求头里就在 Header 管理器里写Authorization: Bearer ${token}。4.4 最常见的提取失败原因JSON 提取器报错的概率不低但大部分不是工具问题而是响应结构判断错误。第一个原因路径写错。比如响应里数据可能在$.data.token你写成了$.token结果提取到空值。第二个原因没有确认响应格式。如果接口返回的不是 JSON而是 XML 或纯文本JSON 提取器就无能为力需要改用正则表达式提取器。第三个原因没有开启“查看结果树”中的响应数据。压测时响应数据本来就值得先看一步。我一般会先用查看结果树确认返回里确实有 token 字段再去做提取器配置。5. 用命令行模式跑压测并生成 HTML 测试报告5.1 为什么大并发压测不能用 GUI 跑GUI 模式跑一个小流程没问题但真正做并发压测时我建议尽量用命令行模式。原因很简单JMeter 本身在 GUI 模式下会消耗内存和 CPU得像渲染界面、刷新曲线图这些都会占用掉本该用来施压的资源。还有一个风险压测规模比较大的时候GUI 界面容易出现卡顿、无响应甚至导致测试结果丢失。所以生产级压测、长时间稳定性测试都要在命令行模式下执行。5.2 命令行压测的标准写法JMeter 命令行模式的基本格式jmeter -n -t test_plan.jmx -l result.jtl -e -o report_dir四个核心参数-n非 GUI 模式-t指定测试计划文件也就是你保存的 .jmx 文件-l输出结果文件格式是 .jtl里面记录每个请求的响应数据-e在测试结束后生成 HTML 报告-oHTML 报告输出目录必须是一个不存在的目录或空目录否则会报错例如jmeter -n -t login_test.jmx -l login_result.jtl -e -o login_report跑完后打开login_report目录下的index.html就能看到完整的测试报告。5.3 HTML 报告里重点看哪几块JMeter 生成的 HTML 报告很庞大但实际看的时候不需要所有图表都看一遍。我一般按顺序关注四个地方第一个是 APDEX 指数。APDEX 是用户满意度的一个指标需要在 JMeter 配置文件里设置容忍阈值和满意阈值。如果系统要求 2 秒内完成请求可以设置阈值为 2000ms报告里会告诉你用户满意比例是多少。第二个是 Summary 总览。包括总请求数、平均响应时间、错误率、吞吐量。这些数据可以帮你快速判断整体表现。第三个是响应时间的分布图特别是 Percentiles。中位数50%和 90%、95%、99% 响应时间是最常看的。如果平均值很低但 99% 响应时间很高说明存在少数慢请求这种情况要特别留意。第四个是吞吐量趋势图。结合线程数变化看系统在并发增加时吞吐量是线性增长还是达到某个阈值后开始下降。这个拐点通常就是系统的性能瓶颈。5.4 结果文件 .jtl 和 HTML 报告的区别.jtl 是原始数据文件记录了每个请求的时间戳、线程名、响应码、响应时间等明细。HTML 报告是由 .jtl 计算出来的可视化结果。保留 .jtl 文件的价值在于后续可以重新生成不同样式的报告或者在排查问题时回看明细数据。如果忘记加-e -o参数导致没有生成 HTML 报告也可以用已有的 .jtl 文件补生成jmeter -g result.jtl -o report_dir这个命令在实际工作中很实用尤其是测试已经跑完但你没有提前预留报告目录时。6. 参数化与稳定性测试真实压测里的常见操作6.1 CSV 参数化每个用户用不同的账号密码真实业务系统不会允许几百个用户用同一个账号并发登录。这时候你就需要参数化测试数据。JMeter 里最常用的参数化方式是通过 CSV Data Set Config 读取外部文件。添加路径右键线程组 → 添加 → 配置元件 → CSV 数据文件设置。配置要点文件名填写 CSV 文件路径文件编码建议 UTF-8变量名称多个字段用英文逗号分隔比如 username,password分隔符默认英文逗号是否循环线程数超过数据行数时可以设置是否重新读取在 HTTP 请求的 Body Data 里就可以引用{ username: ${username}, password: ${password} }要注意的是CSV 文件的路径最好不要写死绝对路径。如果你换了机器或把脚本提交到 CI 环境路径不一致会导致读取失败。更稳妥的做法是把 CSV 文件放在 JMeter 的 bin 目录或脚本同目录然后配置相对路径在团队协作时也要在脚本旁边附上测试数据文件避免别人拿到 .jmx 后跑不起来。6.2 定时器模拟真实用户的操作间隔真实用户不会像机器人一样毫秒不差地连续点接口。JMeter 里的定时器就是用来模拟用户思考时间的。常用的是常数吞吐量定时器和固定定时器。固定定时器最简单在每次请求前或请求后等待固定时间。如果需要模拟更自然的时间分布可以用高斯随机定时器或泊松随机定时器让间隔时间不是完全固定。但要注意压测时要不要加定时器取决于测试目的。如果是为了摸清系统最大处理能力通常不加思考时间如果是为了模拟接近真实业务场景则需要加合理思考时间。一个常见的初学错误是加了一个很大的固定定时器导致并发量根本没上去报告里的吞吐量也不是系统的真实上限。6.3 稳定性测试怎么做单次短时间压测只能看到系统在某个瞬间的表现。长期运行环境下内存泄漏、连接数耗尽、日志积压等问题往往要跑 30 分钟、1 小时、甚至更久才暴露。做稳定性测试时建议这样设计线程数保持不变模拟固定并发调度器持续时间设为预期时长比如 1800 秒或 3600 秒用命令行模式执行避免 GUI 干扰监听目标机器的 CPU、内存、磁盘、网络和中间件日志判断稳定性不只是看错误率还要看响应时间是否随运行时间缓慢上升。如果平均响应时间在前 10 分钟是 100ms跑到第 50 分钟变成 800ms那就说明系统可能存在资源泄漏或缓存失效的问题。只看最终平均值会掩盖这个问题最好在报告里观察响应时间趋势。6.4 压力测试和负载测试不要混为一谈面试和实际工作里经常出现两个词压力测试和负载测试。它们的区别虽然没有那么绝对但目标不一样。负载测试是在接近预期峰值的压力下看系统是否稳定压力测试是不断加压找到系统在什么并发下开始明显劣化或崩溃。两者使用的脚本可能相同但线程数和运行时长设计不同。我建议做压测前先问清目标你是在验证系统能不能撑住 1000 并发还是在找它能撑住多少并发。目标不同测试设计和结果判断都不应该一样。不要拿一份脚本、一组线程数既想证明系统没问题又想找出系统底线那样结果很难有说服力。7. 常见报错排查按这个链路走能少踩一半坑7.1 连接失败、502、503先判断是网络、环境还是服务问题JMeter 返回错误时千万不要只看请求失败就直接去调 JMeter 参数。我一般按这个顺序排查先看响应信息。查看结果树里每个失败请求都有响应码、响应信息和返回内容。比如 502 Bad Gateway 通常是反向代理后端的服务不可用504 Gateway Timeout 是网关超时ConnectException 是 TCP 连接建立失败。再看网络可达性。从执行压测的机器上用 telnet 或 curl 直接测被测地址的端口是否通。JMeter 跑不通不代表系统有问题也可能是网络策略、防火墙、安全组没放通。最后确认被测系统状态。压测过程中系统资源耗尽、应用假死也会表现为大量超时或连接异常。这时候要去看服务端日志、中间件日志和数据库慢查询而不是继续调大 JMeter 的线程数。7.2 请求返回成功但数据不对检查断言和参数值有些场景下 JMeter 请求没有报错HTTP 状态码是 200但结果明显不对。比如登录接口返回了“该用户不存在”查询订单返回空列表。这种问题最隐蔽。解决办法是加断言。JMeter 里最常用的是响应断言比如检查响应中是否包含“code”:0”或“成功”关键字。如果断言失败JMeter 会将该请求标记为失败这样错误率的统计才更接近真实。加完断言之后再排查请求参数是否被正确引用。特别是关联场景如果${token}没有提取到值请求头里可能带着空字符串服务端直接拒绝。这类问题用查看结果树里的请求数据就能看出来。7.3 并发上不去优先看客户机资源和 JVM 配置当 JMeter 客户端本身成为瓶颈时会出现 CPU 使用率接近 100%、响应时间波动剧烈、本机内存占用过高等现象。常见调整方向有两个。一个是调 JVM 堆内存。JMeter 默认的堆内存可能不够用可以在jmeter.bat或jmeter脚本里设置HEAP-Xms1024m -Xmx4096m -XX:MaxMetaspaceSize1024m但不要无限调大。堆内存过大会导致 GC 停顿明显反而影响压测稳定性。建议压测前先看本机可用内存预留一部分给系统本身。另一个是降低监听器开销。不要在大规模压测时使用图形化监听器尤其是“查看结果树”“图形结果”这种组件。它们会频繁记录和绘制结果消耗大量资源。命令行模式下结果输出会更轻量。如果单台机器压不动怎么办压测机的瓶颈不在 JMeter 配置上时可以考虑分布式压测。但分布式会引入主从节点同步、网络传输、结果汇总等新问题一开始不要碰先把单机压测做明白。7.4 HTTPS 证书问题只在需要录制或客户端校验时才会遇到录制 HTTPS 脚本时JMeter 需要安装自己的证书到浏览器或系统中否则浏览器会报证书不可信。对于直接手写 HTTP 请求做接口压测的场景一般不需要关心证书问题。如果你确实遇到 HTTPS 接口提示证书错误先确认是不是自签证书。如果是自签证书可以临时让 JMeter 跳过证书校验但生产环境是否允许这样做、安全策略是否允许必须按公司的合规流程来。不推荐在真实压测中直接关闭所有证书校验这会影响测试结果的可信度。7.5 WebDriver Sampler 和“人机交互”类测试要单独考虑搜索热词里有 jmeter jpgc - webdriver sampler这是 JMeter 的一个扩展插件可以驱动真实浏览器执行点击、输入、跳转等操作。它适合做 Web UI 自动化和少量浏览器级别的性能验证但它并不是 JMeter 压测体系的核心。真正做高并发压测时跑的是接口层而不是浏览器请求。浏览器组件会引入大量渲染开销既跑不高并发也容易导致结果不稳定。如果你想学 Web 自动化建议单独去学 Selenium 或 PlaywrightJMeter 的 WebDriver Sampler 可以作为兴趣扩展但不要把它当成性能测试入门路线。8. 从性能测试教程走向岗位面试重点准备这些能力8.1 面试官真正想考察的三件事很多人在学习 JMeter 时会收集大量面试题比如性能测试的流程、并发数和线程数的区别、压力测试和负载测试的差异、响应时间怎么分析等。面试题本身并不难难的是你有没有真正亲手跑过一轮压测并且能说清楚测试思路和结果判断。面试官通常会从三个角度提问第一脚本设计能力。给你一个登录接口你会怎么设计测试计划线程数、Ramp-up、循环次数怎么设这题考察的是你是否理解并发模型而不是只会填参数。第二结果分析能力。给你一份聚合报告你会看哪些数据如果错误率很高你会如何排查这题考察的是你能不能把 JMeter 报告转化为系统性能判断。第三场景落地能力。比如需求说系统要支持 5000 人同时在线你会怎么做测试这里的关键不是直接回答“线程数设 5000”而是要先拆分指标在线用户缓存不一定等于并发操作数真正需要压测的是用户同时进行业务操作的并发峰值。8.2 没有实际项目经验的替代方案很多人会说“我没有做过性能测试项目面试怎么办。”实际上面试官也会理解新人没有完整项目经验。重点是你有没有一个可以讲清楚的个人实践。你可以自己搭一套简单的测试环境比如在本地部署一个 Web 应用用 JMeter 对登录、查询、列表等接口做压测记录下不同并发下的响应时间变化整理成一份简单的测试报告。面试的时候讲的不只是“我会用 JMeter”而是“我用 JMeter 在一个实际接口上做了 100、500、1000 并发测试发现响应时间在 500 并发以后明显上升服务端 CPU 达到 90%初步判断瓶颈在服务端计算资源”。这类描述比“我会性能测试”有用得多。它能证明你已经跑通过完整链路并且具备最基本的性能分析和判断意识。8.3 先跑稳再问自己能不能解释每个参数最后一个建议是学习 JMeter 的过程中不要只追求“会操作”还要追求“能讲清楚为什么”。线程数和 Ramp-up 为什么会影响压测结果循环次数和持续时间的差别在哪为什么大压测不用 GUI 模式聚合报告里的 Throughput 和平均响应时间如何互相印证如果这些问题你都能用实际压测的数据解释那即使遇到面试官问项目细节也不会心虚。执行层的能力很容易练分析层的能力才决定你在这个方向上能走多远。先把单用户跑稳再上并发先看错误率再盯响应时间分布先学会看报告再学着做调优。这套顺序比收藏更多教程、下更多插件更有用。
返回列表