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

求助:基于Locust实现可复用测试场景及全局命令行参数配置

Locust实现自定义命令行场景及全局参数配置方案

问题根源

你的代码有两个核心问题导致功能失效:

  • 全局事件未被注册:helpers/events.py里的命令行参数监听器没被执行,因为locustfile.py没有导入该模块,Locust启动时感知不到全局配置
  • 场景未真正激活:test_start事件里只是引用了场景类,没有将其实例化后赋值给environment.load_test_shape,导致场景配置无法生效

修正后的实现步骤

1. 让全局事件被Locust感知

修改tests/locustfile.py,导入全局事件模块,确保启动时触发命令行参数注册:

from locust import TaskSet, task, FastHttpUser
# 导入全局事件配置,必须加这行
import helpers.events

class FirstTest(TaskSet):
    @task
    def first_task(self):
        # 你的业务逻辑示例
        self.client.get("/")

class FirstTestUser(FastHttpUser):
    tasks = [FirstTest]

2. 修复场景激活逻辑

修改helpers/events.py,在测试启动时将选中的场景实例化并绑定到环境变量:

from locust import events
import helpers.scenarios as scenarios

@events.init_command_line_parser.add_listener
def _(parser):
    parser.add_argument(
        "--scenario", 
        type=str, 
        env_var="LOCUST_SCENARIO", 
        default="smoke",  # 设置默认场景
        choices=["smoke", "load"],  # 限制可选值,避免无效输入
        help="指定测试场景:smoke/load"
    )

@events.test_start.add_listener
def _(environment, **kw):
    scenario_name = environment.parsed_options.scenario.lower()
    # 实例化场景类并绑定到环境
    if scenario_name == "smoke":
        environment.load_test_shape = scenarios.Smoke()
        print("已激活Smoke测试场景")
    elif scenario_name == "load":
        environment.load_test_shape = scenarios.Load()
        print("已激活Load测试场景")

3. 保持scenarios.py不变

你写的Smoke和Load场景类逻辑是正确的,无需修改。

运行验证

用以下命令启动对应场景:

  • 运行Smoke场景:
locust --host=https://myhost.com -f tests/locustfile.py --scenario=smoke
  • 运行Load场景:
locust --host=https://myhost.com -f tests/locustfile.py --scenario=load

额外优化(可选)

可以在scenarios.py中添加场景映射字典,简化events.py的判断逻辑:

# 在helpers/scenarios.py末尾添加
SCENARIO_MAP = {
    "smoke": Smoke,
    "load": Load
}

然后修改events.py的测试启动事件:

@events.test_start.add_listener
def _(environment, **kw):
    scenario_name = environment.parsed_options.scenario.lower()
    scenario_class = scenarios.SCENARIO_MAP.get(scenario_name)
    if scenario_class:
        environment.load_test_shape = scenario_class()
        print(f"已激活{scenario_name.capitalize()}测试场景")
    else:
        print(f"未知场景:{scenario_name},将使用默认配置")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:31:25