Locust如何提取响应值并应用于后续请求的JSON payload
Locust 响应JSON值提取及独立文件Payload复用操作指南
Locust没有内置类似Gatling的saveAs方法,但其单用户实例自带属性存储能力,和Gatling的session机制效果完全一致,可实现跨请求的变量共享,具体操作步骤如下:
步骤1:从响应提取JSON值存入用户上下文
发送请求拿到响应后,直接调用.json()方法解析JSON结构,将需要复用的值绑定到当前用户实例self上即可,后续所有该用户发起的请求都可以直接读取这些值:
# 示例:登录接口响应提取token和user_id login_resp = self.client.post("/api/login", json={"username": "test", "password": "123456"}) login_json = login_resp.json() # 绑定到self,等价于Gatling的saveAs存入session self.token = login_json["data"]["access_token"] self.user_id = login_json["data"]["user_info"]["id"]
步骤2:处理独立文件存储的JSON Payload
对于存放在独立文件中的请求体,推荐提前预加载为基础字典模板,使用时复制模板再替换动态字段,避免JSON格式错误,操作如下:
2.1 准备独立Payload文件
示例目录结构:
locustfile.py payloads/ └── create_order.json
create_order.json内容(固定字段直接写死,动态字段留空即可):
{ "order_title": "测试订单", "amount": 100, "create_user_id": "", "request_id": "" }
2.2 预加载Payload模板
在locustfile的全局位置预加载所有Payload文件,避免每次请求重复读磁盘:
import json # 预加载独立Payload为字典模板 with open("payloads/create_order.json", "r", encoding="utf-8") as f: CREATE_ORDER_TPL = json.load(f)
2.3 动态替换字段发起请求
在任务方法中复制模板,替换之前存在用户上下文的动态值后即可发起请求:
@task def create_order(self): # 复制模板,避免修改全局模板影响其他用户 payload = CREATE_ORDER_TPL.copy() # 替换动态字段,支持嵌套字典层级赋值 payload["create_user_id"] = self.user_id payload["request_id"] = self.token # 发送请求 self.client.post( "/api/order/create", json=payload, headers={"Authorization": f"Bearer {self.token}"} )
注意事项
- 如果Payload嵌套层级很深,直接按字典层级赋值即可,例如
payload["ext_info"]["operator"] = self.user_id - 每次使用模板前必须调用
copy(),否则所有用户会共用同一个字典对象,会出现变量串改的问题 - 若需要更复杂的模板逻辑(循环、条件判断等),可引入jinja2模板引擎处理独立Payload文件,实现更灵活的动态生成
内容的提问来源于stack exchange,提问作者Hoang
相关产品推荐
相关产品推荐

