使用Locust进行多链路压测(附完整代码)

先看效果!!!目前跑通的是多链路压测(应该是),我一开始跑通了jmeter的压测,但是jmeter多链路我感觉有点费劲,然后就直接用python写脚本,发现操作起来更简单,还有locust的图形界面。

特性多链路压测
接口数量多个关联API组合
测试目的验证业务流程整体性能
典型场景登录 → 发送消息 → 获取历史记录(必须先登录获取token才能进行后续操作)
复杂度高(需处理参数传递/依赖关系)
测试是否符合✅ 符合(覆盖了典型用户从登录到聊天的完整路径)

1. 背景

在实际项目中,我们需要对聊天接口进行压力测试,验证其在高并发下的稳定性。本文使用Python的Locust框架,模拟用户登录、发送问题和获取历史记录的全流程压测。

2. 核心代码解析

(1)环境准备

from gevent import monkey
monkey.patch_all()  # 让Locust支持高并发
import requests
from locust import HttpUser, task, between
import pandas as pd
import uuid
import random
import json
import time

(2)用户行为模拟

class ChatUser(HttpUser):
    wait_time = between(1, 2)  # 用户操作间隔1-2秒
    host = "https://your-api-endpoint.com"  # 替换为你的API地址

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.token = None  # 用户登录token
        self.user_id = None  # 用户ID
        self.phone_base = 10000000000  # 模拟手机号
        self.questions = self.load_questions()  # 加载测试问题
        self.session = requests.Session()  # 复用Session

(3)核心任务

① 用户登录

@task(1)  # 权重1(登录频率较低)
def login(self):
    phone = str(self.phone_base + random.randint(1, 10000))  # 随机生成手机号
    payload = {"phone": phone, "code": ""}  # 替换为你的登录参数
    with self.client.post("login", json=payload, name="用户登录") as response:
        if response.status_code == 200:
            self.token = response.json()["data"]["token"]  # 存储token
            print("用户登录成功!")
② 发送问题 + 获取历史记录
@task(3)  # 权重3(主要测试聊天接口)
def chat_operation(self):
    if not self.token:
        self.login()  # 未登录则先登录
    
    # 1. 发送问题(SSE流式响应)
    question = random.choice(self.questions)
    headers = {"Authorization": f"Bearer {self.token}"}
    payload = {"uid": str(u.d4()), "message": }
    
    with self.client.post("/chat/send", json=payload, headers=headers, name="发送问题") as send_response:
        if send_response.status_code == 200 and "data:" in send_response.text:
            print("问题发送成功!")
        else:
            send_response.failure("发送失败")

    # 2. 获取历史记录
    with self.client.get("/chat/history", headers=headers, name="获取对话历史") as history_response:
        if history_response.status_code == 200:
            print("历史记录获取成功!")

3. 如何运行?

locust -f chat_test.py --headless -u 50 -r 5 -t 5m --only-summary
  • -u 50:模拟50个并发用户

  • -r 5:每秒启动5个用户

  • -t 5m:持续运行5分钟

  • --only-summary:仅显示最终统计结果

 4.关键优化点

  1. SSE流式响应处理:聊天接口可能采用Server-Sent Events(SSE),需检查data:格式。

  2. 动态会话ID:每次聊天使用uuid.uuid4()生成唯一会话ID,避免冲突。

  3. 问题池随机选择:可自定义问题列表,模拟真实用户行为

5. 总结

  • Locust适合模拟高并发聊天场景。

  • 动态参数(如手机号、会话ID)能有效避免重复请求。

  • 完整代码已适配通用场景,替换API地址即可使用。

6.压测前准备

1.环境隔离

  • ✅ 使用独立测试环境(避免影响生产)

  • ✅ 数据库使用测试库或影子库(Shadow DB)

  • ✅ 关闭非必要后台服务(日志收集、监控上报等

2.数据准备

  • 📊 参数化测试数据(避免重复数据干扰)

3.安全红线

  • 🚫 严禁直接压测生产环境(除非有熔断保护)

  • 🔐 测试账号使用虚拟数据(避免真实用户受影响)

  • ⚠️ 避免长时间持续压测(通常单次不超过30分钟

总结,我只是简单跑了10个并发,跑通脚本和验证低并发的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值