拓冰建站拓冰建站
首页 / 资讯中心 / 正文

JMeter 4.0压力测试实战:从下载安装到首个压测脚本搭建

前一阵子公司做个活动页面功能测试全过了上线前一天运营突然问“同时一千个人进来扛不扛得住”。我一听就知道这是典型的压力测试需求。翻了翻手头的工具选了JMeter 4.0——开源的、社区资料多、报告直观、上手成本也低正好适合这种还没到上线前就要快速给出结论的场景。这篇就把JMeter 4.0从下载安装到跑出第一份压力测试报告的完整流程写清楚。计划分几块来讲先解决运行环境问题然后把测试计划拆开看每个组件是干嘛的再手把手搭一个带断言的压测脚本最后把新手最常踩的坑列出来。适合刚接触性能测试的测试同学、需要自己验证接口稳定性的开发朋友以及临时被拉去“压一下”的运维同行。1. 压力测试为什么选JMeter1.1 JMeter能干什么不能干什么Apache JMeter是一个纯Java写的桌面应用最早是为了测Web应用而生的发展到现在已经能测很多东西HTTP/HTTPS接口、数据库通过JDBC、FTP、SMTP、TCP协议甚至Java对象。日常工作中用得最多的就是HTTP接口压测这点恰好覆盖了大多数业务场景。它的工作方式可以理解成“按剧本反复执行请求”——你定义好并发用户数、请求路径、请求参数、执行次数剩下的事情交给它循环跑最后把响应时间、吞吐量、错误率算给你看。这里要澄清一个常见误解JMeter不是浏览器它不会解析JavaScript、不会加载CSS、不会渲染页面。它模拟的是客户端发出去的HTTP请求本身所以压测目标通常是接口层面而不是页面渲染性能。想测真实用户打开页面的完整体验那是另外一套工具链的事JMeter做不了也不需要做。1.2 4.0这个版本值不值得用JMeter 4.0是2018年2月发布的版本虽然现在官网已经出到5.x但4.0在很多公司的内网环境、老旧项目里用得还是很多。选它有一个很实际的原因它对JDK的要求是Java 8这对大多数存量环境来说零改造JDK 8本来就是企业配的最多的版本。相比更早的3.x4.0有几个顺手的变化JSON断言成了内置组件不用再靠第三方插件HTTP取样器对重定向和Cookie的处理更成熟报告模板的样式也好看了一些。这些改进恰恰是压测脚本里最常用到的部分所以如果你是刚接触JMeter直接拿4.0起步完全没有问题。2. 环境准备从JDK到JMeter 4.0安装2.1 JDK版本选择和验证JMeter本质是Java程序运行前提是机器上有JDK。4.0要求JDK 8及以上推荐直接用JDK 8别贪新因为JDK 9的模块化特性在某些JMeter插件下会出兼容问题没必要给自己添麻烦。安装JDK之后打开命令行敲一句验证java -version正常情况下会输出类似“java version 1.8.0_xxx”的信息。如果提示找不到命令多半是JAVA_HOME环境变量没配好。Windows下需要新增JAVA_HOME指向JDK安装目录再把%JAVA_HOME%\bin追加到Path变量里。2.2 下载与解压安装JMeter官方不提供Windows Installer那种安装包给的是zip压缩包。下载地址是JMeter官网的Download页面选“Binaries”下的apache-jmeter-4.0.zip即可。下载完成后解压到一个不含中文和空格的路径比如D:\tools\apache-jmeter-4.0放在C:\盘更省心。解压完看一眼目录结构几个关键目录先有个印象bin目录启动脚本、配置文件都在这里lib目录JMeter自身依赖的JAR包扩展功能要放jar也放这extras目录一些辅助脚本比如ant集成、打包工具docs目录离线API文档和用户手册不需要执行安装程序解压即用这就是绿色软件的好处。换机器部署也就重新解压一份的事。2.3 启动方式与界面验证Windows下双击bin/jmeter.bat就可以启动。首次启动会弹两个窗口一个是命令行窗口千万别关关了JMeter也会退出另一个是JMeter的主界面。如果双击没反应或者一闪而过通常是两个原因JAVA_HOME没配对或者JDK位数和系统不匹配。建议装64位JDK配64位系统别在32位系统上跑压测机并发一高就撑不住。界面确认能打开后建议顺手把界面语言切到中文Options → Choose Language → ChineseSimplified。切换后界面会保持中文对新手友好很多。不过有些组件名称是英文的看习惯就好。注意JMeter压测时是消耗资源的本机既有JMeter又有被测服务时结果会受资源争抢影响。正经压测应该把JMeter放在独立机器上专门作为施压端。3. 第一个压测脚本是怎么搭起来的3.1 测试计划的四个核心组件打开JMeter后左侧默认有一个“测试计划”节点。整个压测脚本就是围绕这个树形结构搭建的最核心的四个组件必须理解清楚线程组是并发模型的入口线程数就是模拟的用户数。取样器是真正发请求的组件HTTP请求取样器是最常用的。监听器负责收集结果比如聚合报告、查看结果树。断言用来判断响应是否符合预期不符合就标记为失败。这四者的关系可以类比一场马拉松比赛线程组是参赛名额取样器是每位选手的赛程路线断言是途中的检查点监听器就是终点计时员。缺了任何一个压测都不能算完整闭环。3.2 创建线程组并配置并发参数在“测试计划”节点上右键 → 添加 → 线程用户→ 线程组。线程组面板里几个参数要说明白线程数模拟多少个用户同时跑Ramp-Up Period秒多长时间内启动完所有线程循环次数单个线程跑几遍脚本举个例子线程数100、Ramp-Up为10意味着每秒钟启动10个线程10秒后达到峰值100并发。这把“瞬间冲击”变成了“逐步加压”更符合真实用户体验。如果勾选“调度器”还能设置持续时间比如压10分钟就停这在做稳定性测试时很关键。3.3 添加HTTP请求取样器在线程组上右键 → 添加 → 取样器 → HTTP请求。配置区分四层协议http还是https服务器名称或IP域名或IP地址端口号默认80可留空非80要填路径和方法接口路径、GET/POST等再往下是“参数”选项卡GET请求的查询参数在这里添加。最底下是“消息体数据”POST接口的JSON体在这里写。配好后先别急着压最稳妥的做法是右键这个取样器 → 添加 → 监听器 → 查看结果树先单独跑一次确认请求通不通、返回什么内容。请求都不通就开始压压出来的全是错误数没有任何价值。3.4 添加监听器和第一次运行在“测试计划”上右键 → 添加 → 监听器推荐先加两个查看结果树逐条看请求详情调试用聚合报告汇总统计响应时间、吞吐量、错误率聚合报告里最关键的几个指标要盯住Average平均响应时间、90% Line90%请求在多少毫秒内完成、Error%错误率、Throughput每秒事务数。配置完成后点击工具栏绿色三角形按钮启动。跑完后聚合报告会自动刷新出数据。第一次跑完先看Error%如果不是0回头去看结果树里具体报什么错而不是急着分析性能。错误没清零之前性能指标都是虚的。提示压测机的线程数不代表真实在线用户数。100个线程不等于系统只有100人在访问因为每个线程是无限循环发请求的。真实并发量的换算是“每秒请求数 × 平均响应时间”后面做容量评估会用到这个公式。4. 实战带断言和参数化的完整压测流程4.1 一个真实的压测场景设计假设要给一个登录接口做压测接口信息如下地址https://demo.example.com/api/login方法POST请求体{username:test01,password:123456}预期返回{code:0,msg:success}线程组这样设线程数200Ramp-Up 20秒循环次数100。也就是20秒内逐步到200并发每个线程连续打100次。这里有个容易忽略的细节登录接口往往有验证码、有单点登录限制。压测登录接口前先确认验证码能不能让测试环境关掉或者提供万能验证码否则脚本跑起来全是验证码错误的报错没法测真实性能。4.2 添加JSON断言验证响应内容请求参数填好之后右键HTTP请求 → 添加 → 断言 → JSON断言。这是JMeter 4.0内置的组件比之前的响应断言写正则方便很多。配置内容是JSON Path表达式$.code期望值0意思就是检查响应体里code字段是否等于0。如果是这个请求算通过不是算失败。如果想做更复杂的校验比如同时判断code和msg就加多个断言或者用“BeanShell断言”——用脚本直接写逻辑。BeanShell断言的写法是引用prev对象例如拿到响应体字符串再配合String.contains判断关键字。这种方式灵活但脚本复杂度和维护成本也高简单断言尽量用JSON断言解决。4.3 用CSV参数化模拟多用户真实场景中不可能200个线程全用同一个账号登录否则服务端一查同账号并发直接就限制了这造出来的压力既不真实还可能被误判为系统瓶颈。参数化的推荐做法是CSV数据文件。准备一个users.csv文件放同目录username,password test01,123456 test02,123456 test03,123456在测试计划节点上右键 → 添加 → 配置元件 → CSV数据文件设置。配置三处文件名填完整路径变量名称填username,password分隔符用英文逗号其余默认。这样放线程组同级的CSV配置每个用户循环时都会来这个文件取下一行数据200个线程就能用200个账号登录和真实分布更接近。需要注意文件路径中的反斜杠转义问题。Windows路径建议直接填如D:/jmeter_data/users.csv这种正斜杠写法避免因为转义符读不到文件。4.4 跑完怎么看结果哪些指标先看脚本配置完成启动压测。跑到一半可以点开聚合报告看实时数据跑完后重点看四列样本数总请求数能验证压测有没有跑到位平均响应时间从几百毫秒到几千毫秒体感差别很大错误率超过1%就要警惕吞吐量每秒请求数越高说明接口处理能力越强响应时间指标要关注90% Line而不是只看平均值。平均值容易被极端值拉偏90% Line更接近大多数用户的实际体验。如果平均响应时间100ms但90% Line是800ms说明有不少请求很慢。压测过程本身就是动态的如果发现错误率在某一时刻突然飙高配合查看结果树看那一刻的响应内容通常能快速定位是被限流了、连接池打满了还是服务端日志里有异常堆栈。5. 新手最容易踩的五个坑5.1 中文乱码问题请求参数或返回结果出现中文乱码十有八九是编码没统一。HTTP请求取样器里Content Encoding一栏填UTF-8通常就能解决。如果出口还是乱码看看是不是被测系统返回的页面编码不是UTF-8这个得两边对齐。查看结果树的显示乱码则要编辑bin目录下的jmeter.properties找到sampleresult.default.encoding改成UTF-8然后重启JMeter。5.2 HTTPS接口报证书错误JMeter访问HTTPS接口时会提示“unable to find valid certification path to requested target”这是因为JMeter没有信任被测系统的SSL证书。测试环境用的多是自签名证书必然报这个。两种解决办法。第一种最简单在HTTP请求取样器的“高级”选项卡里把“实施证书验证”取消勾选不校验服务器证书直接压。这个方法适合测试环境。第二种是正式环境要求严格校验时就需要把证书导入JMeter的cacert里操作步骤是打开bin目录、执行keytool命令导入证书具体命令可以在JMeter手册的“SSL证书”章节找到。大多数场景用第一种就够了。5.3 压到一半JMeter卡死或OOMJMeter是Java进程默认堆内存只有512MB到1GB压测线程一多就OutOfMemory。改内存的方法编辑bin/jmeter.bat找到HEAP-Xms1g -Xmx1g -Xss256k把-Xmx调成4g或更高然后重启。修改前先确认压测机的物理内存够不够比如机器总共8GBJVM吃4GB再加被测应用和其他进程很容易整机陷入卡顿。调内存的原则是压测机自身不能成为瓶颈。5.4 上传文件接口的参数配置JMeter压测上传文件接口要在HTTP请求取样器里把请求方式设为POST勾选“对POST使用multipart/form-data”然后添加文件上传类型的参数参数名称填接口规定的字段名HTTP文件路径填要上传的文件路径。还有一个隐藏坑JMeter发送multipart请求时会自动生成一个boundary有些后端框架对boundary的格式敏感。如果接口报参数格式错误可以试试关掉“对POST使用multipart/form-data”手动组装请求体但多数情况下默认配置就能通先跑一遍看结果再定。5.5 代理录制脚本的陷阱JMeter自带的HTTP(S)测试脚本记录器可以录制浏览器操作生成脚本但录出来的脚本通常会有大量静态资源请求这些JS/CSS/图片请求对接口压测没有意义反而会拉低吞吐量数据。录制结束后记得把无关请求从脚本中清理掉只保留真正的业务接口。HTTPS录制还需要安装JMeter的CA证书到浏览器否则录不到解密后的请求。证书安装在“选项 → SSL管理器”里能看到浏览器需要导入这个证书才能正常录制。6. 写在最后的一些体会用JMeter这几年我个人最大的体会是压测工具本身不难难的是怎么设计一个合理的压测场景。线程数设多少、Ramp-Up多久、循环几次、有没有参数化、断言对不对每一步都影响最终数据的可信度。很多人拿JMeter跑了一晚上导出一堆数据最后连“接口是不是真的处理不过来”都说不清楚就是因为前面的场景设计环节没做好。我比较习惯的做法是先把接口单独请求通确认返回值正常再加断言保证每一个请求结果都是可验证的最后才配线程组上并发。这是从“能不能通”到“压不压得起”的递进过程也是新手最容易忽略的节奏。遇到不确定的地方多看jmeter.log和聚合报告数据会告诉你答案。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门