头像
淇迹时刻
-- : -- : --
切换主题色
-- : -- : --

JMeter实战案例详解

最后更新于:

JMeter实战案例详解

一、案例概述

1.1 案例介绍

本章节提供多个完整的JMeter性能测试实战案例,涵盖不同场景和技术栈,帮助读者掌握实际的性能测试技能。

1.2 案例列表

案例场景技术栈难度
案例1用户登录测试HTTP接口入门
案例2电商网站完整流程测试HTTP接口中级
案例3API接口性能测试RESTful API中级
案例4数据库性能测试MySQL中级
案例5文件上传下载测试HTTP文件传输中级
案例6WebSocket性能测试WebSocket高级
案例7微服务性能测试Spring Cloud高级

二、案例1:用户登录测试

2.1 需求分析

1需求:测试用户登录接口的性能
2场景:1000个用户同时登录
3目标:
4- 吞吐量:500请求/秒
5- 平均响应时间:< 500毫秒
6- 错误率:< 1%

2.2 测试计划设计

 1测试计划结构:
 2测试计划
 3├── 用户定义的变量
 4│   ├── base_url = http://localhost:8080
 5│   └── api_version = v1
 6├── 线程组(100线程,循环10次)
 7│   ├── HTTP请求默认值
 8│   │   协议: http
 9│   │   服务器名称: ${base_url}
10│   │   端口号: 8080
11│   ├── HTTP信息头管理器
12│   │   Content-Type: application/json
13│   │   Accept: application/json
14│   ├── CSV数据设置
15│   │   文件名: users.csv
16│   │   变量名称: username,password
17│   ├── HTTP请求(登录)
18│   │   方法: POST
19│   │   路径: /${api_version}/auth/login
20│   │   Body Data: {"username": "${username}", "password": "${password}"}
21│   ├── JSON断言
22│   │   JSON路径表达式: $.code
23│   │   期望值: 0
24│   └── 响应时间断言
25│       持续时间: 5000

2.3 测试数据准备

 1users.csv:
 2username,password
 3admin,admin123
 4user1,user123
 5user2,user234
 6user3,user345
 7user4,user456
 8user5,user567
 9user6,user678
10user7,user789
11user8,user890
12user9,user901
13user10,user1011

2.4 执行测试

1jmeter -n -t login_test.jmx -l login_results.jtl -e -o login_report

2.5 结果分析

 1测试结果:
 2- 样本数:1000
 3- 平均响应时间:200毫秒
 4- P90响应时间:400毫秒
 5- P99响应时间:800毫秒
 6- 错误率:0.2%
 7- 吞吐量:500请求/秒
 8
 9分析:
10- ✅ 吞吐量达到目标(500请求/秒)
11- ✅ 平均响应时间达标(200毫秒 < 500毫秒)
12- ✅ 错误率达标(0.2% < 1%)
13- ⚠️ P99响应时间偏高(800毫秒),需要优化

三、案例2:电商网站完整流程测试

3.1 需求分析

1需求:测试电商网站完整购物流程
2场景:用户登录 → 浏览商品 → 添加购物车 → 下单 → 支付
3目标:
4- 吞吐量:200请求/秒
5- 平均响应时间:< 1秒
6- 错误率:< 1%

3.2 测试计划设计

 1测试计划结构:
 2测试计划
 3├── 用户定义的变量
 4│   ├── base_url = http://localhost:8080
 5│   └── api_version = v1
 6├── 线程组(50线程,循环10次)
 7│   ├── HTTP请求默认值
 8│   │   协议: http
 9│   │   服务器名称: ${base_url}
