如何让Locust虚拟用户依次遍历TS_IDs列表执行请求?
解决方案
原脚本的核心问题是全局预生成的values_new仅包含单个请求体(因原values列表只有一个元素),所有虚拟用户复用同一请求体,导致始终使用第一个TS_ID。要实现每个虚拟用户依次遍历TS_IDs,可按以下两种方案修改:
方案1:每个用户独立维护遍历进度
每个虚拟用户拥有专属的TS_ID迭代器,遍历完所有ID后可循环重置:
from locust import HttpUser, between, task import copy TS_IDs = [ '10158', '11016', '10479', '10482', '11045', '10311', '10159' ] # 基础请求体模板 values_template = { "id": 219468, "values": [ { "from": "2023-07-04T08:00:00.000Z", "to": "2023-07-04T09:00:00.000Z", "value": 33 } ] } class SaveValues(HttpUser): wait_time = between(1, 3) # 可根据测试需求调整任务间隔 def on_start(self): # 每个用户初始化时创建专属的TS_ID迭代器 self.ts_iter = iter(TS_IDs) def _run_write_ts(self, ts_id): # 每次请求深拷贝模板,替换为当前TS_ID req_body = copy.deepcopy(values_template) req_body["id"] = ts_id resp = self.client.put( '/api/SaveValues', json=req_body, headers={'X-API-KEY': 'AKjCg9hTcYQ=', 'Content-Type': 'application/json'} ) print(f"TS_ID: {ts_id}, 响应状态码: {resp.status_code}") @task(1) def test_save_ts_1(self): try: current_ts = next(self.ts_iter) except StopIteration: # 遍历完所有ID后重置迭代器,实现循环遍历 self.ts_iter = iter(TS_IDs) current_ts = next(self.ts_iter) self._run_write_ts(current_ts)
方案2:所有用户共享全局遍历顺序
如果需要让所有虚拟用户按统一顺序依次取用TS_ID(比如用户1用第一个ID,用户2用第二个ID),可使用全局循环迭代器:
from locust import HttpUser, between, task import copy from itertools import cycle TS_IDs = [ '10158', '11016', '10479', '10482', '11045', '10311', '10159' ] values_template = { "id": 219468, "values": [ { "from": "2023-07-04T08:00:00.000Z", "to": "2023-07-04T09:00:00.000Z", "value": 33 } ] } # 全局循环迭代器,所有用户共享遍历序列 global_ts_cycle = cycle(TS_IDs) class SaveValues(HttpUser): wait_time = between(1, 3) def _run_write_ts(self, ts_id): req_body = copy.deepcopy(values_template) req_body["id"] = ts_id resp = self.client.put( '/api/SaveValues', json=req_body, headers={'X-API-KEY': 'AKjCg9hTcYQ=', 'Content-Type': 'application/json'} ) print(f"TS_ID: {ts_id}, 响应状态码: {resp.status_code}") @task(1) def test_save_ts_1(self): current_ts = next(global_ts_cycle) self._run_write_ts(current_ts)
关键修改说明
- 模板复用:将原
values改为单个模板字典,避免全局预生成固定请求体,每次请求动态生成对应ID的请求体。 - 迭代器管理:
- 方案1适合模拟每个用户按自身顺序遍历ID的场景,每个用户独立维护遍历进度。
- 方案2适合所有用户按统一顺序依次使用ID的场景,通过全局迭代器保证顺序一致性。
- 深拷贝模板:每次请求都深拷贝模板,避免多个请求共享同一字典导致的ID覆盖问题。
内容的提问来源于stack exchange,提问作者Magnus Jensen
相关产品推荐
相关产品推荐

