ARTICLE DETAIL

资讯详情

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

JMeter性能测试入门:从零开始掌握脚本录制与回放

JMeter性能测试入门:从零开始掌握脚本录制与回放 1. 项目概述从零上手JMeter性能测试刚接触性能测试的新手或者是从功能测试转过来的朋友听到“JMeter”这个名字第一反应往往是“这工具看着挺强大但安装和上手好像有点复杂”。确实作为Apache旗下的开源扛把子JMeter功能全面但它的界面和操作逻辑对初学者来说可能不如Postman那么直观。今天这篇笔记我就以一个过来人的身份带你彻底搞定JMeter的安装并手把手教你完成第一个脚本的录制与回放——这是性能测试的“Hello World”也是后续所有复杂场景的基石。无论你是想测试Web应用的并发能力还是想压测API接口这一步走稳了后面就顺了。很多人卡在第一步官网下载哪个版本需要配环境变量吗为什么我双击打不开还有更头疼的脚本怎么来难道要一个HTTP请求一个HTTP请求地手动添加吗效率太低了。别担心我会把从下载、安装、环境配置到使用内置的HTTP(S) Test Script Recorder也就是我们常说的“代理录制”完成脚本录制再到成功回放验证的完整闭环掰开揉碎了讲清楚。过程中我会穿插我踩过的坑和总结的最佳实践确保你看完就能动手做出来。2. 核心工具选型与环境准备2.1 为什么选择JMeter在开始动手之前我们得先明白为什么是JMeter。市面上性能测试工具不少有LoadRunner这样的商业巨头也有Locust、Gatling等后起之秀。JMeter能经久不衰靠的是它的“全能”和“免费”。它纯Java开发跨平台特性极佳在Windows、Mac、Linux上表现一致。它不仅能模拟HTTP/HTTPS请求还支持FTP、JDBC、JMS、SOAP等多种协议几乎覆盖了企业级应用的所有接口类型。更重要的是它拥有强大的线程组模型、丰富的监听器用于查看结果和断言用于验证结果以及通过插件可无限扩展的能力。对于学习和中小型项目来说JMeter几乎是零成本入门性能测试的最佳选择。2.2 安装前的关键准备Java运行环境JMeter是一辆性能猛兽但它的引擎是Java。所以安装JMeter的第一步不是去下JMeter本身而是确保你的电脑上已经安装了合适版本的Java运行环境JRE或开发工具包JDK。注意JMeter 5.0及以上版本需要Java 8或更高版本。强烈建议直接安装JDK因为后续如果你需要用到JMeter的一些高级功能或与持续集成工具如Jenkins结合JDK是必须的。如何检查与安装Java检查现有版本打开你的命令行终端Windows是CMD或PowerShellMac是终端输入java -version。如果显示了类似“java version “1.8.0_301””的信息说明已安装且版本是81.8即Java 8。如果提示“不是内部或外部命令”则需要安装。下载与安装前往Oracle官网或OpenJDK项目网站如Adoptium下载JDK。对于新手我推荐直接从Oracle官网下载Java 8或Java 11的JDK安装包.exe或.dmg图形化安装一路“下一步”即可最简单省心。配置环境变量Windows用户重点看这是最容易出问题的一步。安装完JDK后在Windows上需要手动配置JAVA_HOME和Path变量。JAVA_HOME指向你的JDK安装目录例如C:\Program Files\Java\jdk1.8.0_301。这个变量告诉系统Java的“家”在哪里。Path在Path变量中新增一项%JAVA_HOME%\bin。这告诉系统当你在命令行输入java或javac命令时应该去哪个目录找执行文件。验证配置完成后重新打开一个命令行窗口分别执行java -version和javac -version。两者都能正确输出版本号才说明环境变量配置成功。实操心得很多朋友在Windows上安装失败十有八九是环境变量没配好。一个快速检查的方法是在CMD里直接输入echo %JAVA_HOME%看输出的路径是否正确。如果不对就回去仔细核对。Mac和Linux通常包管理器安装时会自动配置问题较少。2.3 获取与安装JMeter确保Java没问题后我们就可以去请主角了。官方下载永远首选Apache JMeter官网。直接搜索“Apache JMeter”进入项目首页找到下载链接。你会看到两个版本Binaries和Source。我们下载Binaries版本通常是.zip或.tgz压缩包。这是编译好的可直接运行版本。版本选择除非有特殊需求否则建议下载最新的稳定版Stable Release。新版本通常修复了旧版的bug并可能带来更好的性能和易用性。“安装”过程JMeter的安装可以说是“绿色版”的。你只需要将下载的压缩包解压到一个你喜欢的、路径中不含中文或空格的目录即可。比如D:\Tools\apache-jmeter-5.6.2。这就是它的安装目录了。启动JMeter进入解压后的bin目录你会看到一堆文件。启动JMeter的核心文件是Windows双击jmeter.bat文件。你会先看到一个黑色的命令行窗口启动然后JMeter的图形化界面GUI才会弹出来。切记不要关闭那个黑色窗口它是JMeter的运行环境。Mac/Linux在终端中进入bin目录执行./jmeter.sh命令。如果双击.bat文件没有任何反应或者命令行窗口一闪而过大概率是Java环境变量配置有问题请返回上一步仔细检查。避坑指南JMeter的GUI模式是为了方便我们创建和调试脚本用的。切记真正的性能压测尤其是高并发一定不要在GUI模式下运行而应该使用命令行非GUI模式因为GUI本身会消耗大量资源影响测试结果准确性。这个我们后续在讲压测执行时会详细展开。3. 初识JMeter界面与核心概念成功启动后你会看到一个略显复杂但结构清晰的界面。别慌我们先把几个最核心的“积木块”认清楚后续搭建脚本就轻松了。测试计划Test Plan这是JMeter脚本的根容器所有其他元件都放在它下面。你可以把它理解为一个项目文件.jmx。线程组Thread Group这是性能测试场景的“发动机”定义了虚拟用户线程的数量、启动时间、循环次数等。所有具体的测试步骤取样器都必须放在某个线程组下面。取样器Sampler告诉JMeter发送什么类型的请求。比如“HTTP请求”取样器用于测试Web接口“JDBC请求”用于测试数据库。逻辑控制器Logic Controller控制取样器的执行逻辑比如循环、条件判断、随机顺序等。监听器Listener用来收集和查看测试结果的元件。比如“查看结果树”可以看每个请求的详细请求和响应“聚合报告”可以看整体的性能指标吞吐量、响应时间等。配置元件Config Element为取样器提供配置信息。比如“HTTP请求默认值”可以设置所有HTTP请求共用的服务器地址和端口“CSV数据文件设置”可以从文件读取测试数据。断言Assertion用来验证服务器返回的响应是否符合预期。比如检查响应中是否包含某个关键字或者响应代码是否为200。前置处理器/后置处理器Pre/Post Processor在发送请求前或收到响应后执行一些操作。比如从响应中提取数据后置处理器并保存到变量中供后续请求使用。一个最简单的测试脚本逻辑链是测试计划- 添加一个线程组- 在线程组下添加一个HTTP请求取样器 - 为了查看结果再添加一个查看结果树监听器。这个链条就构成了一个可运行的最简脚本。4. 核心实战HTTP代理服务器录制脚本手动添加请求对于简单接口还行但对于一个包含多个步骤的Web操作流程比如登录-浏览商品-加入购物车-下单就太繁琐了。这时“录制回放”功能就是我们的救星。JMeter内置了一个HTTP(S) Test Script Recorder它本质上是一个代理服务器可以捕获浏览器发出的所有请求并自动生成JMeter脚本。4.1 录制前的准备工作在JMeter中设置代理服务器在测试计划下右键 - 添加 - 非测试元件 -HTTP(S) Test Script Recorder。关键配置项端口Port设置一个未被占用的端口比如8888。这是代理服务器监听的端口。目标控制器Target Controller选择“测试计划 线程组”。这决定了录制的请求会被放到哪里。我建议先在线程组下创建一个“录制控制器”右键线程组 - 添加 - 逻辑控制器 - 录制控制器然后这里选择这个录制控制器这样录制的脚本会更清晰。分组Grouping建议选择“每个组放入一个新的控制器”这样会把一系列相关的请求如一个页面的所有资源请求组织在一起脚本结构更好。点击下方的“启动”按钮。此时JMeter的代理服务器就开始在8888端口监听了。配置浏览器使用代理这里以Chrome浏览器为例Firefox等类似。打开Chrome设置 - 高级 - 系统 - 打开计算机的代理设置或者在Windows设置中直接搜索“代理”。进入代理设置页面手动设置代理地址127.0.0.1或localhost因为代理服务器就在本机端口8888与JMeter中设置的一致保存设置。重要提示为了方便可以安装如SwitchyOmega这样的浏览器代理插件一键切换代理比修改系统设置更方便。安装JMeter根证书仅录制HTTPS网站时需要如果你要录制的网站是HTTPS的现在绝大多数都是浏览器会报安全错误因为JMeter代理的证书不被信任。解决方法是在浏览器中访问http://jmeter.apache.org/并下载JMeter的根证书或者更简单的方法是在你启动JMeter代理后用浏览器访问http://localhost:8888JMeter可能会提示你下载证书。下载后将证书通常是.cer或.pem文件导入到操作系统的受信任根证书颁发机构存储中。这是一个关键步骤具体操作因操作系统而异需要搜索“如何安装根证书”来完成。4.2 开始录制与生成脚本确保JMeter代理已启动浏览器代理已设置好。在浏览器中开始你的操作流程。例如打开你要测试的网站进行登录、搜索、点击等操作。你会在JMeter的“HTTP(S) Test Script Recorder”元件的底部看到请求列表在不断增加。每一个你在浏览器中触发的HTTP/HTTPS请求都会被捕获并显示在这里。操作完成后回到JMeter点击代理服务器的“停止”按钮。现在去你之前指定的“目标控制器”比如“录制控制器”下面看看你会发现所有录制的请求都已经按照你的操作顺序以取样器的形式生成了。每个取样器里URL、方法GET/POST、参数、请求头等信息都已经自动填充好了。录制过程的核心技巧过滤请求在代理服务器设置里有一个“包含模式”和“排除模式”。你可以用正则表达式来过滤掉不需要的请求。比如排除掉所有的图片请求.*.(jpg|png|gif|css|js)$可以大大简化脚本让脚本只关注核心的业务接口。清理脚本录制生成的脚本通常包含很多静态资源图片、CSS、JS的请求。对于性能测试我们通常只关心动态的、有业务逻辑的接口。所以录制后需要手动删除那些不必要的取样器或者用上面的过滤功能在录制时就直接排除。处理动态参数录制的脚本里可能会包含一些每次都会变化的动态值比如会话IDJSESSIONID、令牌token、时间戳等。这些参数需要被提取出来并参数化否则回放时就会因为参数失效而失败。这就要用到我们前面提到的“后置处理器”如正则表达式提取器、JSON提取器来动态获取并传递这些值。4.3 脚本回放与调试脚本录制并清理好后下一步就是回放验证脚本是否能正确执行。添加监听器为了看到回放结果在线程组或测试计划下添加一个“查看结果树”监听器。运行脚本点击工具栏上的绿色“启动”按钮或按CtrlR。查看结果在“查看结果树”中你可以看到每个请求的执行情况。绿色代表成功通常指响应码为2xx或3xx红色代表失败。点击任何一个请求可以查看详细的“请求”数据和“响应数据”。调试失败请求如果请求失败是调试脚本最关键的一步。检查响应码和响应信息如果是4xx客户端错误检查URL、参数、请求头是否填写正确特别是录制的域名/IP是否可以直接访问。对比录制与回放的请求在“查看结果树”中将失败的请求与录制时成功的请求进行对比请求体、请求头看哪里发生了变化。动态参数问题通常在这里暴露。使用Debug Sampler和Debug PostProcessorJMeter提供了调试取样器和后置处理器可以打印出JMeter变量的值帮助你查看动态参数是否被正确提取和赋值。回放成功的标志不仅仅是请求成功绿色更重要的是业务逻辑成功。比如登录请求返回了200但响应体里是“密码错误”这不算成功。你需要添加“断言”来检查响应内容比如断言响应中包含“登录成功”字样这才是真正的回放成功。5. 脚本优化与参数化实战一个直接录制回放就成功的脚本是幸运的但大多数业务脚本都需要优化才能用于真正的压测。参数化是优化的核心。5.1 处理动态令牌Token现代Web应用几乎都使用Token如JWT或Session来保持用户状态。录制时你的浏览器带着一个有效的Token但回放时这个Token可能已过期。解决方案识别Token来源通常Token是在登录请求的响应中返回的可能在响应体的JSON里也可能在响应头里。使用后置处理器提取在登录请求下添加一个“JSON提取器”如果Token在JSON里或“正则表达式提取器”如果Token在文本或Header里。配置它从响应中提取出Token的值并保存到一个JMeter变量中比如${auth_token}。应用到后续请求后续所有需要认证的请求如查询个人信息在其“HTTP信息头管理器”或请求参数中引用这个变量${auth_token}。这样每次执行脚本时都会先执行登录请求获取新的Token然后用于后续请求实现了动态认证。5.2 参数化测试数据你不能让1000个虚拟用户都用同一个用户名“test”去登录。我们需要参数化让每个用户使用不同的数据。常用方法CSV数据文件这是最常用、最强大的方式。创建一个CSV文件如users.csv第一行是变量名后面行是数据值。例如username,password user1,pass1 user2,pass2 ...在线程组下添加一个“CSV数据文件设置”配置元件。指定文件路径、变量名称对应CSV第一列、文件编码等。设置“遇到文件结束符再次循环”或“遇到文件结束符停止线程”根据你的测试场景选择。在登录请求中用户名和密码参数值分别填写${username}和${password}。这样JMeter会按顺序或随机从文件中读取数据分配给不同的虚拟用户。用户定义的变量适用于少量、固定的参数。函数助手JMeter内置了许多函数可以生成随机数、时间戳、UUID等非常适合生成动态数据。5.3 添加思考时间与集合点为了更真实地模拟用户行为我们还需要添加“思考时间”用户操作间隔和“集合点”让所有用户在同一时刻发起某个请求模拟瞬时峰值。思考时间使用“固定定时器”或“高斯随机定时器”添加到需要等待的请求之前。定时器的作用域是其所在位置下面的所有取样器。集合点使用“同步定时器”。将其添加到某个请求如“提交订单”之前并设置模拟用户组的数量。当虚拟用户执行到这里时会等待直到达到指定数量的用户集合完毕再同时释放发起请求。6. 从录制回放到实际压测的跨越当你成功录制、优化并回放了一个脚本后你已经掌握了JMeter最核心的脚本开发能力。但这离真正的性能压测还有一步之遥命令行非GUI模式执行与结果分析。为什么不能用GUI压测GUI模式会消耗大量的内存和CPU资源来渲染界面和更新监听器。当并发线程数稍高比如几百JMeter本身就可能成为瓶颈导致测试结果严重失真响应时间变长、吞吐量变低。如何用命令行压测将你的测试计划保存为一个.jmx文件例如my_test.jmx。打开命令行终端进入到JMeter的bin目录。执行命令示例jmeter -n -t my_test.jmx -l result.jtl -e -o ./report-n: 表示非GUI模式运行。-t: 指定要运行的测试脚本文件。-l: 指定保存原始结果数据的文件.jtl格式。-e -o: 测试结束后根据.jtl文件生成一个HTML格式的仪表盘报告并输出到指定目录如./report。结果分析 生成的HTML报告非常直观包含了测试概要、APDEX应用性能指数、响应时间随时间变化曲线、活跃线程数、吞吐量Requests/sec等关键图表。你需要重点关注吞吐量Throughput系统每秒处理的请求数。这是衡量系统处理能力的核心指标。平均响应时间/百分位响应时间Avg/P90/P95 Response TimeP95响应时间意味着95%的请求响应时间低于这个值比平均响应时间更能反映用户体验。错误率Error %失败的请求比例。压测中错误率应控制在极低范围如0.1%。随着并发用户数增加观察吞吐量和响应时间的变化曲线。当吞吐量达到峰值不再增长而响应时间开始急剧上升时就找到了系统的性能瓶颈点。踩过的大坑内存溢出压测时JMeter本身可能内存不足。需要修改bin目录下的jmeter.batWindows或jmeter.shMac/Linux脚本中的JVM堆内存参数如-Xms1g -Xmx4g根据测试规模适当调大。“Address already in use”错误高并发下本地端口可能被快速耗尽。需要调整操作系统的TCP/IP参数如减少TIME_WAIT时间或增加可用端口范围。结果文件过大长时间压测生成的.jtl文件可能巨大。在“查看结果树”等监听器中压测时务必不要勾选“保存响应数据”只保存必要的信息。或者使用“简单数据写入器”监听器并以CSV格式输出更精简的数据。从安装、录制、回放调试到参数化优化最后到命令行压测与结果分析这构成了JMeter性能测试的一个完整基础闭环。掌握了这个闭环你就已经具备了独立完成基础性能测试任务的能力。后续的深入无非是在这个基础上学习更多复杂的元件如事务控制器、循环控制器、处理更复杂的协议如WebSocket, MQTT、搭建分布式压测环境、以及与持续集成流程结合。但万变不离其宗脚本的录制、优化和回放验证始终是这一切的起点和基石。多动手练习从测试一个简单的公开API开始逐步增加复杂度你会很快发现性能测试的世界既严谨又有趣。
返回列表