10│   │   端口号: 8080
11│   ├── HTTP信息头管理器
12│   │   Content-Type: application/json
13│   │   Accept: application/json
14│   ├── HTTP Cookie管理器
15│   ├── 高斯随机定时器
16│   │   偏差: 500
17│   │   常量延迟: 1000
18│   ├── HTTP请求(登录)
19│   │   方法: POST
20│   │   路径: /${api_version}/auth/login
21│   │   Body Data: {"username": "test", "password": "123456"}
22│   ├── JSON提取器(提取Token)
23│   │   引用名称: token
24│   │   JSON路径表达式: $.data.token
25│   ├── HTTP请求(获取商品列表)
26│   │   方法: GET
27│   │   路径: /${api_version}/products
28│   │   信息头: Authorization: Bearer ${token}
29│   ├── JSON提取器(提取商品ID)
30│   │   引用名称: product_id
31│   │   JSON路径表达式: $.data.list[0].id
32│   ├── HTTP请求(获取商品详情)
33│   │   方法: GET
34│   │   路径: /${api_version}/products/${product_id}
35│   │   信息头: Authorization: Bearer ${token}
36│   ├── HTTP请求(添加购物车)
37│   │   方法: POST
38│   │   路径: /${api_version}/cart/add
39│   │   Body Data: {"product_id": ${product_id}, "quantity": 1}
40│   │   信息头: Authorization: Bearer ${token}
41│   ├── HTTP请求(结算)
42│   │   方法: POST
43│   │   路径: /${api_version}/checkout
44│   │   信息头: Authorization: Bearer ${token}
45│   ├── JSON提取器(提取订单ID)
46│   │   引用名称: order_id
47│   │   JSON路径表达式: $.data.order_id
48│   ├── HTTP请求(支付)
49│   │   方法: POST
50│   │   路径: /${api_version}/payment
51│   │   Body Data: {"order_id": "${order_id}", "amount": 99.9}
52│   │   信息头: Authorization: Bearer ${token}
53│   └── 聚合报告

3.3 执行测试

1jmeter -n -t e-commerce.jmx -l e-commerce_results.jtl -e -o e-commerce_report

3.4 结果分析

 1测试结果:
 2| 接口 | 样本数 | 平均响应时间 | P90 | P99 | 错误率 | 吞吐量 |
 3|------|--------|-------------|-----|-----|--------|--------|
 4| 登录 | 500 | 150ms | 300ms | 500ms | 0% | 100 |
 5| 获取商品列表 | 500 | 200ms | 400ms | 600ms | 0% | 100 |
 6| 获取商品详情 | 500 | 100ms | 200ms | 300ms | 0% | 100 |
 7| 添加购物车 | 500 | 250ms | 500ms | 800ms | 0.5% | 100 |
 8| 结算 | 500 | 400ms | 800ms | 1200ms | 1% | 100 |
 9| 支付 | 500 | 500ms | 1000ms | 1500ms | 1% | 100 |
10
11分析:
12- ✅ 登录、商品列表、商品详情接口性能良好
13- ⚠️ 添加购物车接口P99偏高,需要优化
14- ❌ 结算和支付接口错误率超过1%,需要修复
15- ❌ 支付接口响应时间超过1秒,需要优化

四、案例3:API接口性能测试

4.1 需求分析

1需求:测试RESTful API接口性能
2场景:10000并发用户调用API接口
3目标:
4- 吞吐量:1000请求/秒
5- 平均响应时间:< 300毫秒
6- 错误率:< 0.1%

4.2 测试计划设计

 1测试计划结构:
 2测试计划
 3├── 用户定义的变量
 4│   ├── base_url = http://localhost:8080
 5│   └── api_version = v1
 6├── 线程组(1000线程,循环Forever)
 7│   ├── HTTP请求默认值
 8│   │   协议: http
 9│   │   服务器名称: ${base_url}
10│   │   端口号: 8080
11│   ├── HTTP信息头管理器
12│   │   Content-Type: application/json
13│   │   Accept: application/json
14│   ├── 吞吐量定时器
15│   │   目标吞吐量: 60000(1000请求/秒)
16│   │   计算基础: 所有活跃线程
17│   ├── HTTP请求(API接口)
18│   │   方法: GET
19│   │   路径: /${api_version}/items/${__Random(1,100000)}
20│   ├── JSON断言
21│   │   JSON路径表达式: $.code
22│   │   期望值: 0
23│   ├── 响应时间断言
24│   │   持续时间: 3000
25│   └── 聚合报告

