8. 测试-性能测试-工具简介及实战

发布时间:2026/11/6 3:23:11
8. 测试-性能测试-工具简介及实战

文章目录

  • 前言
  • 一、工具简介
    • 业务流程压测:JMeter
    • 企业复杂系统:LoadRunner
    • HTTP 极限性能:wrk
    • 简单快速验证:ab
  • 二、JMeter
    • 第一部分:基础教程
      • 🛠️ 第一步:安装适配 Java 8 的 JMeter
        • 1. 选择正确的版本
        • 2. 下载与解压
        • 3. 启动验证
        • 4. 界面汉化(可选)
      • 🚀 第二步:创建你的第一个测试计划Demo
        • 1. 添加线程组 (模拟用户)
        • 2. 添加 HTTP 请求 (模拟操作)
        • 3. 添加监听器 (查看结果)
      • 📊 第三步:运行与分析
        • 1. 运行测试
        • 2. 结果分析
    • 第二部分:进阶教程
      • 🚀 第一步:构建进阶测试计划
        • 1. 准备数据文件
        • 2. 配置登录接口
        • 3. 提取 Token
        • 4. 跨线程组传参
        • 5. 配置业务接口
        • 6. 调用全局 Token
      • 📊 第二步:运行与结果分析
        • 1. 添加监听器
        • 2. 运行测试
        • 3. 观察日志
        • 4. 结果分析
    • 第三部分:进阶分析
      • 第一步:构建测试计划(接口配置http请求)
        • 1. 进阶核心点:跨线程组传参(token 共享)
        • 2. 阶梯加压策略(Stepping Thread Group)
        • 3. 参数化配置(CSV Data Set Config)
        • 4. 关键配置细节审查
        • 5. 整体流程逻辑梳理
      • 第二步:结果分析(监听器详解)
        • 1. 查看结果树
        • 2. jp@gc - Active Threads Over Time
        • 3. jp@gc - Response Times Over Time
        • 4. jp@gc - Transactions per Second
        • 5. 聚合报告
    • 第四部分:脚本优化
        • 1. 替换 BeanShell(性能优化)
        • 2. 完善跨线程组取值
        • 3. 添加事务控制器
    • 第五部分:技巧
      • 1. 挡板机制
        • 1. 🧪 使用 WireMock(最推荐,轻量级)
          • 原理
          • 操作步骤
        • 2. ⚙️ JMeter 内部实现 Mock(无需额外工具)
          • 方案一:使用 JSR223 Sampler 模拟 HTTP 服务(最灵活)
          • 方案二:使用 JMeter 原生 HTTP Mirror Server(最简单)
          • 方案对比总结
        • 3. 🛡️ 使用 Nginx 反向代理(运维级方案)
          • 原理
          • 配置示例
          • 优点
        • ④📊 方案对比与总结

前言

高并发是大型架构核心,下面详解高并发技术工具。


一、工具简介

业务流程压测:JMeter

JMeter 是 Apache 旗下开源性能测试工具,最初面向 Web 应用测试。

来扩展到 HTTP、HTTPS、FTP、JDBC、SOAP、REST、JMS 等多种协议。

例如:

1. `登录` 2. `↓` 3. `查询商品` 4. `↓` 5. `加入购物车` 6. `↓` 7. `创建订单` 8. `↓` 9. `支付` 10. `↓` 11. `查询订单`

可以通过 JMeter 模拟大量用户同时执行这套业务流程。

适合大多数测试团队作为主力工具,尤其在接口测试与业务场景压测中表现突出。


企业复杂系统:LoadRunner

LoadRunner 是经典的商业性能测试工具,由 Micro Focus(原 HP)推出,长期被大型企业用于复杂系统的性能验证。

它覆盖协议广、建模能力强、分析报告成熟,是企业级性能测试的重要代表。

相比 JMeter,它更加偏向:大型企业级性能测试与完整性能测试体系。

例如:

1. `10000用户` 2. `↓` 3. `多个LoadGenerator` 4. `↓` 5. `应用集群` 6. `↓` 7. `数据库集群` 8. `↓` 9. `监控系统`

可以从整体系统角度分析性能。

