
本文介绍在 Locust 性能测试脚本中,如何将 Python 列表(如 all_pp_ids)安全、规范地序列化为 JSON,并作为 data 参数传入 client.post() 请求,替代硬编码值,提升脚本灵活性与可维护性。
本文介绍在 locust 性能测试脚本中,如何将 python 列表(如 `all_pp_ids`)安全、规范地序列化为 json,并作为 `data` 参数传入 `client.post()` 请求,替代硬编码值,提升脚本灵活性与可维护性。
在 Locust 中编写负载测试脚本时,经常需要向后端接口批量提交动态数据(例如多个电厂 ID)。若直接拼接字符串构造 JSON(如 '{"powerPlantIds":[73808]}'),不仅难以维护,还容易因引号嵌套、特殊字符或类型转换引发错误。正确做法是使用标准 json 模块进行序列化,确保数据格式严格符合 JSON 规范且兼容 UTF-8。
以下是优化后的任务示例:
一款AI工具,主要用于生成可直接复制粘贴的 Bash 脚本,用于 Ralph Wiggum/AI 代理循环(Codex、Claude Code、OpenCode、Goose)。适用于“拉尔夫循环”“Ralph Wiggum 循环”或 AI 循环请求,依据 PROMPT.md、AGENTS.md、SPECS、IMPLEMENTATION_PLAN.md 进行计划/构建,包含计划与构建模式、背压、沙箱及完成条件,适合需要提升相关任务效率的用户。
import json
# 假设 all_pp_ids 已在类外或 setup 中定义(如:all_pp_ids = [73808, 73809, 73810])
# 注意:建议在 Locust User 类内部通过 on_start() 初始化,或作为实例属性管理,避免全局变量引发并发问题
@task(2)
def generate_bids_for_all_powerplants(self):
# 构建结构化 payload 字典
payload = {"powerPlantIds": all_pp_ids}
# 序列化为标准 JSON 字符串(自动处理转义、编码、空值等)
payload_json = json.dumps(payload)
# 发送请求:显式指定 Content-Type,data 使用序列化后的字符串
response = self.client.post(
'https://example.com/bids/generate',
headers={
"Authorization": f'Bearer {token}',
"Content-Type": "application/json"
},
data=payload_json,
name='/bids/generate'
)
# 调试建议:打印实际发送的 body(注意 response.request.body 是 bytes,需 decode)
print("Sent payload:", payload_json)
print("Response status:", response.status_code)
✅ 关键注意事项:
- ✅ 必须导入 json 模块:import json 缺失会导致 NameError;
- ✅ 避免手动字符串拼接:f'{{"powerPlantIds":{all_pp_ids}}}' 易出错(如列表含字符串、None 或中文时会破坏 JSON 结构);
- ✅ data= 接收字节或字符串:json.dumps() 返回 str,Locust 会自动编码为 UTF-8 bytes,无需额外 encode('utf-8');
- ⚠️ 并发安全提示:all_pp_ids 若为全局变量,在多用户(User 实例)并发执行时可能被意外修改。推荐将其设为 self.all_pp_ids(在 on_start() 中初始化),或作为只读常量定义在类顶层;
- ? 调试技巧:可通过 response.request.body.decode('utf-8') 确认实际发出内容,验证序列化是否符合预期。
通过这种方式,你的 Locust 脚本不仅能灵活适配不同规模的 ID 列表,还能保证请求体严格符合 RESTful 接口对 JSON 格式的要求,显著提升测试可靠性与工程规范性。










