如何在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
相关产品推荐
相关产品推荐