LoadRunner 常用于:

  • 银行、保险、电商等大型系统;

  • 协议复杂的企业应用;

  • 需要严谨测试流程和正式报告的项目;

  • 大规模、专业化性能测试。


HTTP 极限性能:wrk

wrk 是一款现代化、高性能的 HTTP 压测工具,采用多线程模型,能够在较少资源消耗下产生较高压力。

典型使用:

`wrk -t4-c1000-d30s http://localhost:8080/`

它主要面向 HTTP/HTTPS 场景,常用于快速验证接口极限性能。


简单快速验证:ab

ab(ApacheBench)是 Apache 提供的老牌 HTTP 压测工具,使用非常简单,常用于基础性能验证。

-mikechen")

虽然功能不如现代工具丰富,但因其轻便、普及度高,仍被广泛使用。

如何来选择?

工具特点优势局限适用场景
JMeter功能全面协议多、脚本强、生态丰富占资源、高并发一般接口测试、业务流程压测
LoadRunner企业级专业工具协议全、报告强、流程完善成本高、复杂度高大型企业系统测试
wrk高性能命令行工具压测效率高、资源占用低功能单一HTTP 接口基准测试
ab经典轻量工具简单快速能力有限初步摸底、教学演示

如果需要复杂业务流程和多协议支持:优先选择 JMeter;
如果是大型企业、正式交付、预算充足:优先选择 LoadRunner;
如果目标是快速测 HTTP 性能极限:优先选择 wrk;
如果只是快速验证单接口:可以使用 ab。


二、JMeter

第一部分:基础教程

JMeter 版本最低 Java 要求你的环境 (Java 8)
JMeter 6.x (最新版)Java 17❌ 不支持 (无法启动)
JMeter 5.7 - 5.9Java 11+❌ 不支持 (无法启动)
JMeter 5.6.3Java 8+✅ 完美支持

由于 Apache JMeter 的最新版本(5.6+)已经不再支持 Java 8,如果需要使用当前的 Java 环境,必须安装旧版本的 JMeter。以下介绍Java 8 专属的安装与使用教程。


🛠️ 第一步:安装适配 Java 8 的 JMeter

1. 选择正确的版本
  • 核心规则:JMeter 5.5 及之前的版本支持 Java 8。
  • 推荐版本:JMeter 5.5(这是支持 Java 8 的最后一个稳定版本,功能足够强大)。
  • 避坑指南:千万不要下载 JMeter 5.6、5.6.3 或更高版本,否则启动时会报错提示Java version not supported。
2. 下载与解压
  1. 下载地址:访问 Apache JMeter 官方下载归档。
  2. 获取文件:找到并下载apache-jmeter-5.5.zip。
  3. 解压:将压缩包解压到一个路径中不包含中文和空格的目录(例如D:\JMeter\apache-jmeter-5.5)。
3. 启动验证
  1. 进入解压目录的bin文件夹。
  2. 双击jmeter.bat。
  3. 如果成功弹出图形界面,说明 Java 8 环境与 JMeter 5.5 完美匹配。
4. 界面汉化(可选)

