Jmeter相关

2 minute read

Apache JMeter 性能测试 完整学习大纲

一、 JMeter 概述与性能测试基础

  • 1.1 JMeter是什么?
    • 定义:Apache JMeter™是一个纯Java桌面应用程序,用于功能行为和性能测试。
    • 主要用途:负载测试、压力测试、功能测试、回归测试、数据库测试、Web服务测试。
    • 特性:开源、跨平台、支持多协议、可扩展。
  • 1.2 性能测试基本概念
    • 并发用户 vs 吞吐量 vs 响应时间
    • 负载测试:验证系统在预期负载下的行为。
    • 压力测试:找到系统在极限负载下的瓶颈和崩溃点。
    • 疲劳测试:长时间、高稳定性的负载测试。
    • 容量规划测试:确定系统在满足性能指标下的最大容量。
    • 关键性能指标(KPI)
      • 响应时间(平均、P90/P95/P99)。
      • 吞吐量(Requests/Second, Transactions/Second)。
      • 错误率。
      • 资源利用率(CPU、内存、磁盘I/O、网络)。
  • 1.3 JMeter 架构与核心组件
    • 工作原理:基于线程组的模拟并发。
    • 测试计划:JMeter脚本的根节点。
    • 线程组:模拟并发用户的基础单元。
    • 取样器:发送请求的核心组件(HTTP, JDBC, FTP等)。
    • 逻辑控制器:控制取样器的执行顺序和逻辑。
    • 监听器:收集、查看和分析测试结果。
    • 配置元件:为取样器提供配置信息(参数、头、Cookie等)。
    • 前置/后置处理器:在请求发送前/后处理数据。
    • 断言:验证响应结果。
    • 定时器:控制请求的发送节奏。

二、 环境搭建与第一个测试计划

  • 2.1 系统要求与安装
    • Java环境:安装JRE或JDK(推荐JDK 8或11+),并配置JAVA_HOME
    • 下载JMeter:从Apache官网下载二进制包。
    • 目录结构
      • /bin: 可执行文件、启动脚本、配置文件(jmeter.properties)。
      • /lib: 核心库和扩展jar包。
      • /extras: 额外工具和样例。
      • /docs: 文档。
  • 2.2 启动与界面概览
    • GUI模式jmeter.bat(Windows)或 jmeter(Linux/macOS)。
    • 命令行模式jmeter -n -t [testplan.jmx] -l [results.jtl] -e -o [ReportFolder]
    • 主界面布局:菜单栏、工具栏、测试计划树、工作区。
  • 2.3 创建第一个HTTP负载测试
      1. 添加线程组
      1. 在线程组下添加HTTP请求取样器
      1. 配置服务器、端口、路径、方法。
      1. 添加查看结果树监听器(用于调试)。
      1. 添加聚合报告监听器(用于查看结果摘要)。
      1. 运行测试并查看结果。

三、 核心组件深度解析

  • 3.1 线程组
    • 线程数:模拟的并发用户数。
    • Ramp-Up时间:在多长时间内启动所有线程(秒)。
    • 循环次数:每个线程执行测试计划的次数(永远/固定次数)。
    • 调度器:设置测试的启动/结束时间和持续时间。
  • 3.2 取样器
    • HTTP请求:最常用。配置协议、服务器、端口、路径、方法、参数、消息体。
    • JDBC请求:用于数据库性能测试。需配合JDBC连接配置。
    • FTP请求SMTP请求SOAP/XML-RPC请求JMS请求等。
  • 3.3 逻辑控制器
    • 简单控制器:简单的容器,不控制逻辑。
    • 循环控制器:控制子元素的执行次数。
    • 仅一次控制器:每个线程在循环中只执行一次。
    • 交替控制器随机控制器随机顺序控制器
    • 如果(If)控制器:根据条件决定是否执行。
    • ForEach控制器:遍历变量。
    • 事务控制器:将多个取样器组合为一个事务,统计整体响应时间。
    • 模块控制器包含控制器Switch控制器
  • 3.4 配置元件
    • HTTP请求默认值:为同作用域下的HTTP请求设置公共属性。
    • HTTP信息头管理器:添加请求头(如Content-Type, Authorization)。
    • HTTP Cookie管理器:自动管理Cookie,模拟会话。
    • CSV 数据集配置:从外部文件(CSV)读取测试数据,实现参数化。
    • 用户定义的变量:定义静态变量。
    • 计数器:生成递增数字。
    • 随机变量:生成随机数。
    • JDBC连接配置:配置数据库连接池。
      详情关于Jmeter直连数据库

      jmeter-mysql-prepare

      jdbc-connection-config

      jdbc-request 一个request查询语句返回的值在下方Variable name处定义变量接收,取用的时候要使用下划线接下标(从1开始),因为返回的查询结果是一个类似列表的数据结构(可以添加一个Debug_Sampler查看request返回的响应内容)

  • 3.5 定时器
    • 固定定时器:在每个请求后暂停固定时间。
    • 高斯随机定时器均匀随机定时器
    • 同步定时器:阻塞线程,直到达到指定数量的线程后同时释放,制造瞬间高并发。
    • 常数吞吐量定时器:控制测试达到指定的吞吐量(每分钟/秒的请求数)。
  • 3.6 前置处理器与后置处理器
    • 前置处理器:在取样器执行前运行。
      • 用户参数:为每个用户设置不同的参数。
      • 正则表达式提取器:从响应中提取数据,并存储为变量。
      • JSR223 前置处理器:用脚本语言(Groovy)动态生成数据。
    • 后置处理器:在取样器执行后运行。
      • 正则表达式提取器(最常用)。
      • JSON提取器XPath提取器
      • 边界提取器
  • 3.7 断言
    • 作用:验证服务器的响应是否符合预期。
    • 响应断言:检查响应文本、响应代码、响应头、响应时间。
    • JSON断言XPath断言BeanShell断言
    • 大小断言:检查响应数据的大小。
    • 持续时间断言:检查响应时间是否超过阈值。
  • 3.8 监听器
    • 监听器的代价:在GUI模式下,监听器会消耗大量内存,在高负载测试时应使用简单数据写入器。
    • 查看结果树:显示每个请求和响应的详细信息(调试用,压测时禁用)。
    • 聚合报告:生成关键统计数据的汇总表(平均值、中位数、吞吐量、错误率等)。
    • 汇总报告用表格查看结果
    • 响应时间图活跃线程数图
    • 后端监听器:将结果直接发送到InfluxDB,配合Grafana展示。
    • 简单数据写入器:将原始结果写入.jtl文件(推荐用于非GUI压测)。

