零基础学习性能测试第三章:制定性能测试策略

目录

策略就像性能测试的蓝图和导航仪,它能确保你的测试有目标、有方向、有效率,避免盲目测试和资源浪费。

下面我将一步步引导你,从零开始理解并制定一个基础的性能测试策略:

核心思想:性能测试不是"随便压一下",而是"有目标、有计划、有方法地验证系统表现"。

一、理解性能测试策略是什么?为什么重要?

  • 是什么? 一份详细的计划文档,定义了:
    • 为什么要测? (测试目标)
    • 测什么? (测试范围、关键业务场景)
    • 测到什么程度? (性能指标、成功标准)
    • 怎么测? (测试环境、测试工具、测试数据、测试类型、负载模型、执行计划)
    • 何时测? (时间安排)
    • 谁来测? (角色分工)
    • 风险是什么? (潜在问题和应对)
    • 需要什么资源? (人力、硬件、软件、时间)
  • 为什么重要?
    • 明确方向: 避免盲目测试,聚焦核心目标。
    • 统一认知: 让项目组所有人(开发、测试、运维、业务)对性能期望和要求达成一致。
    • 指导执行: 为后续的脚本开发、环境搭建、测试执行提供明确依据。
    • 衡量成功: 定义了什么是"通过",什么是"失败",有客观标准。
    • 提高效率: 合理规划资源,避免无效劳动。
    • 管理风险: 提前识别潜在问题,制定应对措施。

二、制定性能测试策略的关键步骤(零基础友好版)

第一步:明确测试目标 (Why?)

  • 核心问题: 我们做这次性能测试是为了解决什么问题?达到什么目的?
  • 常见目标 (新手可以从这些入手):
    1. 验收性能: 新系统上线前,验证其是否满足合同或需求规格书中要求的性能指标(如:支持1000用户并发登录,平均响应时间<2秒)。
    2. 发现瓶颈: 找出系统在压力下的性能瓶颈在哪里(是CPU、内存、数据库、网络还是代码?)。
    3. 评估容量: 了解系统在当前配置下最多能支撑多少用户/业务量?为扩容提供依据(如:服务器在响应时间<5秒时,最多能支持多少并发订单提交)。
    4. 验证稳定性: 系统在长时间(如8小时、24小时)稳定压力下是否能正常运行,是否存在内存泄漏、资源耗尽等问题。
    5. 评估优化效果: 对系统进行性能优化(如数据库调优、代码优化)后,验证优化是否有效果。
  • 零基础行动:
    • 找项目经理、产品经理或开发负责人沟通:"我们这个系统/新功能上线,对性能方面有什么具体的要求或担心吗?"
    • 查阅需求文档或合同:看是否有明确的性能指标要求。
    • 记录下明确的、可量化的目标(这是策略的核心!)
      • 错误示例: "系统要快"
      • 正确示例: "在100个用户并发执行关键查询操作时,95%的请求响应时间不超过3秒,且服务器CPU利用率不超过80%。"

第二步:确定测试范围和关键业务场景 (What?)

  • 核心问题: 测整个系统还是部分模块?哪些用户操作对性能最关键、最频繁?
  • 关键点:
    • 聚焦核心: 不可能也没必要测试所有功能。优先测试用户最常用、业务最关键、资源消耗最大、或改动风险最高的场景。
    • 识别业务场景: 用用户的语言描述操作流程。
  • 零基础行动:
    1. 列出主要功能模块: (如:用户登录、商品搜索、加入购物车、下单支付、查询订单)。
    2. 和业务方/产品沟通: "哪些功能是用户使用最频繁的?" "哪些业务流程对收入/用户体验影响最大?" "最近上线的新功能或改动大的功能是哪些?"
    3. 优先级排序: 选出3-5个最核心、最高频 的业务场景作为本次测试重点。例如:
      • 场景1:用户登录
      • 场景2:搜索商品并查看详情
      • 场景3:添加商品到购物车并提交订单
    4. 定义场景流程: 为每个关键场景写出具体的操作步骤(就像用户手册一样)。这将是后面编写测试脚本的基础。
      • 示例 (用户登录): 打开登录页面 -> 输入用户名 -> 输入密码 -> 点击"登录"按钮 -> 验证是否跳转到首页。

