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

资讯详情

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

性能测试计划怎么写?从指标设计到JMeter落地全指南

性能测试计划怎么写?从指标设计到JMeter落地全指南 做性能测试这些年我带过不少项目也面试过不少候选人。我发现一个特别普遍的现象很多人拿到性能测试任务的第一反应是打开JMeter开始录脚本而不是先坐下来写一份性能测试计划。结果往往是脚本写得很溜加压跑了好几天数据也攒了一大堆但一到评审会上就被问得哑口无言——你到底在测什么这个指标为什么定成1000 TPS失败的标准是什么性能测试计划就是为了回答这些问题的。这份计划不是给领导看的PPT也不是测试团队的流程装饰。它是一份可以指导你从需求分析、场景设计、脚本开发、环境准备、执行压测到结果评估的全过程操作手册。对新手来说学会写性能测试计划等于掌握了性能测试的全局视角对有经验的测试工程师来说一份扎实的计划能帮你挡住80%的返工和扯皮。这篇文章会从计划的核心组成、指标设计、负载模型、环境数据准备、排期评审几个维度把我实际项目中反复用到的思路和方法完整梳理一遍。适合正在学习软件测试、准备性能测试面试或者刚接手压测项目还不知道从哪下手的同学。1. 先搞清楚性能测试计划到底在解决什么问题1.1 没有计划的时候性能测试是怎么失控的先讲一个我早期踩过的坑。当时接手一个电商系统的压测需求方只丢过来一句话“系统马上要大促了帮忙测下性能。”我心想这不简单嘛直接拿JMeter录了个下单脚本200个线程跑起来结果一堆问题冒出来测试机的带宽先被打满了数据库连接池疯狂报错但没人说得清这些报错是脚本问题还是系统问题。跑了两个小时数据乱成一锅粥最后也没法给出一份有说服力的报告。回头复盘问题不在执行而在执行之前。没有计划意味着没有目标、没有边界、没有环境约束、没有数据准备方案、没有监控策略。你不知道系统当前能扛多少量不知道瓶颈在哪里更不知道什么算测完。所有问题都要靠试错去发现时间成本和经济成本都非常高。这个场景我相信做过压测的人都熟悉真实项目里几乎没有一次是可以“直接开跑”的凡是直接开跑的后面基本都在补救。1.2 一份计划能带来的实际价值性能测试计划的核心作用是把一次看起来模糊的“测一下系统快不快”变成一套可执行、可验收、可复盘的活动流程。具体来说它至少带来四个价值。第一是目标对齐。计划里清晰写出测试目标和成功标准开发、运维、产品、测试坐到同一张桌子上确认。这样就不会出现测试觉得P95响应时间要200ms开发觉得500ms也行产品压根没概念的尴尬局面。第二是资源前置。压测不是一个人一台电脑就能搞定的事。要不要单独的压测环境要不要运维配合调整配置要不要DBA准备海量数据这些问题在计划阶段暴露出来比到了执行阶段再临时找人高效得多。第三是风险控制。性能测试执行过程中压测本身可能对业务造成影响。计划里的风险评估和回退方案能确保就算出了问题也在可控范围内。第四是结果可衡量。有了明确的通过标准最后的报告就有依据评审会也不会变成“你觉得行不行”的主观讨论。2. 性能测试计划的核心组成一份能落地的计划长什么样一份真正能落地的性能测试计划至少要覆盖七个部分。我把它整理成一个框架你照着填就行。2.1 目标与范围先把“测什么”和“不测什么”钉死计划里第一块内容是背景说明和测试目标。背景说明写为什么要做性能测试比如业务大促、版本上线、架构改造这些背景决定了后续的资源投入和优先级。测试目标要具体不能写“验证系统性能良好”这种废话要写成“验证订单提交接口在300并发用户下TPS达到500以上响应时间P95小于500ms错误率低于0.1%”。测试范围包含功能范围和技术范围。功能范围要明确覆盖哪些业务链路比如登录、下单、支付、查询不覆盖哪些比如后台管理界面、报表导出。技术范围要明确涉及哪些层级是只测接口层还是包含网关、数据库、缓存、消息队列甚至前端页面。没有这些边界执行中一定会有人拿“这个你也没测到”来找你。范围描述越具体后期扯皮越少。我在计划里还会专门加一段“本次不做”的说明把明确不做的内容白纸黑字写出来比如不测前端渲染性能、不测第三方支付渠道的真实调用。这样虽然看起来有点啰嗦但能避免很多不必要的期望冲突。2.2 指标与成功标准把“快”变成数字性能测试计划里指标定义是最容易出现分歧的部分。每个角色对“性能好”的理解都不一样产品经理关心用户体感运维关心资源水位开发关心代码效率老板关心能支撑多少业务量。所以计划里必须写清楚三类指标业务指标TPS、QPS、并发用户数、业务成功率、技术指标响应时间的平均值、P90、P95、P99错误率吞吐量、资源指标CPU、内存、磁盘IO、网络带宽、数据库连接数、GC频率。这三类指标不是割裂的最后要能串起来讲一个完整的故事。比如“在500并发下订单接口TPS达到800P95响应时间280ms此时应用服务器CPU约60%数据库连接池使用率70%”。成功标准是判断测试是否通过的依据应当来自业务需求而不是拍脑袋。通常我会在计划里区分硬性标准和软性标准硬性标准是必须满足的比如错误率小于0.1%软性标准是优先达到的比如响应时间P95小于500ms但如果受硬件成本限制可以放宽到800ms。这样评审时就有了协商空间而不是要么全过要么全挂的僵硬状态。2.3 环境、数据、工具、排期、风险计划里的其他关键块剩下的五个部分虽然不需要写太多字但缺一个都会在后期埋雷。测试环境说明要写清楚用什么环境来做压测。最常见的风险是拿测试环境压测结果和生产环境配置差异过大导致压测结论完全没有参考价值。计划里至少要描述环境拓扑、服务器配置、依赖服务版本、网络隔离情况。测试数据策略要写清楚数据怎么准备。很多性能问题根本不是代码问题而是数据量没到位。比如列表查询接口数据库里只有1万条数据和1000万条数据性能表现完全不是一个量级。计划里要说明数据量规模、数据分布方式、造数方法。工具选型要写清楚用什么压测工具和监控工具。JMeter目前是使用率最高的开源压测工具配合InfluxDB加Grafana可以做实时监控。计划里要说明工具的部署方式、脚本组织方式、参数化方案。如果公司有自研压测平台也要在计划里说明走什么流程申请资源。排期计划要写出每个阶段的时间安排、负责人和交付物。一个标准性能测试项目可以分成需求分析、计划编写、脚本开发与验证、环境与数据准备、测试执行、结果分析与报告输出六个阶段。排期时要考虑环境的可用时间窗口因为压测环境通常是共享的需要提前预约。风险评估与应对要列出可能影响测试进度和质量的因素。比如生产环境压测可能影响线上业务、压测环境配置不达标、依赖接口不稳定等。每个风险都要有应对策略不能只列风险不给方案。3. 指标设计与需求分析怎么把业务需求翻译成技术指标为了让指标不是凭空想象我在每个项目中都会做需求分析这一步。很多测试工程师直接问“并发用户数是多少”但业务方往往答不上来。正确的做法是引导对方从业务角度描述场景再由你来计算技术指标。3.1 从业务诉求推导指标一个完整的推导过程举个实际例子。某零售系统要做促销活动运营给出的信息是促销时段高峰1小时内预计有20万用户参与主要集中在10分钟的抢购窗口。那么问题来了——压测时到底要用多少并发用户数先把一个小时的量折算成每秒请求20万用户、每人平均点击5次就是100万次请求除以3600秒得到约278 TPS。但这是平均量10分钟抢购窗口内的峰值肯定高于平均。按经验通常要放大3到5倍我们取4倍得到约1111 TPS。这就是目标流量的大致数量级。再用Littles Law把TPS换算成并发用户数并发用户数等于吞吐量乘以平均响应时间。假设目标响应时间P95是500ms、平均值300ms那么并发用户数大约是1111乘以0.3秒约333个用户。这里有个关键点JMeter里的线程数不等于并发在线用户数它更像同时发请求的活跃用户数。所以直接用TPS和响应时间反推线程数更靠谱。这个推导过程我会原原本本写进计划里因为它是整个测试目标最核心的依据。评审会上如果有人质疑指标直接把这个推导链亮出来比说一百句“这是业务方要求的”都管用。3.2 TPS、响应时间、错误率、资源利用率怎么定说完推导过程再说各项指标怎么定值。TPS和QPS是衡量系统处理能力的核心指标本质上是每秒钟能处理的请求数量。指标值怎么定优先参考历史数据线上有监控系统的直接拉峰值数据没有历史数据的用我上面讲的业务量推导法。如果既没有历史也没有业务量预估那就做容量测试通过阶梯加压找到系统当前的处理上限把这个上限作为基线值。响应时间要区分平均值、分位数和最大值。平均值很容易被少数慢请求拉高所以真实项目里更关注P95和P99。P95的意思是95%的请求响应时间小于等于这个值它排除了极端情况比平均值更能代表大多数用户的体验。一般用户体验标准是100ms以内非常流畅300ms以内感觉正常1秒以上会明显感受到卡顿。具体定多少要结合业务支付类接口和报表查询接口的容忍度完全不同。错误率要有明确的容忍范围。一般系统错误率控制在0.1%以内是可以接受的但要注意区分业务失败和系统错误。比如库存不足导致的业务失败不算系统错误HTTP 500、超时异常才属于系统错误。计划里要写清楚统计口径否则最后报告里大家各说各话。资源利用率用来判断系统还有多少余量。业界常用的安全水位是CPU不超过70%到80%内存使用稳定不持续上涨磁盘IO和网络带宽不接近上限。为什么是70%到80%而不是100%因为资源一旦打满系统容易出现雪崩GC加剧、线程阻塞、请求排队性能会断崖式下跌。留出余量是给流量突刺和故障转移留的空间。3.3 成功标准与预留水位别把系统压到极限关于成功标准我特别想提醒一点压测不应该以“系统不崩”为成功标准也不应该追求把系统压到极限。我曾经参与过一个项目测试团队为了展示系统的“强大”把CPU压到了95%TPS确实很高但响应时间已经从300ms涨到了2秒。这个数据看起来能支撑很大业务量但真实场景下用户已经明显感受到卡顿一旦流量再涨一点系统就在崩溃边缘。所以计划里的成功标准一定要包含预留水位。一般我会留出20%到30%的容量余量。什么意思呢如果预测峰值需要1000 TPS那系统在目标负载下至少要能稳定跑到1300 TPS左右且各项资源指标还在安全范围内。这样线上即使出现预估偏差或突发流量系统也不会立刻被打垮。4. 压测场景与负载模型设计从用户行为到JMeter脚本4.1 业务模型分析不是每个接口都要压很多新手写计划时把系统所有接口全部列一遍每个都压最后时间和资源严重浪费。正确的做法是先做业务模型分析找出影响系统性能的关键路径。怎么找关键路径有几个衡量维度调用频率高的接口、业务价值高的核心链路、涉及多个下游依赖的复杂接口、历史上出过性能问题的接口。比如电商系统登录、搜索、商品详情、加购、下单、支付就是核心链路而用户画像修改、消息中心这种低频接口即便有性能问题对业务的影响也可控。分析完接口还要分析用户操作比例。一个页面的流量中有的用户只看不买有的用户看几个商品就下单有的用户反复搜索。计划里的场景设计要把这些行为按真实比例混合起来而不是把几个接口平均分配压力。比如一次压测里商品详情页请求占40%搜索占25%加购占15%下单占12%支付占8%这样的混合比例才接近线上的真实流量结构。4.2 场景类型与选择五个基本压测场景性能测试场景不是只有一种不同目标对应不同场景。计划里要明确本次测试包含哪些场景以及每个场景的执行顺序。场景类型核心目标加压方式典型持续时长冒烟测试验证脚本和环境是否正常小并发快速执行3到5分钟负载测试验证常规负载下指标是否达标按目标TPS持续施压15到30分钟压力测试找到系统性能拐点和上限阶梯加压直到拐点视拐点位置而定稳定性测试验证长时间运行是否稳定目标负载持续施压4到24小时尖峰测试验证突发流量下的表现短时间内流量突刺数分钟到十几分钟实际项目中选哪些场景取决于测试目标和资源。没有时间和环境做全部场景时优先级是负载测试和压力测试优先稳定性测试和尖峰测试视情况安排。但要注意稳定性测试往往是发现内存泄漏和连接泄漏的唯一手段线上出现“跑几天就变慢”的问题基本都是稳定性测试没做够。4.3 用JMeter落地场景线程组、监听器与关键配置计划里写了场景还不够最终要落到脚本。这里结合JMeter讲一下场景的执行方式。在JMeter里落地一个压测场景最基本的操作路径是这样的创建线程组配置线程数、Ramp-Up Period启动时间、循环次数或持续时间。添加HTTP请求默认值配置协议、域名、端口避免每个请求重复填写。添加具体业务的HTTP请求用CSV数据文件做参数化模拟不同用户和不同数据。添加响应断言校验HTTP状态码和业务返回码确保压测流量是有效请求。添加查看结果树或后端监听器用于调试或指标采集。本地小并发调试通过后再部署到压测机或分布式集群正式执行。线程组就是JMeter里场景的载体。持续负载场景用“线程数 Ramp-Up Period 持续时间”的组合比如200线程、60秒内全部启动、持续1800秒。这里Ramp-Up Period很关键它控制线程启动的速率模拟真实用户逐步进入而不是一瞬间200个请求同时打过去。阶梯加压场景可以用插件实现也可以手工用多个线程组串联比如每5分钟增加50个线程观察TPS和响应时间的变化曲线。监听器用来观察结果但要注意JMeter自带的图形监听器非常消耗资源压测机本身性能会影响结果。如果压测规模比较大建议禁用图形监听器改用后端监听器把结果写入InfluxDB再用Grafana展示。生产级别的JMeter压测通常采用分布式模式一台控制机加多台压力机压力机越多模拟的负载越大。脚本里还要处理几个经典问题。参数化用CSV或函数生成不同的用户名、商品ID避免所有请求都打同一个数据导致缓存干扰结果。关联从上一个请求的响应里提取token、订单号等动态数据传给下一个请求。断言给请求加断言比如响应状态码200或者响应中包含特定关键字确保压测流量是成功的业务请求而不是一堆无效请求。5. 环境、测试数据与监控计划里最容易翻车的三个坑5.1 环境差异压测环境不等于生产环境怎么办这是性能测试里最核心的坑之一。测试环境通常是低配的网络环境也和真实生产不同拿测试环境的压测数据直接指导生产容量规划基本是自欺欺人。但完全复制一套生产环境成本又太高。稳妥的做法是在计划里对环境要求做分级。如果目标是做容量规划和性能基线评估至少要保证以下参数接近生产核心应用服务器的CPU核数与内存、数据库实例规格、网络带宽链路、依赖中间件的版本。如果做不到完全一致需要在计划里明确说明环境差异以及这些差异对结果的影响方向。比如压测环境数据库比生产小一号那压测得到的TPS上限在生产环境可能会更高这个结论要标注为“保守估计”。还有一种情况是直接在预发环境或生产环境压测。好处是数据真实坏处是压测流量可能影响真实用户。如果决定在生产压测计划里必须有严格的风险控制方案选择业务低峰期执行、压测流量打到独立标识的测试节点、配置限流和熔断兜底、提前知会运维和值班人员。没有这些保障措施生产压测就是在玩火。5.2 测试数据准备没有足够的数据压测就是在自欺欺人很多性能问题的根因在数据量。数据库只有几万条记录和一个亿的记录同一个SQL的执行计划完全可能不同。索引有没有生效、查询有没有全表扫描、分页深度大了之后性能衰减多快这些都依赖数据规模。计划里要明确每个场景所需的数据量。原则是基础数据量不低于生产环境的数量级。比如生产环境订单表有5000万行压测环境至少也要往这个量级靠。对查询类接口数据分布要有代表性比如热门商品、普通商品、冷门商品都要有否则查询走缓存和走数据库的比例失真是另一个陷阱。对写入类接口要准备足够的业务主键范围避免因为主键冲突导致压测失败。造数方法常用的有几种用存储过程批量造数、从生产脱敏导入、通过业务接口自动生成。我推荐优先考虑从生产脱敏导入数据分布最真实。实在没有生产数据的时候再写脚本造数据但要仔细核对数据类型和分布。造完数据后一定要先手动跑一遍核心SQL确认执行计划和生产环境一致这一步能省下后面大量排查时间。5.3 监控方案不监控的压测等于瞎压压测执行起来如果不看监控你只知道TPS是多少、响应时间是多少但不知道瓶颈在哪里。性能测试的核心价值之一就是定位问题而定位问题靠的是监控数据不是猜。监控要覆盖几层。应用层看请求处理逻辑借助APM工具查看方法级别的耗时分布中间件层要看Tomcat线程池、数据库连接池、消息队列堆积情况系统层看CPU、内存、磁盘、网络的实时曲线数据库层看慢查询、锁等待、连接数。JMeter本身记录的是客户端视角的数据要知道服务端发生了什么必须配合服务端监控。计划的监控部分要写清楚监控工具清单、监控对象、采集频率、由谁负责在压测过程中实时盯监控。我见过太多执行压测的人脚本跑起来就去喝茶了回来发现TPS掉了一半但完全不知道从什么时候开始掉的、中间发生了什么。实时盯监控不是可选项是执行阶段的默认动作。6. 排期、团队协作与计划评审6.1 排期计划预留缓冲别把压测排在版本发布前夜性能测试的排期经常会被压缩因为功能测试优先级更高版本发布又是硬节点。作为测试工程师要有意识地尽早介入把性能测试排进整体项目计划。一个性能测试周期建议按照以下比例分配时间需求分析与计划编写约占20%脚本开发与调试约占20%环境与测试数据准备约占20%测试执行约占30%结果分析与报告输出约占10%。很多人以为执行压测最耗时其实不是环境准备和数据准备才是最不可控的部分。环境申请要审批数据造好后还要验证这些工作经常因为依赖别人而延期。排期时一定要留出缓冲时间尤其是第一次测的系统谁也不知道执行中会遇到什么。我一般的做法是在计划里写出理想排期同时向项目组说明缓冲期和触发延期的条件提前打好预防针。比如明确“如果环境申请超过两个工作日测试完成时间顺延”这样一旦延期责任划分很清楚不会让人觉得是测试效率问题。6.2 团队协作性能测试不是测试一个部门的事一份完整的性能测试计划不仅要写测试团队自己的活还要写清楚对其他团队的依赖。这既是计划的一部分也是一种沟通工具。常见的分工是这样的。测试团队负责制定计划、设计场景、开发脚本、执行压测、分析结果、输出报告。开发团队负责解决压测过程中发现的功能和性能问题必要时提供代码层面的优化支持。运维团队负责压测环境搭建、服务端监控、生产压测时的安全管控。DBA负责数据库性能问题排查和数据准备。产品与业务方负责确认业务模型和指标目标。计划里最好用一张责任分配表把每个活动的负责人写清楚。因为性能测试一旦慢下来各团队很容易互相推诿——测试说环境配置不对运维说脚本没写好开发说数据量有问题。责任人写清楚了沟通成本至少减少一半。我自己写计划时每个活动后面都会加一列“配合人”避免执行时到处找人。6.3 评审会怎么开让评审成为对齐共识的机会性能测试计划写完不是终点评审会才是真正让计划生效的环节。评审不是走流程而是要达成几个共识目标和指标大家认不认范围边界大家认不认成功标准大家认不认排期和依赖大家认不认。我的经验是评审会前先把计划文档发给所有干系人让大家有问题提前标注。评审会上不要逐页念PPT重点讨论容易产生分歧的部分比如指标值怎么定的、环境差异怎么处理、生产压测风险怎么控制。评审通过后把评审意见和修改记录归档至少要让所有干系人确认过计划的最终版本避免执行到一半有人跳出来说“这个指标我没同意过”。评审过程中测试人员要做的不是等别人给意见而是用数据和推导过程说明自己每个决策的依据。比如指标定值把业务量推导过程摆出来把历史数据摆出来把预留水位的逻辑讲清楚别人有异议时你们讨论的是数据而不是感觉。这个习惯还有一个额外的好处它逼着你把每个数字的来源搞清楚以后写报告的时候所有结论都有据可查不会因为被追问一句就露怯。7. 常见问题与避坑指南7.1 高频问题速查整理几个我经常在项目和面试中遇到的计划相关问题直接做成速查表。问题底层考点正确思路并发用户数怎么定负载模型设计先做业务量分析得出目标TPS再用Littles Law换算最后用JMeter线程数模拟TPS和响应时间打架怎么处理性能分析与定位判断是否在可接受范围若响应时间过高但CPU未打满寻找锁竞争或单点瓶颈测试环境比生产低配结果怎么用环境差异处理作为基线和问题发现手段不直接换算生产容量最终依赖生产验证回归压测周期多长测试策略核心链路代码变更时做负载测试架构或参数调整时做完整回归压测第一个问题“并发用户数怎么定”很多人直接回答“用JMeter里的线程数”这个答案不完整。标准回答是先做业务量分析得出目标TPS再结合预期响应时间用Littles Law换算并发用户数最后在JMeter里通过线程数加Ramp-Up来模拟。第二个问题“TPS和响应时间打架怎么处理”。压测时TPS上去了响应时间也跟着涨这是正常现象关键看是否在可接受范围内。如果响应时间涨到超过目标值同时CPU资源还没打满说明存在锁竞争、串行化或某个单点瓶颈需要进一步定位。第三个问题“测试环境配置比生产低结果怎么用”。这没有标准答案但计划里必须如实说明环境差异。比较通用的做法是压测结果作为性能基线和问题发现手段而不直接换算成生产容量。生产容量的最终确认依赖生产环境的压测或灰度期间的监控数据。第四个问题“回归压测的周期该多长”。没有固定的答案一般建议每次发版涉及核心链路代码变更时做一轮负载测试涉及架构调整、数据库变更、连接池参数调整时做一轮完整的回归压测。完全没有变更的大版本可以只做冒烟压测。7.2 计划阶段容易被忽视的细节最后补充几个计划阶段容易忽视、但实际执行时特别影响体验的细节。压测机的性能要提前确认。JMeter压测机本身也会消耗CPU和内存尤其是启用大量断言、正则提取和图形监听器时。如果压测机性能不足它自己先变成瓶颈请求都积压在压测机本地给出来的TPS数据是假的。大规模压测要规划分布式压测集群压力机数量根据目标TPS和单台压力机能产生的负载量来预估至少要留出部署和联调的时间。压测时间段要提前确认。很多业务系统都有定时任务比如夜间批量对账、凌晨数据统计、整点缓存刷新。如果压测时间和批处理窗口冲突压测产生的数据可能会干扰批处理批处理也可能占用大量数据库和CPU资源导致压测结果完全失真。我在一个账务系统项目里就遇到过这种情况白天压测一切正常晚上同样的脚本压测TPS直接掉了一半排查了半天才发现是夜间批处理任务在抢资源。这类问题如果提前在计划里确认时间段和批处理窗口完全可以避免。报告模板要提前准备。很多人等到执行完才开始写报告最后手忙脚乱。我会在计划阶段就把报告模板写好包含目标、环境、场景、数据、结果曲线、问题清单、结论等部分。执行过程中把数据往里填最后整理分析即可。这里也提醒一句性能测试计划的文档不用写得花里胡哨重点是结构完整、责任清晰、数据可追溯。8. 计划之外一点个人的体会写到这里关于性能测试计划的框架和细节基本都说完了。最后分享一点我自己的体会。做性能测试这些年我越来越觉得计划写得好的项目执行通常都很顺计划写得潦草的项目执行基本要靠运气。很多人觉得写计划耽误时间不如多跑几轮压测来得实在。但实际情况是计划阶段花掉的几个小时通常能在执行阶段省下好几天。我也见过不少测试工程师技术功底不错脚本写得利索但写计划时不知道从哪里入手。我的建议是不用一开始就追求完美拿着前面的框架先填空写得多了自然就知道自己所在的业务最核心的指标是什么、最容易出的问题在哪个环节。计划不是给别人交差的东西它首先是你自己施工的图纸。拿着这张图纸后面每一步执行都会有底气。
返回列表