四、 脚本开发与高级技巧

  • 4.1 参数化与动态数据
    • 用户自定义变量:全局静态参数。
    • CSV 数据集配置:从外部文件循环/随机读取数据。
    • 函数助手:生成随机字符串、日期、计数器等。
    • 后置处理器提取:从上一个请求的响应中提取动态值(如Token、Session ID),供后续请求使用。
  • 4.2 关联
    • 定义:从服务器响应中获取动态数据,并将其作为参数传递给后续请求。
    • 实现:使用正则表达式提取器(通用)或JSON提取器提取值,保存到JMeter变量中,在后续请求中用${variable}引用。
  • 4.3 关联、参数化、断言综合案例
    • 模拟一个完整的业务流程:用户登录(获取Token)-> 查询信息 -> 提交数据。
  • 4.4 JMeter函数与变量
    • 函数语法__functionName(argument1, argument2, ...)
    • 常用函数
      • __time(): 获取当前时间戳。
      • __Random(): 生成随机数。
      • __counter(): 计数器。
      • __threadNum(): 获取线程号。
      • __V(), __evalVar(): 评估变量。
      • __FileToString(): 读取文件内容。
      • __P(): 获取命令行定义的属性。
  • 4.5 脚本录制与调试
    • 使用HTTP(S) 测试脚本录制器
      • 配置JMeter作为代理。
      • 配置浏览器或应用使用JMeter代理。
      • 录制用户操作。
    • 使用BadBoy或BlazeMeter扩展(录制浏览器操作)。
    • 调试方法
      • 使用“查看结果树”检查请求/响应。
      • 使用“调试取样器”和“调试后置处理器”查看变量。
      • 控制日志级别。

五、 负载场景设计、执行与监控

  • 5.1 设计负载模型
    • 阶梯式负载:逐步增加并发用户。
    • 波浪式负载:模拟波浪形的访问模式。
    • 峰值负载:短时间内制造极高并发。
    • 耐久性测试:长时间稳定负载。
  • 5.2 在非GUI模式下执行测试
    • 为什么? GUI模式消耗大量资源,不适合真正的压测。
    • 命令行语法jmeter -n -t testplan.jmx -l result.jtl -e -o /path/to/report/folder
    • -n: 非GUI模式。
  • -t: 测试计划文件。
  • -l: 结果文件(jtl或csv)。
  • -e: 测试完成后生成HTML报告。
  • -o: 输出HTML报告的目录(必须为空或不存在)。
  • 5.3 分布式测试(主从模式)
  • 场景:单机无法生成足够压力时。
  • 架构:一个控制机(Master) + 多个压力生成机(Slave)。
  • 步骤
    1. 在所有机器上安装相同版本的JMeter和Java。
    2. 在Slave机上启动jmeter-server(Unix)或jmeter-server.bat(Windows)。
    3. 在Master机的jmeter.properties中配置Slave机的IP和端口。
    4. 在Master机的GUI或命令行中远程启动所有Slave。
  • 5.4 服务器资源监控
  • JMeter插件:通过PerfMon插件监控服务器CPU、内存、磁盘、网络。
  • 代理方式:在目标服务器上启动ServerAgent,在JMeter中添加PerfMon监听器连接。
  • 操作系统工具:结合top, vmstat, iostat, netstat等命令。