第三步:定义性能指标和成功标准 (How Well?)

  • 核心问题: 用什么数据来衡量性能好坏?达到什么数值才算合格?
  • 关键性能指标 (KPIs - 新手必须掌握的基础):
    1. 响应时间: 用户感觉到的快慢!最重要!
      • 页面/事务响应时间: 从发送请求到接收到完整响应的时间。
      • 关注点: 平均响应时间、百分位数响应时间(如90%, 95%) (更能反映大多数用户的体验)。
    2. 吞吐量: 系统在单位时间内处理的事务数/请求数。体现处理能力。
      • 如: 每秒处理订单数,每秒登录成功用户数。
    3. 并发用户数: 同时向系统发出请求的用户数量(注意:并发 ≠ 同时在线)。
    4. 资源利用率: 服务器硬件资源的消耗程度。
      • CPU利用率: (%)
      • 内存利用率: (% 或 具体用量 MB/GB)
      • 磁盘I/O: (读写速度 MB/s, 队列长度)
      • 网络带宽: (Mbps)
      • (数据库)关键指标: 连接数、慢查询数、锁等待时间等。
  • 设定成功标准: 给每个关键指标设定一个"通过"的阈值。这必须与第一步的目标一致!
    • 示例 (针对"用户登录"场景):
      • 在100个用户并发登录时:
        • 95% 的登录请求响应时间 ≤ 2 秒。
        • 登录事务吞吐量 ≥ 50 TPS (每秒成功登录50次)。
        • 应用服务器平均CPU利用率 ≤ 75%。
        • 数据库服务器平均CPU利用率 ≤ 70%。
        • 错误率 (登录失败) ≤ 0.1%。

第四步:设计测试类型和负载模型 (How?)

  • 核心问题: 用什么方式来模拟用户压力?压力怎么变化?
  • 常用测试类型 (新手先掌握前两种):
    1. 基准测试: 用很低的负载(如1个用户)运行测试,获取系统在"空闲"或"最优"状态下的性能数据。作为后续测试的对比基线。(强烈建议每次都做!)
    2. 负载测试: 最常用! 模拟预期的、正常的用户负载(如目标并发用户数),验证系统在典型压力下是否能满足性能指标(成功标准)。核心是验证目标是否达成。
    3. 压力测试: 逐步增加负载,超过 预期负载,直到系统性能显著下降或崩溃。目的是找到系统的瓶颈点最大容量
    4. 稳定性/耐力测试: 用预期负载(或稍高负载)长时间(如8小时、24小时、甚至更久)运行测试,检查系统是否存在内存泄漏、资源逐渐耗尽等稳定性问题。
    5. 并发测试: 模拟大量用户在极短时间内(如1秒内)同时发起某个操作(如抢购、秒杀),验证系统的并发处理能力和锁竞争情况。
  • 设计负载模型: 描述用户压力如何随时间变化。
    • 关键要素:
      • 并发用户数/虚拟用户数: 峰值是多少?如何增加到峰值(爬坡)?在峰值维持多久?如何下降(退坡)?
      • 思考时间: 用户操作之间的等待时间(模拟用户阅读、思考)。合理设置思考时间更贴近真实场景。
      • 负载分布: 不同业务场景的用户比例(如:30%用户浏览,50%用户搜索,20%用户下单)。
    • 零基础行动:
      • 根据目标选择合适的测试类型(先做负载测试验证目标)。
      • 设计一个简单的阶梯式增加负载 的模型:
        • 例如:0-2分钟:0用户 -> 50用户 (爬坡);2-5分钟:稳定在50用户;5-7分钟:50用户 -> 100用户 (爬坡);7-12分钟:稳定在100用户 (目标负载);12-14分钟:100用户 -> 0用户 (退坡)。
      • 为每个关键业务场景设置合理的思考时间(参考业务数据或经验估算,比如10-30秒)。
      • 确定多个场景同时运行时,各自的用户比例(如果同时测试多个场景)。

