首页 / 资讯中心 / 文章详情

Jmeter接口测试与性能测试实战:从脚本到压测报告

Jmeter接口测试与性能测试实战:从脚本到压测报告 ★ FEATURED ARTICLE
做了七八年的接口测试和性能测试Jmeter是我电脑里装了最久、卸载次数最少的一个工具。早些年是配合自动化框架做接口回归后来被拉去支撑性能测试发现团队里会写脚本的多能把线程数、Ramp-Up、断言、关联这些参数搭配明白的少。这篇内容不是官方文档的复读而是把我在多个项目里跑过的接口联调、全链路压测、问题排查经验整理出来希望对刚接触Jmeter的测试同学以及被性能测试追着跑的开发同学都有点实实在在的帮助。有人问为什么非要用Jmeter我的回答通常是因为它的学习曲线非常平滑接口测试基础功能开箱即用性能测试场景下又能通过线程组和插件把并发模型讲得明明白白再加上有庞大的社区生态遇到任何奇葩问题基本都能搜到方案。对于测试人员来说Jmeter同时覆盖了功能测试和性能测试两条路线不需要在两套工具之间来回切换这是它最大的价值。1. 先想清楚再动手接口测试与性能测试的核心逻辑1.1 测试岗位的真实分工决定了你为什么要学Jmeter很多刚入行的测试同学以为接口测试就是拿Postman发几个请求性能测试就是点个按钮看结果其实这两件事在真实项目里完全是两个量级。接口测试面对的是一整套业务链路。比如你在测试一个订单系统光创建订单这个操作就涉及用户鉴权、库存锁定、优惠券核销、支付回调、消息通知五六个接口这些接口之间还有参数依赖关系。如果只停留在“单个接口能通”的层面很多业务逻辑漏洞根本发现不了。真正的接口测试要解决的是参数怎么动态生成、依赖值怎么传递、返回结果怎么校验、异常场景怎么覆盖。性能测试则完全是另一个视角。它要回答的不再是“功能对不对”而是“系统扛不扛得住”。比如双十一零点那一刻涌进来十万个用户接口的响应时间会不会从50毫秒变成5秒数据库连接池会不会被打满消息队列会不会积压。性能测试的核心指标是TPS、响应时间、错误率、资源利用率这些都需要通过压测工具去模拟真实用户行为才能得到。Jmeter恰恰是这两条线的交集点。它的HTTP请求组件足够轻量灵活适合做接口测试它的线程组模型又足够贴近真实并发场景适合做性能测试。学会了Jmeter你就同时掌握了接口层面的功能验证和系统层面的容量验证两种能力在面试和实际工作中的竞争力都会明显不一样。1.2 为什么那么多压测工具团队最终还是选了Jmeter市面上的压测工具有很多我简单梳理一下各自的特点你就明白为什么Jmeter是绝大多数团队的第一选择。LoadRunner是老牌商业工具功能强大报告漂亮但授权费用不低脚本语言也和主流技术栈有距离对中小团队来说性价比不高。Locust走的是Python脚本路线灵活性和二次开发能力很强但对测试同学的编程能力要求高而且分布式压测的部署运维成本也不低。Gatling基于Scala性能表现好但同样有脚本门槛。wrk和ab这类命令行工具虽然轻量但只能做简单的HTTP压测对复杂业务场景的支持几乎为零。Jmeter能在这些工具里胜出核心原因有三个。第一它完全免费开源商业使用也没有授权风险。第二图形化界面让测试脚本的结构一目了然测试经理评审脚本、新成员接手项目都很容易。第三它的插件生态非常成熟从性能监控到HTML报告生成都有对应的插件基本需求都能找到现成的方案。最关键的一点是Jmeter用Java开发天然具备跨平台能力同时JVM的参数调优经验可以直接复用到生产环境的性能分析中。我见过很多测试团队从LoadRunner迁移到Jmeter迁移成本主要集中在脚本转换上但从长期维护和团队协作角度看这个投入是值得的。1.3 建立整体认知Jmeter执行流程里每个组件在干嘛Jmeter的脚本本质上是一个有执行顺序的组件树。理解了这个树形结构你就能看懂任何一份Jmeter脚本也能自己规划脚本的模块划分。一个最典型的接口测试脚本是这样组织的最外层是测试计划测试计划里面可以定义全局变量然后是一个或多个线程组线程组是并发模型的载体线程组下面按顺序挂Sampler取样器比如HTTP请求、断言、监听器、前置处理器、后置处理器、配置元件等。执行时每个线程会按照组件树的顺序从线程组开始往下逐个执行。这里要特别强调一点Jmeter的“线程”和操作系统的线程不是一个概念。Jmeter的每个线程真实模拟的是一个虚拟用户它做的事情是循环地执行Sampler。所以线程数就是你模拟的并发用户数。但线程数设多少并不意味着系统就有多少并发请求因为每个请求的响应时间不一样。假设你设了100个线程每个请求平均响应时间是1秒那么系统每秒实际接收到的请求量大约是100TPS如果响应时间变成了2秒TPS就降到了50。理解这个换算关系对后续性能测试的结果解读非常关键。2. 接口测试实战从零搭一个能跑的脚本2.1 环境准备与基础组件搭建5分钟跑通第一个HTTP请求工欲善其事必先利其器。先确认两件事你的电脑上装了JDK建议JDK8以上版本然后去Jmeter官网下载二进制压缩包解压后进入bin目录Windows系统双击jmeter.batMac或Linux系统执行jmeter脚本就能启动图形界面。新版本Jmeter默认以GUI模式启动但GUI模式只建议用来编写和调试脚本跑压测一定要用命令行模式原因后面我会专门讲。新建一个测试计划的套路我建议按照下面的步骤操作每一步都说明一下为什么在测试计划节点上添加一个配置元件叫用户定义的变量。这里专门用来存放环境相关的配置比如协议、域名、端口。为什么要单独拎出来因为测试环境、预发布环境、生产环境的地址不一样你把环境信息集中放在这里切换环境的时候只需要改一个变量值不用翻遍整个脚本去替换。添加线程组。线程组是所有Sampler的容器。右键测试计划依次选择“添加 - 线程用户 - 线程组”。在线程组面板里你会看到线程数、Ramp-Up时间、循环次数、调度器配置等参数。接口测试阶段线程数先填1Ramp-Up填1秒循环次数填1因为我们只在调试功能逻辑。在线程组下添加“取样器 - HTTP请求”。HTTP请求面板里有几个关键字段协议http还是https、服务器名称或IP、端口号、方法GET/POST/PUT/DELETE等、路径、消息体数据。到此为止你其实已经走完了一个HTTP请求的最小闭环。为了看到请求和响应的具体内容还需要加监听器。最常用的调试监听器是“查看结果树”。点击运行按钮你就能在查看结果树里看到HTTP请求的Header、Body以及服务端返回的状态码、响应报文。这是接口测试的第一步调试手段。我遇到过很多同学问为什么我请求发出去了查看结果树里却报错。排查思路很简单先看响应体里有没有具体的报错信息再看请求头里的Content-Type和服务端期望的是不是一致最后检查参数名是否和接口文档完全匹配。大部分接口联调问题都绕不开这三个原因。2.2 参数化让脚本从写死变成通用避免重复造数据接口测试从入门到进阶第一个必须掌握的能力就是参数化。因为真实业务里一个接口需要覆盖的场景太多了比如查询订单接口你得验证已支付订单、待支付订单、已取消订单、不存在的订单号等各种情况。如果手写死参数每条数据都去改脚本维护成本会高到让人崩溃。Jmeter参数化的常用方式有这么几种我按使用的优先级排序说明。第一种是使用用户定义的变量配合函数。比如在用户定义的变量里定义一个 ${baseUrl}然后在HTTP请求的服务器名称里填 ${baseUrl}。这种方式适合静态配置类参数。再配合 __Random 函数比如 ${__Random(10000,99999,)} 可以生成一个随机订单号。这种方案简单直接适合参数量少、不需要严格管理数据的场景。第二种是CSV数据文件驱动。右键线程组添加“配置元件 - CSV数据文件设置”。把你准备好的测试数据放在一个csv文件里每一列对应一个参数名配置好文件名、变量名称、分隔符、是否循环读取。实战中CSV方式比随机函数更可靠因为测试数据是提前规划好的可以精确覆盖边界值和异常值。你可以在csv里准备二十行数据包括正常的用户名密码、为空的用户名、超长密码、SQL注入的字符串等等脚本跑一遍就等于执行了二十条测试用例。第三种是通过JDBC连接数据库实时获取数据。有些业务数据是动态生成的比如你必须拿到当前有效的优惠券ID才能测领取接口这时可以添加JDBC请求执行一条SQL查出符合条件的ID再用后置处理器把查询结果传递给后续请求。这种方式比较复杂但很多核心链路测试绕不开它。这里有个实战心得分享给你做接口测试的数据准备阶段多花一小时在CSV文件的规划上比在脚本里多写半小时的变量替换逻辑更有价值。因为测试数据的可读性和维护性直接决定了脚本的长期可用性团队成员接手你的脚本时看CSV文件比看复杂的函数嵌套要轻松得多。2.3 断言别只看响应码200业务成功才是真的成功很多刚做接口测试的同学有一个惯性思维响应码200就代表接口测试通过。这个判断在性能测试里可能勉强够用但在功能层面的接口测试里非常危险。更合理的方式是增加响应断言对返回内容做业务层面的校验。响应断言的典型场景有三种。场景一校验业务成功标志。很多接口的HTTP状态码是200但响应体里的业务状态码却是5001代表系统内部异常。比如登录接口密码错误时返回200但响应内容是{code: 4001, msg: 用户名或密码错误}。如果你只判断了响应码200这个用例就漏掉了真正的失败原因。场景二校验关键业务字段。比如创建订单接口你需要校验返回体里是否生成了订单号并且订单号格式是否符合预期。这种情况可以用JSON断言插件或者直接用“响应断言”配合正则表达式来匹配。我一般推荐用JSON断言插件因为JSONPath的语法比正则表达式可读性强很多。场景三校验响应内容的完整性。比如分页查询接口你要验证返回的数据条数是否等于请求参数里设定的pageSize。可以用“大小断言”的插件或者自己写一个BeanShell脚本做复杂逻辑判断。但说实话BeanShell脚本的性能较差能用断言组件解决的不要写脚本保持了脚本简洁性后续维护也会轻松很多。写断言时还要注意一个问题避免过断言和欠断言。过断言是说你对响应体里的每一个字段都做校验结果接口文档里某个字段从dateFormat改成timestamp脚本就开始报错需要频繁维护。欠断言就是只校验状态码或是否存在某个字符串导致很多业务错误漏检。最合理的方式是根据接口的业务风险等级来划分对于资金操作类接口断言要严格覆盖状态码、业务码、关键字段对于查询类接口断言重点校验数据格式和分页信息即可。2.4 关联把上一个接口的返回值传给下一个接口打通业务链路单个接口能测通了下一步就是业务链路的接口测试。比如获取用户信息的接口它需要一个token参数而token是登录接口返回的。你必须先从登录接口的响应里提取token再把它作为请求参数传给下一个接口。这个过程在Jmeter里叫关联。关联的标准实现方式是“后置处理器 变量传递”。我详细说一下操作步骤。第一步在登录请求上添加“后置处理器 - 正则表达式提取器”。假设登录接口返回的JSON是{code: 0, data: {token: abc123xyz}}那么你要提取token值。正则表达式写成token:([^])模板填$1$匹配数字填1。这里有个细节正则表达式提取器里的正则要尽量精确到目标字段的上下文不然容易提取到错误的值。第二步在下一个请求的请求头或请求参数里引用变量。Jmeter的变量引用格式是${token}你可以在HTTP信息头管理器里添加一个名为Authorization的Header值填${token}。运行脚本后第二个请求就会自动携带上一步提取到的token值。第三步如果token是嵌套在JSON里的复杂结构建议用JSON提取器替代正则表达式提取器。它的语法是JSONPath比如$.data.token就能直接提取token。相比正则表达式JSONPath的优势是不用处理转义和繁杂的元字符可读性高也更容易维护。在接口测试中关联做得好的脚本可以完整地跑通“用户登录 - 获取订单列表 - 查看订单详情 - 取消订单”这样的业务闭环。这不仅覆盖了接口本身的功能还覆盖了接口之间的数据依赖关系是有价值的集成测试场景。我在实际工作中建议测试团队把每条核心链路都维护成一套Jmeter脚本跑一次回归就能覆盖主要的业务冒烟场景节省的时间非常可观的。3. 性能测试从脚本到压测方案的完整落地3.1 线程数、Ramp-Up、循环次数这三个参数到底怎么配性能测试这一步你的目标不再是“功能通不通”而是“系统跑得动跑不动”。Jmeter的性能测试模型主要靠线程组里的三个参数来刻画很多新手在这三个参数上栽过跟头。线程数虚拟用户数代表同时有多少个用户在做操作。线程数设200意味着有200个虚拟用户在同时跑脚本。但这里有个容易混淆的地方你的线程数不等于服务器的并发连接数。因为每个用户在执行两个请求之间可能还有思考时间这段时间请求并没有发到服务器。如果做纯粹的接口性能测试脚本里不加思考时间那么200个线程的吞吐量就比较接近200个并发请求的效果。如果要模拟真实用户行为就要在请求之间加定时器来模拟用户思考延迟。Ramp-Up时间线程启动的时间跨度。这个参数经常被忽略但它决定了压测的“冲击方式”。Ramp-Up设为0秒表示所有线程瞬间同时启动这对系统的冲击是最猛烈的适合测试系统的极限承载能力。Ramp-Up设为60秒表示200个线程在60秒内逐渐启动模拟的是用户逐渐增长的趋势。需要结合测试目标来选择测系统最大并发能力用短Ramp-Up测系统平滑扩容能力用长Ramp-Up。循环次数每个线程执行脚本的遍数。如果目的是做稳定性测试循环次数需要设得非常大或者勾选永远让压测持续数小时甚至数天。如果目的是做容量测试循环次数一般根据压测时长和预估TPS来估算。这里给个计算公式总请求数 线程数 × 循环次数。比如线程数200循环次数500那就是10万次请求。你还需要预估压测时长是多久确保脚本运行期间采样数据足够稳定。我习惯的配置路线是先测单线程跑通功能再逐步增加线程数和循环次数观察系统TPS的拐点在哪里。不要一上来就奔着几千线程去压那样不仅容易把测试环境压垮而且拿到的数据也没有参考意义。3.2 监听器和指标解读从聚合报告、TPS曲线到响应时间分布压测跑完后你得能从监听器里准确读出结果否则压测就是一场无效劳动。Jmeter里最常用的性能监听器有这几个聚合报告、汇总报告、用表格查看结果、以及配合插件使用的TPS和响应时间曲线。聚合报告是最核心的报告之一。它直接给出了几个关键指标样本数、平均响应时间、中位数、90%响应时间、95%响应时间、99%响应时间、吞吐量TPS、错误率。这里有一个关键认知平均响应时间并不是最能反映用户体验的指标。比如有100个请求其中99个响应时间是100毫秒1个响应时间是10秒平均值是约200毫秒看起来性能不错但那个10秒的请求真实用户是完全无法接受的。所以你现在应该理解了为什么性能测试报告里至少要包含90%响应时间甚至99%响应时间。TPS吞吐量是衡量系统处理能力的最核心指标。它的单位是“每秒事务数”。对这个指标的理解要注意一点聚合报告里的吞吐量是Jmeter客户端统计到的数据它反映的是从客户端发起请求到收到完整响应这个链路的处理能力包括了网络延迟并不等于服务端的纯处理能力。梯度压测的结果分析也有一个基本套路。你记录了每个并发梯度下的TPS和平均响应时间然后画一个“并发数-TPS”的曲线。你会发现曲线通常分为三段第一段TPS随着并发数线性增长系统资源还有余量第二段TPS增速放缓响应时间开始明显变长说明系统进入了瓶颈区第三段TPS不增反降响应时间急剧拉长说明系统已经过载。第二段的拐点就是你需要的最大合理并发数也就是系统的容量上限。3.3 加压策略设计为什么要做梯度加压而不是直接拉满很多团队做性能测试时喜欢直接把线程数拉到预期峰值比如500并发跑个半小时看结果。这种方式得出的结论往往只有一个系统挂了或者没挂。但生产环境的问题排查、容量规划、瓶颈定位需要的不是“挂没挂”的结论而是“系统在什么压力下开始劣化”的渐变过程。所以我在实际测试中更推荐梯度加压策略。所谓梯度加压就是把并发数分解成多个阶梯比如从50并发开始每5分钟增加50一直加到500或者系统达到瓶颈为止。每个梯度保持足够长的稳定时间让系统状态稳定下来再进入下一梯度。梯度加压有几个好处。第一它能帮助你观察系统从正常到过载的全过程找出性能拐点的准确位置这对容量规划非常关键比如你说系统能支撑多少在线用户依据就是这张梯度表和TPS拐点分析。第二它可以通过观察错误率的变化趋势判断是数据库连接池不够、线程池拒绝还是消息队列积压。第三它能有效保护测试环境避免一次性把系统压死后需要重启环境浪费时间。如果做的是稳定性测试建议在梯度加压找到的“健康负载下”持续运行8小时或更久观察有没有内存泄漏、连接池耗尽、磁盘空间被日志占满等渐进式问题。稳定性测试是很多团队忽略的一个测试类型但线上的很多事故恰恰是这类问题导致的压测时运行时间不到一小时根本发现不了。3.4 分布式压测单机不够用时的落地方式和注意事项当你的压测目标需要上千并发或者压测机的网络带宽成为瓶颈时单台Jmeter就撑不住了。Jmeter提供了分布式压测的解决方案基本思路是一台Master控制机加多台Agent执行机。Master负责把脚本分发下去、汇总结果Agent只负责执行脚本并返回结果。分布式压测的部署步骤并不复杂每台Agent机器的bin目录下启动jmeter-server脚本Master机器上通过命令行指定远程主机列表来发起压测。但这里有不少坑我逐一说明。第一个坑是脚本兼容性。所有Agent机器必须使用和Master相同的Jmeter版本和插件版本否则容易出现类找不到、脚本加载失败的问题。建议在分发脚本前先在一台Agent上手动执行一遍确认正常后再批量分发。第二个坑是结果汇总的数据准确性。分布式压下Master汇总的是每个Agent传输回来的采样结果本身会引入网络传输开销。如果Agent数量很多Master可能成为新的瓶颈。建议在压测过程中用InfluxDB加Grafana这种独立监控链路来做结果统计Jmeter的聚合报告仅作为参考。第三个坑是控制机和执行机的时间同步。如果没有NTP时间同步各个Agent采样的时间戳会不一致后期做关联分析会很痛苦。解决方式很简单给所有压测机配置同一个时间源。第四个坑是Agent机器的资源限制。Agent机器本身就压测工具需要消耗一定CPU和内存不要觉得Agent机器性能越强越好就可以无限增加线程数。通常一个Agent跑500个线程就已经需要2C4G以上的配置了需要在压测前做好资源规划。4. 从压测报告到性能瓶颈定位一条可复用的排查路径4.1 看到报告先别慌先把问题分类拿到压测报告发现TPS不达标、响应时间超出阈值这时候不少同学会开始手忙脚乱地改代码、加机器。我的建议是克制住冲动先把问题分类再按分类逐一排查。性能问题大致可以分为四类第一类功能层面的事务处理缓慢比如某条SQL查询特别慢或某个外部接口调用太耗时第二类系统性资源耗尽比如CPU饱和、内存溢出、磁盘IO瓶颈第三类中间件配置问题比如线程池太小、连接池耗尽、队列积压第四类全链路网络或架构问题比如跨机房调用延迟、DNS解析慢、带宽不足。不同的分类对应不同的排查手段。如果是功能层面问题你需要结合业务日志和时间链路去分析定位具体是哪一段代码拖慢了整个请求如果是资源问题就用系统监控工具看CPU、内存、磁盘、网络的实时曲线如果是中间件问题就需要检查连接池的使用率、队列长度、线程池活跃线程数如果是网络问题就需要用链路追踪工具看请求经过的每个节点的耗时分布。4.2 标准排查顺序从网络到中间件再到应用层最后看SQL我的排查顺序一般是固定的这样能保证不会遗漏常见问题。第一步先看压测机到服务器的网络链路。用ping或者mtr看基础网络延迟如果延迟在个位数毫秒级网络基本没问题。再查一下带宽利用率如果压测期间带宽跑满了那TPS上不去的原因可能不在服务器而在带宽受限。这个环节便宜且快值得最先做。第二步看服务器基础监控。CPU、内存、磁盘IO、网络连接数这四个指标用top、free、iostat、ss这些命令就能拿到。如果CPU多核跑满说明是计算密集型瓶颈如果内存持续增长可能是内存泄漏如果磁盘util接近100%说明IO在拖后腿。第三步看应用中间件和容器状态。检查线程池的活跃线程数是否打满数据库连接池的活跃连接数是否达到上限消息队列的堆积数量是否持续增长。这些指标可以帮助确认瓶颈是不是在连接池、线程池这样的资源池配置上。第四步深入应用日志和数据库。查看接口的响应时间分布看哪个环节消耗了大量时间。数据库这块开启慢查询日志找到压测期间执行时间较长的SQL用EXPLAIN分析执行计划确认索引有没有被正确使用有没有全表扫描、临时文件排序等问题。这套顺序的精髓是先看外围再看内部先看资源再看代码。数据越靠外层越容易获取越靠内层越难定位所以从外围到内层逐层缩小排查范围能大幅节省排查时间。4.3 常见性能问题速查表现象大概率原因快速验证方式CPU打满TPS上不去应用代码里有大量计算或死循环top命令查看CPU占用最高的进程/线程结合jstack抓取线程快照分析响应时间忽高忽低伴随连接超时线程池或连接池被打满查看中间件监控里的活跃线程数和池使用率内存持续增长最终OOM代码存在内存泄漏或大对象分配过多使用jmap查看堆内存使用配合GC日志分析GC频率数据库CPU高TPS上不去SQL执行慢或索引失效开启慢查询日志EXPLAIN分析执行计划TPS无法提高错误率上升限流器或网关配置了过低的流量阈值查看网关日志和限流配置确认是否有流量拦截单接口响应正常并发下变慢存在锁竞争比如数据库行锁、分布式锁查看数据库锁等待情况或使用链路追踪看阻塞点这个表格只是常见问题的起点实际压测中肯定会遇到各种组合型问题。我的建议是在压测报告里把系统资源数据和应用日志关联起来存储问题排查时先把时间轴对齐再逐项比对效率会高很多。5. 实操中必须绕开的坑和个人经验5.1 JVM参数与内存溢出性能压测还没结束Jmeter自己先挂了跑高并发压测时你可能遇到过这种情况客户端黑色窗口里刷满了OOM错误查看结果树里全是连接中断Jmeter自己先扛不住了。这往往不是被测系统的问题而是Jmeter跑在JVM里默认堆内存太小导致的。Jmeter默认的JVM堆内存是1GB左右如果你的脚本很复杂、监听器挂得很多、压测时长又长很快内存就会被撑爆。解决方式是在jmeter脚本文件Windows是jmeter.batLinux/Mac是jmeter里找到HEAP-Xms1g -Xmx1g -XX:MaxMetaspaceSize256m这类配置把Xms和Xmx调大一些。我自己的经验是把HEAP设成-Xms2g -Xmx4g具体要看压测机的物理内存来定。这里要特别提醒一个容易犯错的操作压测时不要开着GUI模式和查看结果树监听器跑大并发除非你想它挂掉。GUI模式本身要消耗大量资源去渲染界面查看结果树更是会把每个样本的完整请求和响应报文都存到内存里。压测时正确的做法是用GUI写好脚本并调试通过然后把脚本保存为jmx文件用命令行模式执行。命令行模式不仅内存开销小还可以通过设置输出csv或jtl结果文件来灵活生成报告。命令行启动压测的示例jmeter -n -t test_plan.jmx -l result.jtl -j test.log -e -o report_dir参数说明-n表示非GUI模式-t指定测试脚本文件-l指定结果文件路径-j指定日志文件-e表示压测结束后生成HTML报告-o指定报告生成目录。这套命令是我最常用的压测命令基本可以覆盖绝大多数的压测任务。5.2 Cookie、鉴权与租户隔离业务接口里最容易踩的隐藏陷阱接口测试和性能测试里业务鉴权和Cookie的处理是最容易踩坑的点因为它在Jmeter的默认配置里不会自动完成。常见场景是登录接口返回一个Cookie后续接口需要通过Cookie完成身份认证。这时最简单的处理方式是添加“HTTP Cookie管理器”并开启“每次迭代清除cookies”的开关。默认情况下Cookie管理器会存储服务端返回的Set-Cookie并在后续请求中自动携带。但有个坑如果脚本中每个线程各自登录用户A的Cookie可能会被用户B的请求带上导致数据串号。这个问题在性能测试中尤为明显。解决办法是把Cookie管理器的作用域控制好或者通过JSR223脚本动态管理每个线程的Cookie上下文。还有一类项目用的是Token鉴权通常需要在请求头里加一个Authorization字段。这种场景下我建议通过正则表达式提取器或JSON提取器把登录接口返回的Token提取出来放到一个变量里然后在HTTP信息头管理器里引用它。需要注意的是如果Token有过期时间长时长的稳定性测试会在中途出现大量401错误这时需要在脚本里增加自动重新登录的逻辑或者适当调整压测脚本的运行时长为Token有效期内。还有一个容易忽略的场景是租户隔离。很多SaaS系统中不同的数据属于不同的租户接口参数里必须携带租户ID。如果你在压测时所有线程共用一个租户ID实际上是把压力全部打在了同一条数据通道上既测不出真实的系统容量也可能触发单租户限流。解决思路是使用CSV文件为每个线程准备不同的租户数据从源头模拟真实的用户分布。5.3 脚本组织与团队协作一个人写脚本五个人维护的教训很多人觉得Jmeter脚本是个人工具写完自己用就行了。但在团队协作的项目里脚本的规范程度直接决定了项目的可持续性。我见过一份脚本线程组嵌套了五六层变量名全是var1、var2没有任何注释等需求变更需要修改时没人敢动它最后只能推倒重写。好的脚本组织方式我总结为三条准则命名清晰、模块化拆分、注释完整。命名清晰说的是测试计划、线程组、HTTP请求的名称要有业务语义。比如“登录接口-正确密码”和“登录接口-错误密码”而不是“Test1”、“Test2”。当脚本有几百个请求时语义化的命名能让你快速定位要改的对象。模块化拆分说的是把可复用的逻辑抽取成公共片段。Jmeter的“模块控制器”和“测试片段”就是干这个的。比如登录获取token这个逻辑可以在一个测试片段里写好其他线程组通过模块控制器引用它。这样当登录逻辑发生变化时你只需要改一处所有引用它的地方都会同步更新。注释完整这件事很多人觉得Jmeter只能加字段说明其实它支持在线程组上添加“常数吞吐量定时器”之外的逻辑控制元件也可以在HTTP请求中添加注释。更重要的是在测试计划节点上有“注释”编辑框在关键模块上用注释说明设计意图能帮后来者少走很多弯路。我强烈建议团队内部建立一份Jmeter脚本编写规范包含命名规则、目录结构、变量命名约定、断言规则和结果文件命名格式。这套规范不用一开始就定得很全每踩一个坑就往里补充一条三个月下来就会成为团队非常宝贵的资产。5.4 我对Jmeter学习路径的建议别光学工具要学方法论最后聊一点比较个人的体会。很多人学习Jmeter是看教程、记菜单、背组件却从来不问自己为什么要用这个组件。这种学习方式的结果是教程看完会做Demo换个业务场景就傻眼。我在带人的时候更希望他们掌握的是思路而不是工具命令。我给新人的学习路径建议是第一步用Jmeter跑通一个最简单的HTTP接口请求理解View Results Tree里的信息。第二步手动模拟一个完整的业务闭环比如登录加查询加下单理解参数化和关联。第三步尝试用CSV数据文件跑多组数据理解数据驱动测试的思想。第四步用线程组模拟并发压测一个接口理解TPS和响应时间的关系。第五步学着用命令行模式和HTML报告生成结果尝试定位一次简单的性能瓶颈。当你完成这五步后工具层面的操作就不再是障碍了。你真正需要修炼的是测试思维接口测试要覆盖哪些业务规则、性能测试要设置哪些场景、结果数据如何指导容量规划。这些能力和Jmeter没有直接关系但没有Jmeter这样的工具作为载体你很难在实际项目中具体感受它们。工具的熟练度和测试方法论这两条腿缺一条都走不远。再补充一个小技巧我在跟踪Jmeter各类问题时的经验是在排查问题之前先把Jmeter的日志文件和结果文件都导出并保存好这样问题往往可以复现找原因也有据可查。有时压测结束后发现数据不对回头翻日志才发现是脚本里一个变量覆盖导致的。保存一手现场是测试工程师的好习惯。
阅读完成 · 觉得有帮助?
咨询建站