1、初始化监听方法
- 如果是worker监听test_users、worker_info方法
- 如果是master监听acknowledge_users方法
@events.init.add_listener
def on_locust_init_testdata(environment, **_kwargs):
if not isinstance(environment.runner, MasterRunner):
environment.runner.register_message("test_users", setup_test_users)
environment.runner.register_message("worker_info", setup_worker_info)
if not isinstance(environment.runner, WorkerRunner):
environment.runner.register_message("acknowledge_users", on_acknowledge)
2、测试开始时分发测试数据
@events.test_start.add_listener
def on_test_start(environment, **_kwargs):
if isinstance(environment.runner, WorkerRunner):
return
res = read_text_line("pro", "pro_stu")
users = [{"name": res[i]} for i in range(len(res))]
worker_count = environment.runner.worker_count
chunk_size = int(len(users) / worker_count)
for i, worker in enumerate(environment.runner.clients):
start_index = i * chunk_size
end_index = start_index + chunk_size if i + 1 < worker_count else len(users)
data = users[start_index:end_index]
index_info = {"worker": worker, "用户数量": len(data), "start": start_index, "end": end_index}
environment.runner.send_message("test_users", data, worker)
environment.runner.send_message("worker_info", index_info, worker)
3、worker接收信息
usernames_queue = queue.Queue()
def setup_test_users(environment, msg, **kwargs):
""" Worker 接收消息的方法, 在 on_locust_init 中定义 """
usernames.extend(map(lambda u: u["name"], msg.data))
for i in usernames:
usernames_queue.put({"username": i})
def setup_worker_info(environment, msg, **kwargs):
environment.runner.send_message("acknowledge_users", f"worker info: {msg.data}")
4、master接收消息
def on_acknowledge(environment, msg, **kwargs):
""" Master 接收消息的方法, 在 on_locust_init 中定义 """
print(msg.data)
5、脚本中使用
class MyUser(HttpUser):
@task
def login(self):
username = usernames_queue.get()["username"]
payload = f'name={username}&passwd=XXXX'
headers = {'Content-Type': 'application/x-www-form-urlencoded',}
with self.client.post("/login", params=payload, headers=headers) as login_res:
token = login_res.json()["token"]
...
usernames_queue.put({"username": username})