第五步:规划测试环境 (Where?)

  • 核心问题: 在哪里运行测试?环境要尽可能接近真实生产环境!
  • 环境要求:
    • 独立性: 最好有独立的性能测试环境,避免影响开发、测试或生产环境。
    • 仿真度: 硬件配置(服务器CPU、内存、磁盘、网络带宽)、软件配置(操作系统、中间件版本、数据库版本、应用配置)、网络拓扑结构等,尽可能与生产环境一致。如果资源有限,至少做到按比例缩小(但要清楚缩放带来的误差)。
    • 监控能力: 环境需要部署监控工具,用于收集第四步定义的各种性能指标(服务器资源、应用性能、数据库性能、网络性能等)。常用工具如:Grafana + Prometheus, Zabbix, Nagios, 以及应用性能管理(APM)工具等。
    • 测试机: 运行性能测试工具(如JMeter)的机器,需要有足够的资源(CPU、内存、网络)来产生足够压力,避免自身成为瓶颈。通常需要多台测试机做分布式压测。
  • 零基础行动:
    • 明确申请或搭建一个独立的测试环境。
    • 尽可能收集生产环境的配置信息,作为搭建或配置测试环境的基准。
    • 规划需要安装哪些监控工具,并确保测试时能正常收集数据。
    • 评估单台测试机是否能产生所需压力,如果不行,需要准备多台测试机进行分布式压测。

第六步:准备测试数据和工具 (With What?)

  • 测试数据:
    • 重要性: 数据量、数据分布(如热门商品、冷门商品)、数据真实性(如用户状态、订单状态)对测试结果影响巨大。
    • 要求:
      • 数据量: 数据库表的数据量(记录数)应接近生产环境规模或预期规模。(非常重要!小数据量测试结果往往不真实)
      • 数据质量/真实性: 数据应符合业务规则(如用户状态有效、订单状态流转合理)。避免使用简单自增ID,使用更分散的数据(如UUID)模拟真实情况。
      • 数据独立性: 测试数据应可重复使用,且测试执行不会破坏数据(需要设计数据清理和恢复机制)。
      • 参数化: 脚本中使用的用户名、商品ID等需要参数化,从数据池中动态获取,避免重复和缓存影响。
    • 零基础行动:
      • 确定关键业务场景需要哪些数据(如用户账号、商品信息、订单数据)。
      • 和DBA或开发合作,准备或生成足够量级、符合业务逻辑的测试数据
      • 规划如何参数化脚本(如使用CSV文件存储用户名密码)。
      • 规划测试前后的数据准备和清理方案(如:执行前备份数据库 -> 执行测试 -> 执行后恢复数据库)。
  • 测试工具:
    • 选择: 选择合适的性能测试工具。对于零基础,推荐:
      • Apache JMeter (首选): 开源、免费、功能强大、社区活跃、支持多种协议(HTTP, JDBC, JMS等)、图形化界面。学习曲线相对平缓,资料丰富。非常适合入门和大多数Web应用测试。
      • Locust: 开源、免费、基于Python脚本、支持分布式、可扩展性强。使用代码定义用户行为,对开发人员友好。
      • (商业工具如 LoadRunner, NeoLoad 功能更强大全面,但通常价格昂贵,初学者可先掌握开源工具)。
    • 零基础行动:
      • 下载并安装 JMeter (推荐)。官方网站有详细文档和入门教程。
      • 熟悉JMeter的基本概念:测试计划、线程组(模拟用户)、取样器(发送请求)、监听器(查看结果)、断言(验证响应)、配置元件(如CSV Data Set Config)、前置处理器/后置处理器
      • 尝试录制一个简单的HTTP请求。

第七步:制定执行计划和风险分析

  • 执行计划:
    • 明确测试执行的时间表(何时搭建环境、准备数据、开发脚本、执行测试、分析报告)。
    • 定义测试轮次(先做基准测试,再做负载测试,再做压力测试等)。
    • 明确入口/出口准则(什么条件下开始执行测试?什么条件下认为测试完成?例如:环境就绪、数据就绪、脚本通过验证)。
  • 风险分析:
    • 识别可能影响测试进行或结果准确性的风险。
    • 常见风险:
      • 测试环境与生产环境差异大。
      • 测试数据不足或不真实。
      • 测试工具或监控工具配置错误。
      • 网络不稳定影响测试。
      • 测试脚本不能准确模拟用户行为。
      • 测试时间或资源不足。
    • 制定应对措施:
      • 如:尽可能保证环境仿真度;提前充分准备数据;提前验证工具和脚本;选择网络稳定的时段测试;预留缓冲时间等。

