如何在Locust测试启动前通过Web UI获取参数?
在Locust中实现测试启动前Web UI参数输入功能
要实现测试启动前通过Web UI收集参数的需求,你可以利用Locust基于Flask的Web框架扩展能力,添加自定义配置页面并将参数传递到测试脚本中。以下是具体实现步骤:
1. 核心实现思路
- 通过Locust的
@events.init.add_listener钩子,在服务启动时注册自定义Flask路由,提供参数输入表单 - 将用户提交的参数存储到Locust的
environment.user_data中(支持分布式场景下Worker节点共享) - 在测试脚本中直接读取存储的参数,动态配置测试行为
2. 完整代码示例
from locust import HttpUser, task, events from flask import request, render_template_string # 注册初始化事件,添加自定义配置页面 @events.init.add_listener def on_locust_init(environment, **kwargs): # 初始化参数存储容器 environment.user_data["test_params"] = {} # 定义配置页面路由 @environment.web_ui.app.route("/config", methods=["GET", "POST"]) def config_page(): params = environment.user_data["test_params"] if request.method == "POST": # 读取表单提交的参数并保存 params["target_host"] = request.form.get("target_host") params["max_users"] = int(request.form.get("max_users", 20)) params["spawn_per_sec"] = int(request.form.get("spawn_per_sec", 2)) params["api_path"] = request.form.get("api_path", "/api/v1/resource") # 提交后跳转回Locust主控制台 return environment.web_ui.app.redirect("/") # 渲染参数输入表单(支持回显已配置值) return render_template_string(""" <html> <head> <style> .form-container { max-width: 500px; margin: 2rem auto; padding: 0 1rem; } .form-group { margin-bottom: 1rem; } label { display: block; margin-bottom: 0.5rem; } input { width: 100%; padding: 0.5rem; box-sizing: border-box; } button { padding: 0.5rem 1.5rem; background: #007bff; color: white; border: none; border-radius: 4px; } </style> </head> <body> <div class="form-container"> <h2>测试参数配置</h2> <form method="post"> <div class="form-group"> <label>目标服务地址 (Host):</label> <input type="text" name="target_host" value="{{ params.get('target_host', '') }}" required placeholder="https://your-service.com"> </div> <div class="form-group"> <label>最大并发用户数:</label> <input type="number" name="max_users" value="{{ params.get('max_users', 20) }}" min="1"> </div> <div class="form-group"> <label>每秒生成用户数:</label> <input type="number" name="spawn_per_sec" value="{{ params.get('spawn_per_sec', 2) }}" min="1"> </div> <div class="form-group"> <label>测试API路径:</label> <input type="text" name="api_path" value="{{ params.get('api_path', '/api/v1/resource') }}"> </div> <button type="submit">保存配置并返回控制台</button> </form> </div> </body> </html> """, params=params) # 测试用户类,使用配置的参数 class PerformanceTestUser(HttpUser): def on_start(self): # 从全局存储中读取参数,动态设置Host test_params = self.environment.user_data.get("test_params", {}) if test_params.get("target_host"): self.host = test_params["target_host"] @task def test_target_api(self): test_params = self.environment.user_data.get("test_params", {}) api_path = test_params.get("api_path", "/") self.client.get(api_path, name="Target API Request")
3. 使用说明
- 启动Locust服务:运行
locust -f your_script.py - 访问参数配置页面:打开浏览器进入
http://localhost:8089/config,填写所需参数后提交 - 启动测试:返回Locust主控制台(
http://localhost:8089),可以直接使用配置的max_users和spawn_per_sec(或手动调整),测试脚本会自动应用配置的target_host和api_path
4. 分布式场景适配
如果使用Locust分布式集群,environment.user_data会自动通过主节点同步到所有Worker节点,无需额外配置即可实现参数共享。
内容的提问来源于stack exchange,提问作者Ilia
相关产品推荐
相关产品推荐

