4. JMeter实战
好,咱们直接进入正题。这一章是JMeter实战的入门核心,说白了就是让你学会怎么搭一个能用的压测脚本。我见过太多人一上来就搞复杂场景,结果连基础配置都没搞对,压出来的数据根本没法看。咱们一步步来,先把地基打牢。
4.1 线程组配置——压测的“发动机”
线程组,就是模拟用户的“虚拟用户池”。你配置多少个线程,JMeter就会开多少个并发用户去发请求。我个人习惯把线程组看作压测的“油门”,踩多深,压力就有多大。
核心参数解读:
- 线程数(Number of Threads): 并发用户数。比如设100,就是同时有100个虚拟用户在工作。
- Ramp-Up Period(秒): 启动所有线程所用的时间。我建议设成线程数/10左右,比如100线程就设10秒,让压力缓慢爬升,避免瞬间打崩服务器。
- 循环次数(Loop Count): 每个线程执行多少次请求。勾选“永远”就是一直跑,直到你手动停止。
我在项目中遇到过一个问题:有同事把Ramp-Up设成0,结果1000个线程同时启动,直接把测试环境的数据库连接池打满了。嗯,这里要注意,Ramp-Up不是摆设,它是保护你测试环境的第一道防线。
我的经验: 做基准测试时,我通常先设10个线程跑一轮,看看响应时间。然后逐步增加线程数,比如50、100、200,直到发现吞吐量不再增长或错误率飙升。这个点,就是系统的“拐点”。
4.2 HTTP请求默认值——少写重复代码
你想想看,如果每个HTTP请求都要填一遍协议、域名、端口,那得多烦?HTTP请求默认值就是干这个的。你只要配一次,所有HTTP请求都会自动继承这些公共信息。
配置步骤:
- 在线程组上右键 → 添加 → 配置元件 → HTTP请求默认值
- 填写协议(http/https)、服务器名称或IP、端口号
- 如果有公共的路径前缀,比如/api/v1,也可以填在“路径”里
避坑指南: 我曾经犯过一个低级错误——在HTTP请求默认值里填了路径,又在具体的HTTP请求里也填了路径,结果JMeter把两个路径拼接在一起了,比如变成/api/v1/api/v1/users。记住,默认值里的路径和请求里的路径是拼接关系,不是覆盖关系。
4.3 监听器——看结果,别瞎猜
压测跑完了,怎么看结果?监听器就是你的“仪表盘”。我常用的就两个:聚合报告和图形结果。
4.3.1 聚合报告
这个是我最常用的,没有之一。它把压测数据汇总成一张表,一目了然。
| 指标 | 含义 | 我关注的阈值 |
|---|---|---|
| #Samples | 总请求数 | 至少跑几千个样本才有统计意义 |
| Average | 平均响应时间(ms) | 一般要求低于500ms |
| Median | 中位数响应时间 | 比平均值更能反映“大多数用户”的体验 |
| 90% Line | 90%的请求都在这个时间内完成 | 我通常看这个,比平均值靠谱 |
| Throughput | 吞吐量(每秒请求数) | 越高越好,但要看系统瓶颈 |
| Error % | 错误率 | 超过1%就要排查原因 |
我的习惯: 压测结束后,我会先把聚合报告保存为CSV文件。这样后续做对比分析、画趋势图都很方便。别只盯着屏幕看,数据要留档。
4.3.2 图形结果
图形结果说白了就是“可视化版”的聚合报告。它能画出响应时间随时间变化的曲线。我个人觉得它更适合做演示,给非技术人员看比较直观。但真要分析性能瓶颈,我还是更依赖聚合报告里的数字。
为什么会这样?因为图形结果的数据点太多,反而容易让人忽略关键信息。比如平均响应时间从100ms跳到500ms,在图形上可能只是一根小尖刺,但在聚合报告里,你能看到具体的百分比变化。
4.4 参数化——让压测更真实
如果所有虚拟用户都用同一个账号、同一个商品ID去压,那压出来的结果能代表真实场景吗?显然不能。参数化就是解决这个问题的。
常用的参数化方式:
- CSV数据文件配置: 从外部文件读取数据,比如用户名、密码、商品ID。我建议把测试数据准备成一个CSV文件,每行一组数据。
- 用户自定义变量: 适合少量固定值,比如测试环境的URL。
- 函数助手: 比如
${__Random(1,100)}可以生成1到100的随机数,适合模拟随机行为。
实战示例: 假设你要压测一个登录接口,用CSV参数化用户名和密码。
- 准备一个login_data.csv文件,内容如下:
username,password
user1,pass123
user2,pass456
user3,pass789
- 在线程组下添加“CSV数据文件配置”,设置文件名、变量名(比如username,password)
- 在HTTP请求的“参数”或“Body Data”中,用
${username}和${password}引用变量
避坑指南: 我曾经在CSV文件里忘了加表头,结果JMeter把第一行数据当成了变量名,导致所有请求都用了错误的数据。记住,CSV数据文件配置里有个“变量名称”字段,如果你在文件里写了表头,这里可以留空;如果没写表头,就必须在这里手动指定变量名。
参数化还有一个好处:它能帮你发现“数据热点”问题。比如所有用户都用同一个商品ID,数据库可能因为行锁而变慢,但换成不同ID后,性能可能就正常了。这种问题,不做参数化根本发现不了。
知识体系总览
下面这张图,是我自己梳理的本章知识结构。你可以把它当作一个“思维导图”,快速回顾核心内容。
好了,这一章的内容就这些。线程组、HTTP默认值、监听器、参数化,这四个东西是JMeter压测的“四件套”。你把这四个玩熟了,大部分接口压测场景都能搞定。记住,别贪多,先把基础打扎实。