第八步:明确角色和职责

  • 谁负责编写策略?
  • 谁负责搭建维护环境?
  • 谁负责准备数据?
  • 谁负责开发调试脚本?
  • 谁负责执行测试?
  • 谁负责监控系统?
  • 谁负责分析结果和编写报告?
  • (对于初学者,可能很多角色都是你自己,但明确每个任务由谁做很重要)

三、性能测试策略文档模板(简化版 - 供初学者参考)

复制代码
1.  引言
    *   项目/系统概述
    *   文档目的
2.  测试目标
    *   清晰列出本次测试要达到的具体、可量化的目标 (参考第一步)
3.  测试范围
    *   被测系统/模块
    *   包含的关键业务场景列表及简要描述 (参考第二步)
    *   (可选) 明确排除的范围
4.  性能指标与成功标准
    *   针对每个关键业务场景,列出要监控的性能指标及其对应的成功阈值 (参考第三步)
5.  测试方法
    *   测试类型 (负载测试、压力测试等) (参考第四步)
    *   负载模型描述 (并发用户数、爬坡/退坡时间、稳定时间、思考时间、场景比例) (参考第四步)
    *   测试工具 (JMeter, Locust等) (参考第六步)
6.  测试环境
    *   环境架构图 (应用服务器、数据库服务器、测试机等)
    *   硬件配置 (与生产环境对比)
    *   软件配置 (与生产环境对比)
    *   网络配置
    *   监控工具清单 (Grafana, Prometheus, APM等) (参考第五步)
7.  测试数据
    *   数据范围 (需要哪些数据)
    *   数据量要求 (记录数)
    *   数据准备方法 (生成、脱敏、恢复)
    *   数据参数化方案 (参考第六步)
8.  测试执行计划
    *   主要活动时间表 (环境准备、数据准备、脚本开发、测试执行轮次、结果分析、报告)
    *   入口/出口准则
9.  角色与职责
    *   列出参与人员及其任务
10. 风险与应对措施
    *   识别的主要风险及缓解计划 (参考第七步)
11. 附录 (可选)
    *   关键业务场景详细步骤
    *   参考文档

四、零基础学习建议

  1. 动手实践!动手实践!动手实践! 理论学习再多,不如亲手搭建环境、写个简单脚本、跑一次测试。从一个小Demo开始。
  2. 掌握JMeter基础: 它是你最重要的武器。学习创建测试计划、线程组、HTTP请求、查看结果树、聚合报告、使用CSV参数化、添加断言。网上有大量免费教程和视频。
  3. 理解核心概念: 反复理解响应时间、并发用户数、吞吐量、TPS、资源利用率、思考时间、爬坡这些基本概念。
  4. 关注监控: 压测时,盯着JMeter结果的同时,一定要学会看服务器(CPU, 内存, 磁盘, 网络)和数据库(连接数, 慢查询)的监控图。瓶颈往往在这里体现。
  5. 从小目标开始: 第一次制定策略不要追求完美。选择一个明确的小目标(如验证登录接口能否支持50并发),完成整个流程(策略 -> 环境 -> 数据 -> 脚本 -> 执行 -> 分析 -> 报告)。积累经验后再做更复杂的。
  6. 学会沟通: 性能测试不是测试一个人的事。多和开发、运维、架构师、产品经理沟通,获取需求、了解架构、确认环境、分析瓶颈。
  7. 利用资源:
    • 官方文档: JMeter, Locust 等工具的官方文档是最好的学习资料。
    • 在线教程/视频: Udemy, Coursera, Bilibili, YouTube 上有许多入门课程。
    • 社区/论坛: Stack Overflow, JMeter 用户邮件列表/社区。
    • 书籍: 《全栈性能测试实战》、《JMeter性能测试实战》等。

总结:

制定性能测试策略是性能测试成功的关键第一步。对于零基础者,最重要的是理解**"为什么测" (目标)** 和 "测什么" (场景),然后逐步学习"怎么测"和"怎么看结果"。从明确、可量化的目标出发,聚焦核心场景,利用好JMeter这样的工具,重视测试环境和数据的仿真度,并积极沟通和学习。不要怕第一次做得不完美,实践是掌握性能测试的最佳途径!祝你学习顺利!