Apache JMeter:负载与压力测试

FreeGuideOnline 9阅读 2026-07-02

bash java -version


### 2. 下载与解压

前往 [Apache JMeter 官网](https://jmeter.apache.org/download_jmeter.cgi) 下载 `.zip` 或 `.tgz` 包,解压到任意目录(如 `~/tools/apache-jmeter-5.6.2`)。

### 3. 启动 JMeter

- **Windows**:双击 `bin/jmeter.bat`
- **macOS/Linux**:执行 `bin/jmeter.sh`

启动后会出现图形界面(GUI)和一个命令行控制台窗口。**真正执行测试时我们通常用命令行模式**,但初次学习先在 GUI 中创建脚本。

## 二、创建一个基本的 HTTP 测试计划

### 1. 测试计划结构

JMeter 的测试脚本称为**测试计划**,采用树形结构:

Test Plan (测试计划) ├── Thread Group (线程组) # 虚拟用户池 │ ├── HTTP Request Defaults # 公共请求默认值 │ ├── HTTP Header Manager # 请求头 │ ├── Sampler: HTTP Request # 具体请求 │ ├── Listeners # 结果查看器 │ └── Assertions # 断言(检查结果) └── ...


### 2. 添加线程组

右键 “Test Plan” → Add → Threads (Users) → **Thread Group**。

线程组是模拟用户的核心配置:

- **Number of Threads (users)**:并发用户数,即模拟的线程数。
- **Ramp-up period (seconds)**:所有线程启动所需时间。例如设为 10 秒,则每秒启动 1 个线程(当线程数=10 时)。
- **Loop Count**:每个线程执行采样器的循环次数。勾选“Forever”可无限循环,配合调度器使用。

**入门示例**:模拟 10 个用户同时访问,在 5 秒内全部启动,共循环 2 次。

### 3. 添加 HTTP 请求默认值

右键 Thread Group → Add → Config Element → **HTTP Request Defaults**。  
在此配置服务器 IP 或域名、端口号。例如:

- Protocol: `https`
- Server Name or IP: `www.example.com`

之后添加的所有 HTTP 请求都可以省略这些公共部分,修改起来也更方便。

### 4. 添加一个 HTTP 请求

右键 Thread Group → Add → Sampler → **HTTP Request**。  
配置项:

- **Name**:自定义,如“首页访问”
- **Path**:如 `/api/v1/products`
- **Method**:GET/POST 等

如果要发送 POST 请求并传参,可在“Parameters”表格中添加参数,或直接写在“Body Data”选项卡中。

### 5. 添加结果监听器

为了看到测试结果,需要添加监听器。常用三个:

- **View Results Tree**:查看每个请求的详细响应数据,调试时使用。正式测试时要禁用,否则极度消耗资源。
- **Summary Report**:实时统计,包括请求数、平均耗时、最小/最大耗时、错误率等。
- **Aggregate Report**:比 Summary Report 更详细,常用来生成最终报告。

右键 Thread Group → Add → Listener → 选择需要的监听器。

## 三、运行测试并分析基本指标

### 1. 保存测试计划

先保存脚本为 `.jmx` 文件,方便后续复用。

### 2. 运行(GUI模式)

点击工具栏绿色开始按钮。可以在监听器中实时看到数据变化。

### 3. 理解汇总报告

| 指标 | 含义 |
|------|------|
| **Samples** | 发出的请求总数 |
| **Average** | 平均响应时间(毫秒) |
| **Median** | 50% 请求的响应时间中位数 |
| **90% Line** | 90% 请求完成所需时间,反映高峰体验 |
| **Min / Max** | 最小 / 最大响应时间 |
| **Error %** | 错误比例,需重点关注 |
| **Throughput** | 吞吐量(请求数/秒),衡量系统处理能力 |
| **Received KB/sec** | 每秒接收的数据量 |

**典型分析思路**:如果 Average 低、Throughput 高且无错误,说明系统负载能力良好;如果并发增加后 Average 飙升、Throughput 停滞,则可能遇到了瓶颈。

## 四、进阶技巧:模拟真实用户行为

### 1. 添加思考时间(定时器)

真实用户不会连续不停点击操作。可在请求之间加入 **Constant Timer** 或 **Uniform Random Timer** 模拟等待。

右键 Thread Group → Add → Timer → Constant Timer:  
设置“Thread Delay”(毫秒),如 2000 表示每个采样器执行前固定等待 2 秒。

更真实做法:使用 **Gaussian Random Timer** 设置随机延时偏差。

### 2. 参数化与 CSV 数据驱动测试

模拟多用户用不同账号登录时,需要数据化。使用 **CSV Data Set Config**:

- 准备 CSV 文件,如 `users.csv`,含 `username,password` 列。
- 右键 HTTP Request → Add → Config Element → CSV Data Set Config。
- 指定文件路径,变量名与 CSV 列头一致(如 `username,password`)。
- 在 HTTP Request 的参数中使用 `${username}` 和 `${password}` 引用。

示例请求参数:

- `username` = `${username}`
- `password` = `${password}`

线程每次循环会按顺序或随机取一行数据。

### 3. 关联(提取动态数据)

很多场景需要从前一个请求的响应中提取数据,比如登录后的 token。使用 **Regular Expression Extractor** 或 **JSON Extractor**。

- 右键需提取的 HTTP Request → Add → Post Processors → Regular Expression Extractor。
- 填写参考变量名(如 `token`),正则表达式,模板等。
- 后续请求中通过 `${token}` 引用。

JSON 后处理器更易用,适合 JSON 响应。例如 `$.data.token` 直接提取值。

## 五、命令行模式与生成HTML报告

### 1. 为什么使用命令行

GUI 模式占用资源多,影响测试准确性。真实负载测试必须用 **CLI 模式**。

### 2. 命令行执行

```bash
jmeter -n -t testplan.jmx -l result.jtl -e -o report/