当前位置: 首页 > news >正文

Locust入门及最佳实践

官方文档:https://docs.locust.io/en/stable/

基础demo

from locust import HttpUser, taskclass HelloWorldUser(HttpUser):@taskdef hello_world(self):self.client.get("/hello")self.client.get("/world")

最佳实践

  • 断言:
    在 Locust 中,默认情况下,如果 HTTP 响应状态码是 2xx,请求会被标记为成功;否则会被标记为失败

  • SequentialTaskSet和TaskSet的区别:
    TaskSet 是 Locust 的一个基本类,用于定义用户行为。
    SequentialTaskSet 是 TaskSet 的子类,它会按照任务定义的顺序依次执行任务,每个任务执行完后才会执行下一个任务。

  • task:
    方法上添加 @task 装饰器来定义用户任务。

  • 定义负载形状:

    1. LoadTestShape自动化控制(使用该方式将无法通过WebUI手动控制)
      用于定义负载形状,即用户数量和请求频率的变化规律。可以通过继承 LoadTestShape 类并重写 tick 方法来自定义负载形状。
      tick 方法会在每个时间间隔内被调用,返回一个元组 (users, spawn_rate),表示当前的用户数量和每秒启动用户数。
    2. 使用 WebUI 手动调整
      在压测过程中,随时点击右上角的 "+" 或 "-" 按钮 增加 / 减少用户数。
  • HttpUser:
    用于定义 HTTP 用户类.每个 HttpUser 实例代表一个用户,它会执行定义的任务。

    1. host: 指定请求的基础URL
    2. wait_time: 指定用户任务之间的等待时间
    3. between: 指定用户任务之间的等待时间
    4. tasks: 指定用户的任务列表
  • name:
    对接口请求进行分组,接口参数可能是动态的,在用户统计信息中将这些 URL 组合在一起才有意义。

  • 钩子函数:

    1. on_test_start: 测试开始时执行的函数
    2. on_test_stop: 测试结束时执行的函数
from locust import HttpUser, task, between, LoadTestShape, SequentialTaskSet, constant_throughput, events@events.test_start.add_listener
def on_test_start(environment, **kwargs):"""测试开始时执行的函数,"""print("测试开始")class UserBehavior(SequentialTaskSet):"""用户行为"""token = Nonedef on_start(self):"""每个用户启动时执行的函数"""print("用户启动")@taskdef login(self):"""登录"""with self.client.post("/login", name="登录", catch_response=True) as response:if response.status_code == 200:self.token = response.json().get("token")response.success()else:response.failure("status_code非200:" + response.text)@task(3)def create_product(self):"""创建商品"""if not self.token:return  # 如果没有token,不执行创建商品任务body = {"productName": "测试商品",}headers = {"Authorization": f"Bearer {self.token}"}with self.client.post(url="/create_product", name="创建商品", json=body,headers=headers,catch_response=True) as response:if response.status_code == 200:response.success()else:response.failure("status_code非200:" + response.text)@taskdef logout(self):"""退出登录"""if not self.token:return  # 如果没有token,不执行退出登录任务with self.client.post("/logout", name="退出登录", catch_response=True) as response:if response.status_code == 200:self.token = None  # 登出后清空tokenresponse.success()else:response.failure("status_code非200:" + response.text)class TimeLimitLoadShape(LoadTestShape):"""10分钟后自动退出的负载形状"""def tick(self):# 获取当前压测运行时间(秒)run_time = self.get_run_time()# 10分钟 = 600秒,超过则退出if run_time > 600:return None  # 返回None表示终止测试# 压测期间保持100用户(可根据需求调整用户数和增长策略)return (100, 10)  # (目标用户数, 每秒启动用户数)class LiveAuctionUser(HttpUser):tasks = [UserBehavior]wait_time = constant_throughput(2)  # 每个用户每秒最多执行2次循环

image

负载压测实践

class StepLoadShape(LoadTestShape):"""阶梯压测形状:- 每 step_duration 秒增加 step_users 个用户- 直到达到 max_users 为止"""step_time = 10  # 每个阶梯持续时间(秒)step_users = 10  # 每个阶梯增加的用户数spawn_rate = 10  # 每秒启动的用户数max_users = 100  # 最大用户数def tick(self):# 计算当前所处的阶梯数run_time = self.get_run_time()current_step = int(run_time / self.step_time) + 1# 计算当前应有的用户数users = current_step * self.step_users# 检查是否达到最大用户数if users > self.max_users:return None  # 停止压测return (users, self.spawn_rate)

image

class StagedLoadShape(LoadTestShape):"""分阶段阶梯压测:1. 预热阶段2. 稳定阶段3. 加压阶段4. 收尾阶段"""stages = [{"duration": 10, "users": 50, "spawn_rate": 10},  # 预热阶段{"duration": 20, "users": 50, "spawn_rate": 10},  # 稳定阶段{"duration": 30, "users": 100, "spawn_rate": 10},  # 加压阶段1{"duration": 40, "users": 150, "spawn_rate": 10},  # 加压阶段2{"duration": 45, "users": 100, "spawn_rate": 20},  # 减压阶段1{"duration": 50, "users": 50, "spawn_rate": 20},  # 减压阶段2{"duration": 55, "users": 0, "spawn_rate": 20},  # 减压阶段3]def tick(self):run_time = self.get_run_time()# 查找当前所处的阶段for stage in self.stages:if run_time < stage["duration"]:tick_data = (stage["users"], stage["spawn_rate"])return tick_data# 所有阶段完成后停止return None

image

高阶使用

  1. 分布式测试
  2. 数据参数化
  3. TaskSet嵌套
http://www.sczhlp.com/news/271.html

相关文章:

  • Gitee Git自建平台:企业级代码托管的安全之选
  • Java核心面试技术
  • 人力资源各系统的关联与一体化趋势:从独立到协同的必然之路
  • 评估Gitee作为DevOps平台:功能详解与适用性分析
  • business
  • 4、如何给一万张图片重命名
  • 基于FFmpeg开发的在线m3u8转MP4在线工具(开发步骤+类库)
  • 米牛图片搬运去重大师手机版使用教程
  • debian12 修改源为阿里
  • 分享一个 AI 自动生成流程图的工具
  • Charles抓包iPhone踩坑(自用)
  • 16Java基础之枚举、泛型、API、Objects类、包装类
  • 卷积神经网络的验证码识别系统设计与实现
  • Git 提交信息(Commit Message)前缀规范
  • Visual Studio中的常用调试功能(二)
  • 易基因突破创新 自主研发DNA甲基化年龄预测算法及系统获发明专利授权
  • 从独立工具到协作中枢:Bug管理系统的进化革命
  • Redis的引入与配置
  • 给删除增加删除感
  • 卷积神经网络的验证码识别系统设计
  • scrollTop
  • 阿里云OSS 的Content-Disposition不生效 导致浏览器强制下载而不是预览行为
  • 测试
  • AI测试开发私教服务全新升级
  • 10分钟无痛部署!字节Coze开源版喂饭教程
  • 28 位运算
  • Prime Video如何将时间序列异常转化为可操作警报
  • 抗原设计与合成服务|定制抗原技术|高效多肽合成
  • 中日甲午海战军舰情况
  • 面试算法练习-更新ing