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/