4.3 执行测试

1jmeter -n -t api-test.jmx -l api_results.jtl -e -o api_report -Jduration=300

4.4 结果分析

 1测试结果:
 2- 样本数:300000(5分钟测试)
 3- 平均响应时间:200毫秒
 4- P90响应时间:400毫秒
 5- P99响应时间:800毫秒
 6- 错误率:0.05%
 7- 吞吐量:1000请求/秒
 8
 9分析:
10- ✅ 吞吐量达到目标(1000请求/秒)
11- ✅ 平均响应时间达标(200毫秒 < 300毫秒)
12- ✅ 错误率达标(0.05% < 0.1%)
13- ⚠️ P99响应时间偏高(800毫秒),需要优化数据库查询

五、案例4:数据库性能测试

5.1 需求分析

1需求:测试MySQL数据库查询性能
2场景:100个并发用户执行查询
3目标:
4- 平均响应时间:< 200毫秒
5- 错误率:< 0.1%

5.2 测试计划设计

 1测试计划结构:
 2测试计划
 3├── 线程组(100线程,循环10次)
 4│   ├── JDBC连接配置
 5│   │   变量名: mysql_db
 6│   │   JDBC驱动类: com.mysql.cj.jdbc.Driver
 7│   │   JDBC URL: jdbc:mysql://localhost:3306/test
 8│   │   用户名: root
 9│   │   密码: password
10│   │   最大连接数: 50
11│   ├── JDBC请求(查询用户列表)
12│   │   变量名: mysql_db
13│   │   查询类型: Select Statement
14│   │   查询语句: SELECT * FROM users WHERE status = 1 ORDER BY created_at DESC LIMIT 20;
15│   ├── JDBC请求(查询订单详情)
16│   │   变量名: mysql_db
17│   │   查询类型: Select Statement
18│   │   查询语句: SELECT o.*, u.name FROM orders o JOIN users u ON o.user_id = u.id WHERE o.id = ${__Random(1,100000)};
19│   ├── JDBC请求(查询商品库存)
20│   │   变量名: mysql_db
21│   │   查询类型: Select Statement
22│   │   查询语句: SELECT * FROM products WHERE id = ${__Random(1,10000)};
23│   └── 聚合报告

5.3 执行测试

1jmeter -n -t db-test.jmx -l db_results.jtl -e -o db_report

5.4 结果分析

 1测试结果:
 2| 查询 | 样本数 | 平均响应时间 | P90 | P99 | 错误率 |
 3|------|--------|-------------|-----|-----|--------|
 4| 用户列表 | 1000 | 150ms | 300ms | 500ms | 0% |
 5| 订单详情 | 1000 | 300ms | 600ms | 1000ms | 0% |
 6| 商品库存 | 1000 | 50ms | 100ms | 200ms | 0% |
 7
 8分析:
 9- ✅ 用户列表查询性能良好
10- ✅ 商品库存查询性能优秀
11- ⚠️ 订单详情查询响应时间偏高,需要添加索引优化

六、案例5:文件上传下载测试

6.1 需求分析

1需求:测试文件上传下载接口性能
2场景:100个用户同时上传10MB文件,然后下载
3目标:
4- 上传吞吐量:50文件/分钟
5- 下载吞吐量:50文件/分钟
6- 平均响应时间:< 30秒

6.2 测试计划设计

 1测试计划结构:
 2测试计划
 3├── 用户定义的变量
 4   ├── base_url = http://localhost:8080
 5   └── file_path = /path/to/test_file.pdf
 6├── 线程组(100线程,循环1次)
 7   ├── HTTP请求默认值
 8      协议: http
 9      服务器名称: ${base_url}
