当你开发完API接口后,总会担心高并发下的表现是否稳定,有没有隐藏的瓶颈,这时候性能测试就是最直接的验证方式,Locust是一款轻量又好用的工具,适合给各种API做压测,接下来就从准备到实操,一步步讲清楚怎么用它完成测试。
一、Locust性能测试前期准备
1.1 选Locust的原因
不用记复杂的专业术语,简单说就是:它能模拟成千上万的虚拟用户同时访问你的接口,而且用着很省心——不需要折腾太复杂的配置,自带可视化页面,还能写出和真实用户行为接近的测试脚本,不管是新手还是有经验的开发者,都能快速上手。
1.2 环境搭建
Locust本身是基于Python开发的,所以只要有Python环境,一行命令就能装完,完全不用额外配置其他东西:
# 使用pip安装Locust,国内用户可以加镜像源加快速度,命令为:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple locust
pip install locust
安装完成后,你可以在终端输locust -v,如果输出版本号,就说明环境搭建成功了。
二、Locust核心测试脚本编写
所有测试脚本都用Python写,单一技术栈,结构清晰,带详细注释,新手也能看懂。
2.1 第一个基础测试脚本
我们拿公开的测试接口举例,不用自己搭后端,直接测现成的接口,脚本结构非常简洁,适合新手入门:
# 技术栈:Python + Locust
from locust import HttpUser, task, between
# 定义虚拟用户类,每个类的实例代表一个模拟的用户,所有任务都在这个类里写
class SimpleApiTest(HttpUser):
# 每个虚拟用户调用接口前,会随机等待1-3秒,模拟真实用户的操作间隔,避免压测太突兀
wait_time = between(1, 3)
# 标记这是一个要执行的测试任务,默认权重是1,用户会按权重比例执行任务
@task
def get_user_info(self):
# 调用GET请求,地址是公开的测试接口,不需要自己造数据,直接用就好
response = self.client.get("/users/1")
# 加断言:如果接口返回的状态码不是200,就抛出错误,确保测试的接口是正常的
assert response.status_code == 200, "获取用户信息失败,接口状态异常"
# 可选:打印日志方便调试,生产测试可以删掉这行,避免输出太多冗余信息
print("成功获取用户信息,状态码:", response.status_code)
这个脚本就是模拟用户点击“查看个人信息”按钮,调用接口的场景,最基础的压测需求就能满足。
2.2 带业务逻辑的进阶脚本
如果要测需要提交数据的POST接口,比如用户注册、提交订单,只要调整下请求的格式就行,还可以加随机数据避免重复提交,更贴近真实业务:
# 技术栈:Python + Locust
from locust import HttpUser, task, between
import random
class AdvancedApiTest(HttpUser):
# 注册操作比较耗时,所以等待时间设为2-5秒,更符合真实用户的操作节奏
wait_time = between(2, 5)
# 任务权重设为2,意味着这个任务的执行次数是默认任务的2倍,相当于把注册操作设为高频任务
@task(2)
def register_new_user(self):
# 随机生成用户名,避免重复提交,不然接口可能会拦截重复用户
username = f"test_user_{random.randint(1, 10000)}"
# 构造POST请求需要提交的数据,用JSON格式,符合现代接口的主流要求
payload = {
"username": username,
"password": "123456",
"email": f"{username}@example.com"
}
# 调用POST请求,Locust会自动处理JSON格式的请求头,不需要手动指定
response = self.client.post(
"/users",
json=payload
)
# 断言注册成功,一般这类操作的成功状态码是201,不同接口可能不一样,按实际情况调整
assert response.status_code == 201, f"用户{username}注册失败,状态码异常"
print(f"用户{username}注册成功,状态码:{response.status_code}")
这个脚本模拟了真实的用户注册流程,有随机数据,有权重设置,测试结果会更有参考性。
三、Locust运行与结果分析
3.1 启动测试的命令
脚本写好后,只要一行命令就能启动,Locust会在本地的8089端口启动一个Web界面,用来设置测试参数和看实时结果:
# 启动Locust,指定你的测试脚本文件,这里假设脚本名叫test_api.py
locust -f test_api.py
启动后打开浏览器,输入http://localhost:8089,会看到一个简单的设置页面,需要填两个参数:第一个是“Number of users to simulate”(要模拟的并发用户数),比如填100,就是同时有100个虚拟用户;第二个是“Hatch rate (users per second)”(每秒启动的用户数),比如填10,就是每秒增加10个用户,慢慢加压,避免一开始就压崩接口。填完后点“Start swarming”就开始测试了。
3.2 测试结果解读
测试过程中,Web页面会实时显示数据,不用记复杂的指标,看几个关键的就行:
- 总请求数(Requests):所有虚拟用户总共发起的请求数量;
- 成功率(Failure Rate):失败请求的比例,如果超过1%就要注意,可能接口有问题;
- 响应时间(Response Time):平均响应时间是所有请求的平均耗时,95分位响应时间更重要——意思是95%的请求都在这个时间内完成,比如平均时间是100毫秒,但95分位是500毫秒,说明有5%的请求很慢,是潜在的瓶颈; 如果测试时突然出现响应时间飙升、失败数增加,说明接口扛不住当前的压力,需要回去优化接口逻辑或者服务器配置。
四、Locust的应用场景、技术优缺点与注意事项
4.1 常见应用场景
Locust适合测各种需要高并发的API接口,比如:电商平台的下单、秒杀接口,测能不能扛住双11的高峰;后台管理系统的查询接口,看并发下会不会卡顿;游戏服务器的登录接口,测同时在线玩家的承载量;第三方API对接的稳定性,测对方接口的承受能力。
4.2 技术优缺点
优点:一是用Python写脚本,逻辑简单,比JMeter这类压测工具容易上手,不用记复杂的元件;二是自带Web可视化界面,实时看结果,不用查日志;三是支持分布式压测,多台机器一起模拟高并发,适合大流量场景;缺点:一是对复杂的网络模拟(比如模拟丢包、延迟)支持不够,需要额外工具配合;二是大规模压测时,自身机器的资源会被占用,不能用太老的电脑;三是纯小白要花点时间熟悉Python的基础语法,才能写出复杂的脚本。
4.3 实操注意事项
第一,测试环境要尽量贴近生产环境,别用本地电脑测线上接口,不然结果不准;第二,绝对不能把压测请求发到生产环境,除非经过团队同意,不然会影响真实用户;第三,加断言是必须的,不然测试过程中接口出错你根本发现不了;第四,别一开始就设太高的并发数,慢慢加压,能更快找到问题;第五,测试完成后要清理测试数据,比如注册的测试用户,别留在环境里。
五、文章总结
Locust是一款非常实用的API性能测试工具,用Python写脚本,模拟真实用户的操作行为,通过可视化页面能快速查看测试结果,不管是新手还是有经验的开发者都能快速掌握。从环境搭建到脚本编写,再到结果分析,整个流程都很顺畅,适合用来提前发现API的性能瓶颈,避免上线后出现崩溃、响应慢等问题,保障接口的稳定性。
评论
围绕“如何使用Locust进行API接口的性能测试”参与讨论