六、 结果分析与报告

  • 6.1 结果分析基础
  • 理解聚合报告/汇总报告字段
  • 样本:总请求数。
  • 平均值中位数90%百分位95%百分位99%百分位:响应时间统计。
  • 最小值最大值
  • 异常%:错误率。
  • 吞吐量:每秒/每分钟处理的请求数/事务数。
  • 接收/发送KB/sec:网络吞吐量。
  • 6.2 生成HTML仪表板报告
  • 命令行生成:-e -o 参数。
  • 从现有结果文件生成:jmeter -g result.jtl -o /path/to/report
  • 报告内容
  • 概览:测试开始/结束时间,请求统计,错误统计,吞吐量,响应时间分布。
  • 请求详情:每个取样器的详细统计。
  • 错误详情。
  • 响应时间百分位图、活动线程图、吞吐量随时间变化图等。
  • 6.3 性能基线与趋势分析
  • 建立性能基线:在系统稳定、性能良好时运行测试,记录关键指标作为基准。
  • 持续集成:将JMeter测试集成到CI/CD流程,监控每次构建的性能变化。

七、 高级主题与最佳实践

  • 7.1 JMeter插件管理
  • JMeter Plugins Manager:插件管理利器。
  • 常用插件:
  • Custom Thread Groups: Stepping Thread Group, Ultimate Thread Group 等,提供更灵活的负载模型。
  • 3 Basic Graphs: 活动线程、响应时间、吞吐量实时图。
  • PerfMon: 服务器监控。
  • JSON/YAML Path Extractor: 提取JSON/YAML数据。
  • 7.2 测试WebService、数据库、JMS等协议
  • SOAP Web Service:使用HTTP请求取样器,消息体为XML,添加SOAP/XML-RPC请求取样器。
  • RESTful API:使用HTTP请求取样器,消息体为JSON,配合JSON提取器和断言。
  • JDBC测试:添加JDBC连接配置和JDBC请求取样器,编写SQL。
  • JMS测试:添加JMS点对点或发布/订阅相关的取样器。
  • 7.3 处理动态参数与加密
  • JSR223 取样器/处理器:使用Groovy、BeanShell等脚本语言生成动态值或进行加密。
  • 示例:使用Groovy计算MD5签名,生成时间戳。
  • 7.4 性能测试最佳实践
  • 脚本设计
  • 使用事务控制器组织业务。
  • 参数化所有硬编码数据。
  • 处理关联,避免脚本依赖。
  • 添加合理的断言,但不要过多。
  • 测试执行
  • 总是在非GUI模式下运行压测。
  • 使用足够的预热时间(Ramp-Up)。
  • 在独立、干净的测试环境中执行。
  • 监控所有相关系统(应用服务器、数据库、网络)。
  • 结果分析
  • 关注趋势和分布,而不是单个值。
  • 结合业务指标(如TPS、错误率)和系统资源指标。
  • 记录所有配置和测试数据。

八、 持续集成与自动化

  • 8.1 与Jenkins集成
  • 安装Jenkins和JMeter插件。
  • 配置构建步骤执行JMeter命令行。
  • 发布HTML报告。
  • 8.2 与Maven集成
  • 使用jmeter-maven-plugin插件。
  • 配置pom.xml,在mvn verify阶段自动执行JMeter测试。
  • 8.3 性能测试左移
  • 在开发早期进行API性能测试。
  • 将性能测试作为CI/CD流水线的一部分,设置性能质量门禁。

九、 常见问题与性能调优

  • 9.1 JMeter自身优化
  • 调整JVM参数(堆内存、GC策略)。
  • 使用命令行模式。
  • 减少监听器的使用,使用简单数据写入器。
  • 合理使用定时器控制吞吐量。
  • 9.2 常见性能瓶颈识别
  • 应用服务器:CPU、内存、线程池、连接池。
  • 数据库:慢SQL、锁、索引缺失、连接池。
  • 网络:带宽、延迟、DNS解析。
  • 中间件:消息队列、缓存。
  • 9.3 测试环境与生产环境差异处理
  • 尽量保持环境配置(硬件、软件、数据量)一致。
  • 使用比例模型进行推算。

十、 学习资源与进阶方向

  • 10.1 官方资源
  • Apache JMeter 官网
  • 用户手册
  • 最佳实践
  • 10.2 社区与工具
  • JMeter Plugins Manager
  • BlazeMeter(企业级SaaS负载测试平台)。
  • Ultimate Thread Group Calculator
  • 10.3 进阶学习
  • 学习BeanShell或Groovy脚本,实现复杂逻辑。
  • 开发自定义JMeter插件。
  • 结合InfluxDB + Grafana构建实时监控看板。
  • 10.4 实践项目
  • 为一个简单的Web应用(如电商登录-浏览-下单)设计并执行完整的性能测试。
  • 对一组RESTful API进行阶梯式压力测试,找出其最大TPS和瓶颈。
  • 设计一个长时间(如1小时)的稳定性测试,监控内存泄漏。