一、背景
这还是2个月前做的一次接口性能测试,关于locust脚本的单机多核运行,以及主从节点之间的数据通信。
先简单交代下背景,在APP上线之前,需要对登录接口进行性能测试。经过评估,我还是优先选择了locust来进行脚本开发,本次用到了locust的单机多核运行能力,只不过这里还涉及到主从节点之间数据通信。现成的可参考的有效文档甚少,所以还是自己摸着官方文档过河比较靠谱。
顺带提一下,学习框架这种东西最好的教程其实还得是官方文档以及框架源码了,这里贴上locust官方文档链接,需要的可以自行学习:https://docs.locust.io/en/stable/what-is-locust.html
二、代码编写
其实脚本代码的编写一大重点就是如何处理测试数据,不同的测试需求对于测试数据的处理是不同的。比如这次的需求,手机号不能重复。另外考虑到长时间的负载压力,数据量还得足够。
最后测试数据还需要处理,那么我使用的测试号段是非真实号码段,测试结束后可以查询对应号段内的手机号,进行相关业务数据的清理。
1. 代码概览
还是老样子,先附上全部代码,然后对其结构进行拆分讲解。
import random
import time
from collections import deque
from locust import HttpUser, task, run_single_user, TaskSet, events
from locust.runners import WorkerRunner, MasterRunner
CURRENT_TIMESTAMP = str(round(time.time() * 1000))
RANDOM = str(random.randint(10000000, 99999999))
MOBILE_HEADER = {
"skip-request-expired": "true",
"skip-auth": "true",
"skip-sign": "true",
"os": "IOS",
"device-id": "198EA6A4677649018708B400F3DF69FB",
"nonce": RANDOM,
"sign": "12333",
"version": "1.2.0",
"timestamp": CURRENT_TIMESTAMP,
"Content-Type": "application/json"
}
last_mobile = ""
worker_mobile_deque = deque()
# 13300120000, 13300160000 新用户注册号段
@events.test_start.add_listener
def on_test_start(environment, **_kwargs):
if not isinstance(environment.runner, WorkerRunner):
mobile_list = []
for i in range(13300120000, 13300160000):
mobile_list.append(i)
mobile_list_length = len(mobile_list)
print("列表已生成,总计数量:", mobile_list_length)
worker_count = environment.runner.worker_count
chunk_size = int(mobile_list_length / worker_count)
print(f"平均每个worker分得的手机号数量:{chunk_size}")
for i, worker in enumerate(environment.runner.clients):
start_index = i * chunk_size
if i + 1 < worker_count:
end_index = start_index + chunk_size
else:
end_index = len(mobile_list)
data = mobile_list[start_index:end_index]
environment.runner.send_message("mobile_list", data, worker)
def setup_mobile_list(environment, msg, **kwargs):
len_msg_data = len(msg.data)
print(