4、Locust基础入门:安装Locust、编写第一个压测脚本、启动Web UI
好,咱们正式开始动手了。
这一章,我带你从零搭建Locust环境,写一个能跑起来的压测脚本,再启动那个漂亮的Web界面。说白了,就是让你先“玩起来”。
我个人习惯是,学一个新工具,先别管那么多理论,先让它跑通一个最简单的例子。有了体感,后面再深入细节就容易多了。
4.1 安装Locust
安装其实很简单。Locust是用Python写的,所以你得先有Python环境。我建议用Python 3.8以上版本,太老的版本可能会有兼容问题。
核心命令:
pip install locust
嗯,就这一行。但实际项目中,我强烈建议你用虚拟环境。为什么呢?
我曾经在一个老项目里直接全局安装,结果把项目依赖搞乱了,排查了半天。从那以后,我每个压测项目都单独建一个虚拟环境。
我的习惯做法:
# 创建虚拟环境
python -m venv locust_env
# 激活(Windows)
locust_env\Scripts\activate
# 激活(Mac/Linux)
source locust_env/bin/activate
# 安装Locust
pip install locust
装完之后,验证一下:
locust --version
如果看到版本号,比如 2.31.0,那就说明装好了。
4.2 编写第一个压测脚本
好,环境搞定了。接下来写脚本。
你想想看,一个最简单的压测脚本需要什么?无非就是:
- 定义一个用户行为(访问哪个接口)
- 设置一些基本参数(比如等待时间)
来看代码:
from locust import HttpUser, task, between
class WebsiteUser(HttpUser):
# 每个用户执行任务之间的等待时间(单位:秒)
wait_time = between(1, 5)
@task
def visit_homepage(self):
self.client.get("/")
这个脚本干了三件事:
- 定义用户类:
WebsiteUser继承HttpUser,代表一个虚拟用户。 - 设置等待时间:
between(1, 5)表示每个用户执行完一个任务后,会随机等待1到5秒再执行下一个。这模拟了真实用户的操作间隔。 - 定义任务:用
@task装饰器标记的方法,就是用户会执行的操作。这里我们只是简单地访问首页。
注意: self.client 是Locust内置的HTTP客户端,它已经帮你处理好了会话、请求统计等事情。你不需要自己用 requests 库。
保存这个文件,比如叫 locustfile.py。文件名无所谓,但默认情况下,Locust会找当前目录下叫 locustfile.py 的文件。
4.3 启动Web UI
脚本写好了,怎么跑起来?
Locust提供了两种模式:Web UI模式和命令行模式。咱们先玩Web UI,因为可视化,直观。
在终端里,切换到脚本所在目录,执行:
locust
如果一切正常,你会看到类似这样的输出:
[2024-01-15 10:30:00] Starting web interface at http://0.0.0.0:8089
[2024-01-15 10:30:00] Starting Locust 2.31.0
打开浏览器,访问 http://localhost:8089,就能看到Locust的Web界面了。
界面上会让你填几个参数:
- Number of users (峰值并发用户数):你想模拟多少个虚拟用户?
- Spawn rate (孵化速率):每秒增加多少个用户?比如填10,就是每秒增加10个用户,直到达到峰值。
- Host (目标主机):你要压测的网站地址。比如
http://example.com。
填好之后,点击“Start swarming”,压测就开始了。
一个小技巧: 刚开始调试时,我建议把用户数设小一点,比如10个用户,孵化速率设成1。这样你能清楚地看到用户数逐渐增加的过程,也方便观察Web界面上的实时数据。
4.4 理解Web UI的关键指标
压测跑起来之后,Web界面上会实时显示一堆数据。别慌,咱们只看几个核心的:
| 指标 | 含义 | 我的经验 |
|---|---|---|
| RPS (Requests per Second) | 每秒处理的请求数 | 这是最直观的吞吐量指标。我一般先看这个。 |
| Response Time (ms) | 响应时间,包括平均值、中位数、95分位、99分位 | 重点关注95分位和99分位。平均值容易被极端值拉偏。 |
| Failures | 失败请求数/率 | 如果失败率超过1%,我会立刻停止压测,排查问题。 |
| Users | 当前活跃用户数 | 看是否达到了你设定的峰值。 |
你想想看,这些数据其实就回答了三个问题:
- 系统能扛多少并发?(RPS)
- 响应快不快?(响应时间)
- 稳不稳定?(失败率)
4.5 本章知识体系
为了让你更清晰地理解这一章的内容结构,我画了一张图:
4.6 避坑指南
最后,分享几个我踩过的坑:
坑1:端口被占用
我曾经在启动Locust时,发现8089端口被别的程序占了。解决办法:指定其他端口。
locust --web-port 8090
坑2:找不到locustfile
如果你把脚本命名成别的名字,比如 my_test.py,启动时要指定:
locust -f my_test.py
坑3:目标地址写错
记得在Web界面上填对Host。我见过有人忘了加 http://,结果压测一直报错。嗯,这种低级错误我也犯过。
好了,这一章的内容就这些。你现在应该已经:
- 装好了Locust
- 写了一个能跑的压测脚本
- 启动了Web UI,看到了实时数据
接下来,你就可以拿着这个基础,去压测你自己的接口了。