默认是英文界面,建议修改配置永久汉化:

  • 打开bin/jmeter.properties文件。
  • 搜索language=en。
  • 修改为language=zh_CN(去掉前面的#号)。
  • 保存并重启 JMeter。

🚀 第二步:创建你的第一个测试计划Demo

我们将模拟10 个用户在10 秒内启动,并发访问百度首页。

1. 添加线程组 (模拟用户)

线程组是测试的发动机。

  • 在左侧“测试计划”上右键 ->添加->线程 (用户)->线程组。
  • 配置参数:
    • 线程数:10(代表 10 个虚拟用户)。
    • Ramp-Up 时间 (秒):10(代表在 10 秒内逐步启动这 10 个用户,避免瞬间冲击)。
    • 循环次数:1(每个用户执行 1 次任务)。
2. 添加 HTTP 请求 (模拟操作)

这是用户具体要执行的动作。

  • 右键点击“线程组” ->添加->取样器->HTTP请求。
  • 配置参数:
    • 协议:https
    • 服务器名称或IP:www.baidu.com
    • 端口号:(留空)
    • 方法:GET
    • 路径:/
3. 添加监听器 (查看结果)

没有监听器,测试数据将无法显示。

  • 查看结果树:用于调试,看请求是否成功。
    • 右键“线程组” ->添加->监听器->查看结果树。
  • 聚合报告:用于性能分析,看响应时间和吞吐量。
    • 右键“线程组” ->添加->监听器->聚合报告。

📊 第三步:运行与分析

1. 运行测试

点击工具栏上方的绿色“播放”按钮 (▶️)。

2. 结果分析

测试完成后,点击“聚合报告”,重点关注以下指标:

表格

指标名称含义你的关注点
Average平均响应时间数值越小越好(单位:毫秒)。
90% Line90% 请求的响应时间比如是 50ms,说明 90% 的用户都在 50ms 内得到了响应。
Error %错误率必须为 0%。如果有红色报错,说明请求失败。
Throughput吞吐量 (TPS/QPS)服务器每秒处理的请求数,数值越大性能越好。

第二部分:进阶教程

目标的测试计划结构非常清晰,是一个典型的登录获取 Token -> 传递 Token -> 携带 Token 请求业务接口的链路测试场景。

🚀 第一步:构建进阶测试计划

构建一个“登录获取 Token -> 跨线程组传递 -> 业务接口调用”的实战场景。

1. 准备数据文件

CSV Data Set Config

  • 操作:在本地创建一个codes.csv文件,内容如下:

    文件内容是模拟认证鉴权Oauth2.0流程的授权码列表。

    测试目标是已通过用户名密码认证后进入,获取授权码->获取token->接口交互的流程

    h3UVsSKprUTK WY2FIJBQBlng nMkIuCspPQvC
  • JMeter配置:

    • 右键点击“测试计划” -> “添加” -> “配置元件” -> “CSV 数据文件设置”。
    • 文件名:选择你的codes.csv路径。
    • 变量名称:填写code(与文件列对应)。
    • 作用:让每个线程(用户)登录时使用不同的授权码。
2. 配置登录接口

HTTP Request + HTTP Header Manager
HTTP 请求 + HTTP信息头管理器

操作:右键“线程组” -> “添加” -> “取样器” -> “HTTP 请求”。命名为“登录接口”。

  • 配置:

    • 协议:HTTPS。

    • 服务器名称或 IP:auth-api-perf.xxx.com.cn。

    • 路径:/auth/oauth2/begin-by-postal。

    • 方法:POST。

    • Body Data(在“发送文件随请求”上方):

      {"code":"${code}"}

      注意:这里使用了${}来调用 CSV 中的变量。

信息头管理器,请求头列表中不要多余空行,请求头的键值项也必须准确无空格。

3. 提取 Token

JSON Extractor
JSON提取器

登录成功后,服务器会返回 JSON 数据,我们需要从中提取token。

  • 操作:右键点击“登录接口” -> “添加” -> “后置处理器” -> “JSON 提取器”。
  • 配置:
    • 名称:提取请求结果token。
    • 作用域:主样本(Main sample only)。
    • Names of created variables:token(定义变量名)。
    • JSON Path expressions:$..value(假设返回的 JSON 中 token 字段叫 value,封装在两层的结构体中,请根据实际返回修改)。
    • Match No.:1。
4. 跨线程组传参

BeanShell PostProcessor
BeanShell 后置处理器

这是进阶的核心。JMeter 默认变量是线程隔离的,为了让后续的“业务线程组”能用到这里的 token,必须将其转为全局属性。

  • 操作:右键点击“登录接口” -> “添加” -> “后置处理器” -> “BeanShell 后置处理器”。

  • 配置:有以下两种方式可以实现

    • 使用 JMeter函数,如,内置的__setProperty函数。在脚本区域输入以下代码:

      ${__setProperty(global_token,${token},)};

      不要加//注释,因为 BeanShell 可能会尝试解析注释后的符号

      代码解释:将提取到的局部变量 token 转换为全局属性 global_token。第三个参数 true 表示保存到文件,重启 JMeter 后依然有效(可选)

    • 使用 BeanShell 原生 API。在脚本区域输入以下代码:

      // 获取局部变量 tokenStringtokenVal=vars.get("token");// 判空保护if(tokenVal!=null){// 设置为全局属性props.