Locust性能测试:编写Locustfile的完整指南
locust Write scalable load tests in plain Python 🚗💨 项目地址: https://gitcode.com/gh_mirrors/lo/locust
什么是Locustfile
Locustfile是Locust性能测试工具的核心脚本文件,它定义了模拟用户的行为模式。这个文件本质上是一个Python模块,可以包含常规Python代码和Locust特有的类与方法。通过编写Locustfile,我们可以精确控制性能测试的各个方面。
基本结构示例
让我们从一个完整的示例开始,逐步解析Locustfile的各个组成部分:
import time
from locust import HttpUser, task, between
class QuickstartUser(HttpUser):
wait_time = between(1, 5) # 用户执行任务后等待1-5秒
@task
def hello_world(self):
self.client.get("/hello")
self.client.get("/world")
@task(3) # 这个任务的执行权重是3
def view_items(self):
for item_id in range(10):
self.client.get(f"/item?id={item_id}", name="/item")
time.sleep(1)
def on_start(self):
self.client.post("/login", json={"username":"foo", "password":"bar"})
核心组件详解
1. 用户类(User Class)
用户类是Locustfile的核心,它定义了模拟用户的行为模式。每个模拟用户都会创建一个该类的实例。
class QuickstartUser(HttpUser):
- 必须继承自
User
类或其子类(如HttpUser
) HttpUser
提供了HTTP客户端功能,适合测试Web服务- 每个用户在自己的greenlet(轻量级线程)中运行
2. 等待时间(wait_time)
控制用户执行任务后的等待时间:
wait_time = between(1, 5) # 1-5秒随机等待
常用等待时间策略:
constant(3)
- 固定3秒between(0.5, 10)
- 0.5到10秒随机constant_throughput(0.1)
- 自适应确保每秒最多0.1次任务constant_pacing(10)
- 自适应确保每10秒最多1次任务
3. 任务(Tasks)
任务是用户执行的具体操作,使用@task
装饰器定义:
@task
def hello_world(self):
self.client.get("/hello")
self.client.get("/world")
任务权重控制:
@task(3) # 权重为3,执行概率更高
def view_items(self):
pass
4. 初始化和清理
def on_start(self):
"""用户启动时执行"""
self.client.post("/login", ...)
def on_stop(self):
"""用户停止时执行"""
pass
HTTP客户端使用
HttpUser
提供了client
属性,它是HttpSession
的实例,基于requests.Session
:
# GET请求
response = self.client.get("/path")
# POST请求
response = self.client.post("/login",
json={"username":"test", "password":"secret"})
# 带参数的请求
self.client.get("/search", params={"q": "locust"})
# 命名请求(用于统计分组)
self.client.get("/item?id=123", name="/item")
高级特性
1. 多用户类混合测试
class WebUser(User):
weight = 3 # 3倍于MobileUser
# ...
class MobileUser(User):
weight = 1
# ...
class AdminUser(User):
fixed_count = 1 # 固定1个管理员用户
# ...
2. 任务标签
@tag('search')
@task
def search_task(self):
pass
可通过--tags
和--exclude-tags
参数控制执行哪些任务。
3. 事件钩子
from locust import events
@events.test_start.add_listener
def on_test_start(environment, **kwargs):
print("测试开始")
@events.init.add_listener
def on_locust_init(environment, **kwargs):
if environment.runner:
print("初始化完成")
最佳实践
- 请求命名:使用
name
参数对相似请求进行分组统计 - 等待时间:合理设置
wait_time
模拟真实用户行为 - 任务权重:根据业务场景分配合理的任务权重
- 资源清理:在
on_stop
中释放测试占用的资源 - 模块化:将复杂测试逻辑拆分为多个方法和类
常见问题
- 统计分组混乱:忘记为动态URL设置
name
参数 - 等待时间不当:未设置
wait_time
导致压力过大 - Cookie处理:
HttpSession
会自动处理cookie,无需手动管理 - HTML渲染:Locust不会渲染HTML页面,仅记录HTTP请求
通过掌握这些概念和技巧,您可以编写出高效、可维护的Locust性能测试脚本,准确模拟各种用户行为模式。
locust Write scalable load tests in plain Python 🚗💨 项目地址: https://gitcode.com/gh_mirrors/lo/locust
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考