Ollama 为您提供全面的 JMeter 使用指南,包含从基础到高级的完整教程
·
我将为您提供全面的 JMeter 使用指南,包含从基础到高级的完整教程。
1. JMeter 基础概念
JMeter 核心组件
Test Plan(测试计划)
├── Thread Group(线程组)
│ ├── Sampler(取样器)
│ ├── Logic Controller(逻辑控制器)
│ ├── Listener(监听器)
│ ├── Timer(定时器)
│ └── Config Element(配置元件)
Test Plan(测试计划)
├── Thread Group(线程组)
│ ├── Sampler(取样器)
│ ├── Logic Controller(逻辑控制器)
│ ├── Listener(监听器)
│ ├── Timer(定时器)
│ └── Config Element(配置元件)
2. 安装和启动
下载和安装
bash
# 下载 JMeter(需要 Java 8+)
wget https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.2.tgz
tar -xzf apache-jmeter-5.6.2.tgz
cd apache-jmeter-5.6.2/bin
# 启动 JMeter GUI
./jmeter # Linux/Mac
jmeter.bat # Windows
# 下载 JMeter(需要 Java 8+)
wget https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.2.tgz
tar -xzf apache-jmeter-5.6.2.tgz
cd apache-jmeter-5.6.2/bin
# 启动 JMeter GUI
./jmeter # Linux/Mac
jmeter.bat # Windows
验证安装
bash
# 检查 Java 版本
java -version
# 检查 JMeter 版本
./jmeter -v
# 检查 Java 版本
java -version
# 检查 JMeter 版本
./jmeter -v
3. 创建第一个测试计划
基础 HTTP 测试
-
创建测试计划
- 右键 Test Plan → Add → Threads (Users) → Thread Group
-
配置线程组
properties
Number of Threads (users): 10 # 并发用户数
Ramp-up period (seconds): 1 # 启动时间
Loop Count: 5 # 循环次数
Number of Threads (users): 10 # 并发用户数
Ramp-up period (seconds): 1 # 启动时间
Loop Count: 5 # 循环次数
- 添加 HTTP 请求
- 右键 Thread Group → Add → Sampler → HTTP Request
properties
Protocol: HTTP
Server Name: api.example.com
Port: 80
Path: /api/v1/users
Method: GET
Protocol: HTTP
Server Name: api.example.com
Port: 80
Path: /api/v1/users
Method: GET
- 添加结果监听器
- 右键 Thread Group → Add → Listener → View Results Tree
- 右键 Thread Group → Add → Listener → Summary Report
4. 常用元件详解
线程组配置
properties
# 不同线程组类型
- Thread Group: 基础线程组
- setUp Thread Group: 测试前准备
- tearDown Thread Group: 测试后清理
# 高级配置
- Schedule: 调度器配置
- Duration: 测试持续时间
- Delay: 启动延迟
# 不同线程组类型
- Thread Group: 基础线程组
- setUp Thread Group: 测试前准备
- tearDown Thread Group: 测试后清理
# 高级配置
- Schedule: 调度器配置
- Duration: 测试持续时间
- Delay: 启动延迟
HTTP 请求采样器
properties
# 基本配置
Server Name: api.example.com
Port: 443
Path: /api/login
Method: POST
# 高级配置
Content encoding: UTF-8
Redirect Automatically: ☑️
Use KeepAlive: ☑️
# 参数配置
Parameters:
- username: testuser
- password: testpass
# 消息体数据(JSON)
{
"username": "testuser",
"password": "testpass"
}
# 基本配置
Server Name: api.example.com
Port: 443
Path: /api/login
Method: POST
# 高级配置
Content encoding: UTF-8
Redirect Automatically: ☑️
Use KeepAlive: ☑️
# 参数配置
Parameters:
- username: testuser
- password: testpass
# 消息体数据(JSON)
{
"username": "testuser",
"password": "testpass"
}
5. 配置元件
HTTP请求默认值
properties
右键 Test Plan → Add → Config Element → HTTP Request Defaults
Server Name: api.example.com
Port: 443
Protocol: HTTPS
右键 Test Plan → Add → Config Element → HTTP Request Defaults
Server Name: api.example.com
Port: 443
Protocol: HTTPS
HTTP信息头管理器
properties
右键 Thread Group → Add → Config Element → HTTP Header Manager
Content-Type: application/json
Authorization: Bearer ${token}
User-Agent: JMeter-Performance-Test
右键 Thread Group → Add → Config Element → HTTP Header Manager
Content-Type: application/json
Authorization: Bearer ${token}
User-Agent: JMeter-Performance-Test
CSV 数据文件设置
properties
右键 Thread Group → Add → Config Element → CSV Data Set Config
Filename: users.csv
Variable names: username,password,email
Delimiter: ,
Recycle on EOF: True
Stop thread on EOF: False
右键 Thread Group → Add → Config Element → CSV Data Set Config
Filename: users.csv
Variable names: username,password,email
Delimiter: ,
Recycle on EOF: True
Stop thread on EOF: False
users.csv 示例:
csv
username,password,email
user1,pass123,user1@test.com
user2,pass456,user2@test.com
user3,pass789,user3@test.com
username,password,email
user1,pass123,user1@test.com
user2,pass456,user2@test.com
user3,pass789,user3@test.com
6. 逻辑控制器
循环控制器
properties
右键 Thread Group → Add → Logic Controller → Loop Controller
Loop Count: 10 # 循环次数
右键 Thread Group → Add → Logic Controller → Loop Controller
Loop Count: 10 # 循环次数
事务控制器
properties
右键 Thread Group → Add → Logic Controller → Transaction Controller
Generate parent sample: ☑️ # 生成父样本
Include duration of timer: ☑️ # 包含定时器时间
右键 Thread Group → Add → Logic Controller → Transaction Controller
Generate parent sample: ☑️ # 生成父样本
Include duration of timer: ☑️ # 包含定时器时间
如果(If)控制器
properties
右键 Thread Group → Add → Logic Controller → If Controller
Condition: ${__jexl3("${status}" == "success")}
右键 Thread Group → Add → Logic Controller → If Controller
Condition: ${__jexl3("${status}" == "success")}
7. 定时器
固定定时器
properties
右键 HTTP Request → Add → Timer → Constant Timer
Thread Delay: 1000 # 每个请求间隔1秒
右键 HTTP Request → Add → Timer → Constant Timer
Thread Delay: 1000 # 每个请求间隔1秒
随机定时器
properties
右键 HTTP Request → Add → Timer → Gaussian Random Timer
Deviation: 300 # 偏差300ms
Constant Delay: 500 # 基础延迟500ms
右键 HTTP Request → Add → Timer → Gaussian Random Timer
Deviation: 300 # 偏差300ms
Constant Delay: 500 # 基础延迟500ms
8. 断言
响应断言
properties
右键 HTTP Request → Add → Assertion → Response Assertion
Apply to: Main sample only
Field to Test: Response Text
Pattern Matching Rules: Contains
Patterns to Test:
- "success"
- "status":200
右键 HTTP Request → Add → Assertion → Response Assertion
Apply to: Main sample only
Field to Test: Response Text
Pattern Matching Rules: Contains
Patterns to Test:
- "success"
- "status":200
JSON 断言
properties
右键 HTTP Request → Add → Assertion → JSON Assertion
JSON Path: $.data.user.id
Expected Value: 123
Validate against expected value: ☑️
右键 HTTP Request → Add → Assertion → JSON Assertion
JSON Path: $.data.user.id
Expected Value: 123
Validate against expected value: ☑️
持续时间断言
properties
右键 HTTP Request → Add → Assertion → Duration Assertion
Duration to assert: 1000 # 响应时间不超过1秒
右键 HTTP Request → Add → Assertion → Duration Assertion
Duration to assert: 1000 # 响应时间不超过1秒
9. 监听器
查看结果树
properties
用途:查看每个请求的详细响应
配置:保存响应数据(大测试时禁用)
用途:查看每个请求的详细响应
配置:保存响应数据(大测试时禁用)
聚合报告
properties
关键指标:
- Average: 平均响应时间
- Median: 中位数
- 90% Line: 90%请求的响应时间
- Error %: 错误率
- Throughput: 吞吐量
关键指标:
- Average: 平均响应时间
- Median: 中位数
- 90% Line: 90%请求的响应时间
- Error %: 错误率
- Throughput: 吞吐量
图形结果
properties
实时查看:响应时间趋势曲线
用途:观察性能波动
实时查看:响应时间趋势曲线
用途:观察性能波动
10. 变量和函数
用户定义变量
properties
右键 Test Plan → Add → Config Element → User Defined Variables
NAME VALUE
base_url https://api.example.com
api_version v1
timeout 5000
右键 Test Plan → Add → Config Element → User Defined Variables
NAME VALUE
base_url https://api.example.com
api_version v1
timeout 5000
JMeter 内置函数
jmeter
# 在请求中使用函数
${__time()} # 当前时间戳
${__Random(1,100)} # 随机数
${__CSVRead(users.csv,0)} # 读取CSV
${__UUID()} # 生成UUID
${__MD5(test123)} # MD5加密
${__StringToBase64(hello)} # Base64编码
# 在请求中使用函数
${__time()} # 当前时间戳
${__Random(1,100)} # 随机数
${__CSVRead(users.csv,0)} # 读取CSV
${__UUID()} # 生成UUID
${__MD5(test123)} # MD5加密
${__StringToBase64(hello)} # Base64编码
11. 分布式测试
主从配置
bash
# 主节点配置
./jmeter-server # 启动从节点服务
# 从节点配置(修改 jmeter.properties)
remote_hosts=192.168.1.101:1099,192.168.1.102:1099
# 运行分布式测试
./jmeter -n -t test.jmx -R 192.168.1.101,192.168.1.102 -l result.jtl
# 主节点配置
./jmeter-server # 启动从节点服务
# 从节点配置(修改 jmeter.properties)
remote_hosts=192.168.1.101:1099,192.168.1.102:1099
# 运行分布式测试
./jmeter -n -t test.jmx -R 192.168.1.101,192.168.1.102 -l result.jtl
命令行执行
bash
# 基础命令
./jmeter -n -t test_plan.jmx -l results.jtl -e -o report/
# 带参数执行
./jmeter -n -t test.jmx -Jusers=100 -Jrampup=60 -Jduration=300
# 生成HTML报告
./jmeter -n -t test.jmx -l result.jtl -e -o /path/to/report
# 基础命令
./jmeter -n -t test_plan.jmx -l results.jtl -e -o report/
# 带参数执行
./jmeter -n -t test.jmx -Jusers=100 -Jrampup=60 -Jduration=300
# 生成HTML报告
./jmeter -n -t test.jmx -l result.jtl -e -o /path/to/report
12. 实战测试案例
案例1:用户登录压力测试
jmeter
Test Plan: User Login Stress Test
├── Thread Group (100 users, ramp-up 10s, loop forever)
│ ├── CSV Data Set Config (login_data.csv)
│ ├── HTTP Header Manager (Content-Type: application/json)
│ ├── Transaction Controller (Login Flow)
│ │ ├── HTTP Request (POST /api/login)
│ │ ├── JSON Extractor (提取token)
│ │ └── Response Assertion (验证登录成功)
│ ├── Constant Timer (1000ms)
│ └── Summary Report
Test Plan: User Login Stress Test
├── Thread Group (100 users, ramp-up 10s, loop forever)
│ ├── CSV Data Set Config (login_data.csv)
│ ├── HTTP Header Manager (Content-Type: application/json)
│ ├── Transaction Controller (Login Flow)
│ │ ├── HTTP Request (POST /api/login)
│ │ ├── JSON Extractor (提取token)
│ │ └── Response Assertion (验证登录成功)
│ ├── Constant Timer (1000ms)
│ └── Summary Report
案例2:API 链式测试
jmeter
Test Plan: API Chain Test
├── Thread Group
│ ├── HTTP Request (登录) → JSON Extractor (提取token)
│ ├── HTTP Request (查询用户) → 使用${token}
│ ├── If Controller (判断用户权限)
│ ├── HTTP Request (有权限操作)
│ └── Response Assertion (验证整个流程)
Test Plan: API Chain Test
├── Thread Group
│ ├── HTTP Request (登录) → JSON Extractor (提取token)
│ ├── HTTP Request (查询用户) → 使用${token}
│ ├── If Controller (判断用户权限)
│ ├── HTTP Request (有权限操作)
│ └── Response Assertion (验证整个流程)
13. 高级技巧
BeanShell 脚本
java
// 前置处理器
String timestamp = String.valueOf(System.currentTimeMillis());
vars.put("unique_id", "user_" + timestamp);
// 后置处理器
String response = prev.getResponseDataAsString();
if (response.contains("error")) {
log.info("请求失败: " + response);
}
// 前置处理器
String timestamp = String.valueOf(System.currentTimeMillis());
vars.put("unique_id", "user_" + timestamp);
// 后置处理器
String response = prev.getResponseDataAsString();
if (response.contains("error")) {
log.info("请求失败: " + response);
}
正则表达式提取器
properties
Reference Name: token
Regular Expression: "token":"(.+?)"
Template: $1$
Match No.: 1
Default Value: NOT_FOUND
Reference Name: token
Regular Expression: "token":"(.+?)"
Template: $1$
Match No.: 1
Default Value: NOT_FOUND
调试技巧
properties
# 添加调试采样器
右键 → Add → Sampler → Debug Sampler
# 使用 Dummy Sampler 模拟请求
右键 → Add → Sampler → Dummy Sampler
# 添加调试采样器
右键 → Add → Sampler → Debug Sampler
# 使用 Dummy Sampler 模拟请求
右键 → Add → Sampler → Dummy Sampler
14. 性能测试最佳实践
测试策略
- 基准测试:单用户测试,建立性能基线
- 负载测试:逐步增加用户,找到性能拐点
- 压力测试:超出正常负载,测试系统极限
- 耐力测试:长时间运行,检查内存泄漏
优化建议
properties
- 禁用不需要的监听器(尤其在生产环境)
- 使用命令行模式执行大测试
- 合理设置超时时间和重试机制
- 定期保存测试计划
- 使用断言验证业务逻辑正确性
- 禁用不需要的监听器(尤其在生产环境)
- 使用命令行模式执行大测试
- 合理设置超时时间和重试机制
- 定期保存测试计划
- 使用断言验证业务逻辑正确性
15. 常见问题解决
内存溢出
bash
# 修改 jmeter.bat 或 jmeter.sh
HEAP="-Xms2g -Xmx4g" # 增加堆内存
# 优化测试计划
- 减少监听器数量
- 使用聚合报告代替查看结果树
- 分阶段执行大测试
# 修改 jmeter.bat 或 jmeter.sh
HEAP="-Xms2g -Xmx4g" # 增加堆内存
# 优化测试计划
- 减少监听器数量
- 使用聚合报告代替查看结果树
- 分阶段执行大测试
连接数限制
properties
# 在 HTTP Request 中设置
Use KeepAlive: ☐ # 禁用长连接
Implementation: HttpClient4
# 在 HTTP Request 中设置
Use KeepAlive: ☐ # 禁用长连接
Implementation: HttpClient4
这个完整的 JMeter 指南涵盖了从基础到高级的所有功能。您需要针对特定场景的详细配置吗?
更多推荐




所有评论(0)