10      端口号: 8080
11   ├── HTTP信息头管理器
12      Content-Type: multipart/form-data
13   ├── HTTP请求(文件上传)
14      方法: POST
15      路径: /api/upload
16      文件上传:
17          文件路径: ${file_path}
18          参数名称: file
19          MIME类型: application/pdf
20   ├── JSON提取器(提取文件ID
21      引用名称: file_id
22      JSON路径表达式: $.data.file_id
23   ├── HTTP请求(文件下载)
24      方法: GET
25      路径: /api/download/${file_id}
26   └── 聚合报告

6.3 执行测试

1jmeter -n -t file-test.jmx -l file_results.jtl -e -o file_report

6.4 结果分析

 1测试结果:
 2| 接口 | 样本数 | 平均响应时间 | P90 | P99 | 错误率 | 吞吐量 |
 3|------|--------|-------------|-----|-----|--------|--------|
 4| 文件上传 | 100 | 10秒 | 15秒 | 20秒 | 0% | 60文件/分钟 |
 5| 文件下载 | 100 | 5秒 | 8秒 | 12秒 | 0% | 120文件/分钟 |
 6
 7分析:
 8- ✅ 文件上传吞吐量达标(60 > 50)
 9- ✅ 文件下载吞吐量达标(120 > 50)
10- ✅ 响应时间达标(< 30秒)
11- ✅ 错误率为0%

七、案例6:WebSocket性能测试

7.1 需求分析

1需求:测试WebSocket消息推送性能
2场景:1000个用户同时连接WebSocket,接收实时消息
3目标:
4- 连接成功率:> 99%
5- 消息延迟:< 100毫秒
6- 消息丢失率:< 0.1%

7.2 测试计划设计

 1测试计划结构:
 2测试计划
 3├── 用户定义的变量
 4│   ├── ws_url = ws://localhost:8080/ws
 5│   └── message_count = 100
 6├── 线程组(1000线程,循环1次)
 7│   ├── WebSocket连接配置
 8│   │   协议: ws
 9│   │   服务器名称: localhost
10│   │   端口号: 8080
11│   │   路径: /ws
12│   ├── WebSocket请求(连接)
13│   │   操作: OPEN
14│   │   连接URL: ${ws_url}
15│   ├── WebSocket请求(订阅消息)
16│   │   操作: SEND
17│   │   消息内容: {"action": "subscribe", "channel": "news"}
18│   ├── WebSocket请求(接收消息)
19│   │   操作: TEXT
20│   │   等待消息数: ${message_count}
21│   ├── WebSocket请求(断开连接)
22│   │   操作: CLOSE
23│   └── 聚合报告

7.3 执行测试

1jmeter -n -t websocket-test.jmx -l ws_results.jtl -e -o ws_report

7.4 结果分析

 1测试结果:
 2- 连接数:1000
 3- 连接成功率:99.5%
 4- 平均消息延迟:50毫秒
 5- P90消息延迟:100毫秒
 6- P99消息延迟:200毫秒
 7- 消息丢失率:0.05%
 8
 9分析:
10- ✅ 连接成功率达标(99.5% > 99%)
11- ✅ 平均消息延迟达标(50毫秒 < 100毫秒)
12- ⚠️ P99消息延迟偏高(200毫秒),需要优化
13- ✅ 消息丢失率达标(0.05% < 0.1%)

八、案例7:微服务性能测试

8.1 需求分析

1需求:测试微服务架构下的系统性能
2场景:用户请求经过API网关,路由到多个微服务
3目标:
4- 端到端响应时间:< 2秒
5- 错误率:< 1%
6- 吞吐量:500请求/秒

8.2 测试计划设计

 1测试计划结构:
 2测试计划
 3├── 用户定义的变量
 4│   ├── api_gateway = http://localhost:8080
 5│   └── timeout = 30000
 6├── 线程组(100线程,循环10次)
 7│   ├── HTTP请求默认值
 8│   │   协议: http
 9│   │   服务器名称: ${api_gateway}
10│   │   端口号: 8080
11│   ├── HTTP信息头管理器
12│   │   Content-Type: application/json
13│   │   Accept: application/json
14│   ├── HTTP请求(用户服务)
15│   │   方法: GET
16│   │   路径: /api/users/${__Random(1,10000)}
17│   ├── HTTP请求(订单服务)
18│   │   方法: GET
19│   │   路径: /api/orders/${__Random(1,100000)}
20│   ├── HTTP请求(商品服务)
21│   │   方法: GET
22│   │   路径: /api/products/${__Random(1,10000)}
23│   ├── HTTP请求(支付服务)
24│   │   方法: POST
25│   │   路径: /api/payment
26│   │   Body Data: {"order_id": "${__UUID()}", "amount": 99.9}
27│   └── 聚合报告

8.3 执行测试

1jmeter -n -t microservice-test.jmx -l ms_results.jtl -e -o ms_report

8.4 结果分析

 1测试结果:
 2| 服务 | 样本数 | 平均响应时间 | P90 | P99 | 错误率 |
 3|------|--------|-------------|-----|-----|--------|
 4| 用户服务 | 1000 | 300ms | 500ms | 800ms | 0% |
 5| 订单服务 | 1000 | 500ms | 1000ms | 1500ms | 0.5% |
 6| 商品服务 | 1000 | 200ms | 400ms | 600ms | 0% |
 7| 支付服务 | 1000 | 800ms | 1500ms | 2500ms | 1% |
 8
 9分析:
10- ✅ 用户服务性能良好
11- ✅ 商品服务性能优秀
12- ⚠️ 订单服务响应时间偏高,需要优化
13- ❌ 支付服务错误率超过1%,需要修复
14- ❌ 支付服务P99响应时间超过2秒,需要优化

九、测试报告分析

9.1 关键指标解读

吞吐量(Throughput)

1定义:单位时间内处理的请求数
2单位:请求/秒(req/s)
3计算公式:吞吐量 = 总请求数 / 测试时间
4理想值:越高越好

响应时间(Response Time)

1定义:从请求发出到收到响应的时间
2单位:毫秒(ms)
3指标:
4- 平均响应时间:所有请求的平均时间
5- P50(中位数):50%请求的响应时间
6- P90:90%请求的响应时间
7- P99:99%请求的响应时间
8理想值:越低越好

错误率(Error Rate)

1定义:失败请求占总请求的比例
2单位:百分比(%)
3计算公式:错误率 = 失败请求数 / 总请求数 * 100%
4理想值:越低越好,通常要求 < 1%

资源利用率

1定义:服务器资源的使用情况
2指标:
3- CPU使用率:服务器CPU使用百分比
4- 内存使用率:服务器内存使用百分比
5- 磁盘I/O:磁盘读写速度
6- 网络带宽:网络传输速度
7理想值:CPU < 80%,内存 < 80%

9.2 报告模板

 1# 性能测试报告
 2
 3## 1. 测试概述
 4
 5### 1.1 测试目的
 6测试系统在高并发场景下的性能表现,验证系统是否满足性能指标要求。
 7
 8### 1.2 测试环境
 9- 操作系统:Linux CentOS 7
10- JDK版本:1.8
11- JMeter版本:5.6.3
12- 测试工具:JMeter 5.6.3
13
14### 1.3 被测系统
15- 系统名称:电商平台
16- 技术栈:Spring Boot + MySQL + Redis
17- 部署方式:Docker容器化部署
18
19## 2. 测试场景
20
21### 2.1 场景描述
22模拟用户登录 → 浏览商品 → 添加购物车 → 下单 → 支付的完整流程。
23
24### 2.2 测试参数
25- 并发用户数:1000
26- 测试时长:5分钟
27- 思考时间:1秒(高斯随机,偏差500ms)
28
29## 3. 测试结果
30
31### 3.1 汇总结果
32| 指标 | 结果 | 目标 | 是否达标 |
33|------|------|------|---------|
34| 吞吐量 | 500请求/秒 | 500请求/秒 | ✅ |
35| 平均响应时间 | 500毫秒 | < 1000毫秒 | ✅ |
36| P90响应时间 | 1000毫秒 | < 1500毫秒 | ✅ |
37| P99响应时间 | 2000毫秒 | < 2500毫秒 | ✅ |
38| 错误率 | 0.5% | < 1% | ✅ |
39
40### 3.2 接口详情
41| 接口 | 样本数 | 平均响应时间 | P90 | P99 | 错误率 | 吞吐量 |
42|------|--------|-------------|-----|-----|--------|--------|
43| 登录 | 10000 | 150ms | 300ms | 500ms | 0% | 100 |
44| 获取商品列表 | 10000 | 200ms | 400ms | 600ms | 0% | 100 |
45| 获取商品详情 | 10000 | 100ms | 200ms | 300ms | 0% | 100 |
46| 添加购物车 | 10000 | 250ms | 500ms | 800ms | 0.5% | 100 |
47| 结算 | 10000 | 400ms | 800ms | 1200ms | 1% | 100 |
48| 支付 | 10000 | 500ms | 1000ms | 1500ms | 1% | 100 |
49
50### 3.3 资源利用率
51| 资源 | 峰值 | 平均 |
52|------|------|------|
53| CPU使用率 | 75% | 50% |
54| 内存使用率 | 70% | 55% |
55| 磁盘I/O | 100MB/s | 50MB/s |
56| 网络带宽 | 500Mbps | 200Mbps |
57
58## 4. 问题分析
59
60### 4.1 问题列表
61| 问题 | 影响 | 严重程度 | 建议 |
62|------|------|---------|------|
63| 添加购物车接口P99偏高 | 用户体验下降 | 中 | 优化数据库索引 |
64| 结算接口错误率1% | 部分用户无法结算 | 高 | 修复结算逻辑 |
65| 支付接口响应时间长 | 用户等待时间长 | 中 | 优化支付流程 |
66
67### 4.2 性能瓶颈
68- 数据库查询慢:结算和支付接口涉及复杂的数据库查询
69- 缓存命中率低:部分接口没有有效利用缓存
70- 连接池配置不合理:数据库连接池大小不足
71
72## 5. 优化建议
73
74### 5.1 数据库优化
75- 添加索引:为orders表的user_id和status字段添加索引
76- 优化查询:使用JOIN替代子查询
77- 分页查询:限制查询结果数量
78
79### 5.2 缓存优化
80- 添加Redis缓存:对商品信息和用户信息进行缓存
81- 设置合理的缓存过期时间:根据数据更新频率设置
82
83### 5.3 连接池优化
84- 增加数据库连接池大小:从20增加到50
85- 调整连接池参数:优化最大空闲连接数和等待时间
86
87### 5.4 代码优化
88- 异步处理:将非核心逻辑改为异步执行
89- 批量操作:使用批量插入和更新减少数据库交互
90
91## 6. 结论
92
93### 6.1 测试结论
94系统在1000并发用户下整体性能良好,满足预期的性能指标要求。部分接口存在性能瓶颈,需要进行优化。
95
96### 6.2 后续建议
971. 按照优化建议进行系统优化
982. 重新执行性能测试验证优化效果
993. 定期进行性能监控,及时发现问题

十、性能测试最佳实践

10.1 测试前准备

11. 明确测试目标和指标
22. 准备测试环境(与生产环境一致)
33. 准备测试数据(真实、多样)
44. 设计测试计划(场景、参数、步骤)
55. 配置监控工具(服务器资源、应用指标)

10.2 测试执行

11. 从低负载开始,逐步增加负载
22. 每次只改变一个变量(如并发数)
33. 记录每次测试的配置和结果
44. 确保测试环境稳定(无其他干扰)
55. 多次测试取平均值

10.3 结果分析

11. 对比测试目标和实际结果
22. 分析性能瓶颈(CPU、内存、网络、数据库)
33. 识别异常指标(错误率、响应时间)
44. 定位问题根源(代码、配置、架构)
55. 提出优化建议

10.4 测试后总结

11. 生成测试报告(包含结果、分析、建议)
22. 分享测试结果给相关团队
33. 跟踪优化进度
44. 建立性能基线(用于后续对比)
55. 文档化测试过程和结果

感谢阅读!

至此,JMeter性能测试系列文档已全部完成。希望这些文档能帮助你掌握JMeter的使用方法和性能测试的核心技能。如果有任何问题或建议,欢迎随时交流!

最新文章