Jmeter相关
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: 文档。
- Java环境:安装JRE或JDK(推荐JDK 8或11+),并配置
- 2.2 启动与界面概览
- GUI模式:
jmeter.bat(Windows)或jmeter(Linux/macOS)。 - 命令行模式:
jmeter -n -t [testplan.jmx] -l [results.jtl] -e -o [ReportFolder]。 - 主界面布局:菜单栏、工具栏、测试计划树、工作区。
- GUI模式:
- 2.3 创建第一个HTTP负载测试
-
- 添加线程组。
-
- 在线程组下添加HTTP请求取样器。
-
- 配置服务器、端口、路径、方法。
-
- 添加查看结果树监听器(用于调试)。
-
- 添加聚合报告监听器(用于查看结果摘要)。
-
- 运行测试并查看结果。
-
三、 核心组件深度解析
- 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直连数据库


一个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扩展(录制浏览器操作)。
- 调试方法:
- 使用“查看结果树”检查请求/响应。
- 使用“调试取样器”和“调试后置处理器”查看变量。
- 控制日志级别。
- 使用HTTP(S) 测试脚本录制器:
五、 负载场景设计、执行与监控
- 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)。
- 步骤:
- 在所有机器上安装相同版本的JMeter和Java。
- 在Slave机上启动
jmeter-server(Unix)或jmeter-server.bat(Windows)。 - 在Master机的
jmeter.properties中配置Slave机的IP和端口。 - 在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小时)的稳定性测试,监控内存泄漏。