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.9 | Java 11+ | ❌ 不支持 (无法启动) |
| JMeter 5.6.3 | Java 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. 下载与解压
- 下载地址:访问 Apache JMeter 官方下载归档。
- 获取文件:找到并下载
apache-jmeter-5.5.zip。 - 解压:将压缩包解压到一个路径中不包含中文和空格的目录(例如
D:\JMeter\apache-jmeter-5.5)。
3. 启动验证
- 进入解压目录的
bin文件夹。 - 双击
jmeter.bat。 - 如果成功弹出图形界面,说明 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% Line | 90% 请求的响应时间 | 比如是 50ms,说明 90% 的用户都在 50ms 内得到了响应。 |
| Error % | 错误率 | 必须为 0%。如果有红色报错,说明请求失败。 |
| Throughput | 吞吐量 (TPS/QPS) | 服务器每秒处理的请求数,数值越大性能越好。 |
第二部分:进阶教程
目标的测试计划结构非常清晰,是一个典型的登录获取 Token -> 传递 Token -> 携带 Token 请求业务接口的链路测试场景。
🚀 第一步:构建进阶测试计划
构建一个“登录获取 Token -> 跨线程组传递 -> 业务接口调用”的实战场景。
1. 准备数据文件
CSV Data Set Config
操作:在本地创建一个
codes.csv文件,内容如下:文件内容是模拟认证鉴权Oauth2.0流程的授权码列表。
测试目标是已通过用户名密码认证后进入,获取授权码->获取token->接口交互的流程
h3UVsSKprUTK WY2FIJBQBlng nMkIuCspPQvCJMeter配置:
- 右键点击“测试计划” -> “添加” -> “配置元件” -> “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.