locust 登录用户参数化 queue

背景:压测某一个功能点的时候,系统存在校验机制,一个账户的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%[email protected]" % count,
        }
        queueData.put_nowait(data)

对locust执行中发现,多用户执行的时候,每个vuser都会初始化一次register,所以队列池要对所有vuser共享,就只能放到test_run类中,这样就可以实现了。上面要注意的地方 一个是队列任务要实现共享,第二个就是获取线程池的值的时候,用的是

self.locust.queueData.get(),就能获取到里面的值了。

 

扩展:如果生成的是一个需要处理的任务池,比如删除系统的订单,这样获取订单号的操作就不能放到register中了,因为register只会初始化一次。所以得放到执行函数中。

具体的demo明天补充,下班~~~~~~~~~~~~

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章