我将为您提供全面的 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 测试

  1. 创建测试计划

    • 右键 Test Plan → Add → Threads (Users) → Thread Group
  2. 配置线程组

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                       # 循环次数
  1. 添加 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
  1. 添加结果监听器
    • 右键 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. 性能测试最佳实践

测试策略

  1. 基准测试:单用户测试,建立性能基线
  2. 负载测试:逐步增加用户,找到性能拐点
  3. 压力测试:超出正常负载,测试系统极限
  4. 耐力测试:长时间运行,检查内存泄漏

优化建议

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 指南涵盖了从基础到高级的所有功能。您需要针对特定场景的详细配置吗?

 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