背景:压测某一个功能点的时候,系统存在校验机制,一个账户的token信息,只允许操作一个vuser(类似一个功能点,当两个相同的账号去访问的时候,第一个会访问成功,第二个就会访问失败)。所以只能对登录的账户进行参数。
参考了https://www.cnblogs.com/grandlulu/p/9264819.html ,运用队列任务消费,来实现不同账号的登录,附上大佬的源代码
from locust import HttpLocust, TaskSet, task
import queue
class test_taskset(TaskSet):
@task
def register(self):
try:
data = self.locust.queueData.get() //获取队列里的数据
print(data)
except queue.Empty: //队列取空后,直接退出
print('no data exist')
exit(0)
print('actually user and password is {} and {}'.format(data['username'], data['password']))
payload = {
'username': data['username'],
'password': data['password'],
}
self.client.post('/register', data=payload) //POST方法发送请求
class test_run(HttpLocust):
host = '192.168.1.100:16060'
task_set = test_taskset
queueData = queue.Queue() //队列实例化
for count in range(100): //循环数据生成
data = {
"username": "test%d" % count,
"password": "pwd%d" % count,
"email": "test%d@xxx.com" % count,
}
queueData.put_nowait(data)
对locust执行中发现,多用户执行的时候,每个vuser都会初始化一次register,所以队列池要对所有vuser共享,就只能放到test_run类中,这样就可以实现了。上面要注意的地方 一个是队列任务要实现共享,第二个就是获取线程池的值的时候,用的是
self.locust.queueData.get(),就能获取到里面的值了。
扩展:如果生成的是一个需要处理的任务池,比如删除系统的订单,这样获取订单号的操作就不能放到register中了,因为register只会初始化一次。所以得放到执行函数中。
具体的demo明天补充,下班~~~~~~~~~~~~