You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在pytest中运行Locust?pytest未收集Locust测试用例问题求解

问题根因

你当前编写的是标准Locust压测脚本定义,没有符合pytest测试用例命名规则的结构,自然无法被pytest识别。pytest默认的用例收集规则如下:

  • 测试文件需命名为test_*.py或*_test.py
  • 测试函数需以test_开头命名
  • 测试类需以Test开头命名,且不能有__init__方法,类内测试方法需以test_开头命名
正确结合方案

根据使用场景不同,有两种常见的Locust与pytest结合方式:

场景1:用pytest驱动执行Locust压测任务

这种方式适合需要在pytest流程中完成压测、结果校验的场景,你需要调用Locust的运行时API,新增符合pytest规则的测试用例,示例修改后的代码如下(文件重命名为test_locust.py):

import gevent
from locust import HttpUser, TaskSet, task
from locust.stats import stats_printer, stats_history

# 原有Locust任务定义保留,修正两处原代码错误
class WebsiteTasks(TaskSet):
    def on_start(self):
        self.index()

    @task(2)
    def index(self):
        self.client.get("/")

    @task(1)
    def about(self):
        self.client.get("/page/about")


class WebsiteUser(HttpUser):
    # 原代码错误1:应为复数tasks,值为任务类列表
    tasks = [WebsiteTasks]
    # 原代码错误2:host需要带http/https协议头
    host = "http://localhost:5000"
    min_wait = 1000
    max_wait = 5000

# 新增pytest测试用例
def test_locust_performance():
    # 初始化Locust运行环境
    env = WebsiteUser.environment
    # 启动统计打印协程
    gevent.spawn(stats_printer(env.stats))
    gevent.spawn(stats_history, env.runner)
    # 配置压测参数:10个并发用户,每秒生成1个用户,运行10秒
    env.runner.start(user_count=10, spawn_rate=1)
    gevent.spawn_later(10, lambda: env.runner.quit())
    # 等待压测结束
    env.runner.greenlet.join()
    # 自定义压测结果断言,可按需调整
    assert env.stats.total.fail_ratio < 0.01, f"压测失败率过高:{env.stats.total.fail_ratio*100}%"
    assert env.stats.total.avg_response_time < 500, f"平均响应时间过长:{env.stats.total.avg_response_time}ms"

修改完成后执行pytest test_locust.py -v即可正常收集到测试用例,跑完后会返回压测结果和断言校验状态。

场景2:用pytest做Locust任务逻辑单元测试

如果不需要运行完整压测,只需要验证你编写的任务逻辑正确性,可以单独拆分测试用例,模拟上下文调用任务验证,示例代码如下:

from unittest.mock import Mock
# 从你原有的locust_test.py中导入任务类
from locust_test import WebsiteTasks

def test_about_page_task():
    # 模拟用户实例和请求客户端
    mock_user = Mock()
    mock_user.client.get = Mock()
    # 初始化任务类
    tasks = WebsiteTasks(mock_user)
    # 调用任务方法
    tasks.about()
    # 验证请求是否符合预期
    mock_user.client.get.assert_called_once_with("/page/about")
注意事项
  • 如果需要保留原有脚本单独通过locust命令运行的能力,只需把pytest测试用例拆分到独立的test_*.py文件中导入原有Locust定义即可。
  • 压测前请确认目标服务http://localhost:5000正常运行,否则会出现请求失败的情况。

内容的提问来源于stack exchange,提问作者user16133873

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 22:54:03