如何为可配置API列表动态创建Locust任务并绑定到HTTPUser/TaskSet
问题解答
完全可以实现,Locust的tasks属性本身支持动态赋值,你可以基于可配置的API地址列表,在测试启动前批量生成对应请求任务,再挂载到HTTPUser或TaskSet上使用。
实现核心逻辑
- 遍历API地址列表,为每个接口生成独立的请求任务函数,注意要解决闭包的变量捕获问题,避免所有任务都调用最后一个遍历到的接口地址
- 将生成的所有任务函数存入列表,直接赋值给
HTTPUser或TaskSet的tasks属性即可
完整代码示例
from locust import HttpUser, task, between # 可配置的API地址列表,支持动态传入修改 API_URLS = [ "/api/v2/product", "/api/v2/order", "/api/v2/cart", "/api/v2/users", ] def generate_tasks(url_list): task_list = [] for url in url_list: # 用默认参数绑定当前循环的url值,解决闭包变量共享问题 def api_task(self, target_url=url): self.client.get(target_url, name=target_url) # 可通过修改task装饰器参数调整单个接口的调用权重 wrapped_task = task(1)(api_task) task_list.append(wrapped_task) return task_list class APIUser(HttpUser): wait_time = between(1, 3) # 直接将动态生成的任务列表赋值给tasks属性 tasks = generate_tasks(API_URLS) # 替换为你测试服务的基础域名 host = "https://your-test-domain.com"
进阶调整说明
- 如果需要给不同接口设置不同的调用权重,可以把
API_URLS调整为包含url和权重的元组列表,比如[("/api/v2/product", 3), ("/api/v2/order", 2)],生成任务时把权重值传入task()装饰器即可 - 如果使用
TaskSet管理任务,逻辑完全一致,把生成的任务列表赋值给TaskSet子类的tasks属性即可 - 除了GET请求,你也可以根据接口需求调整生成POST/PUT等其他请求类型的任务函数
内容的提问来源于stack exchange,提问作者Sam Alex
相关产品推荐
相关产品推荐

