Locust 参数化
概述:
和Loadrunner一样对于多用户并发时,重复登入或者数据的重复使用会造成脚本的失败,那么我们引入Loadrunner的参数化概念,对用户数据进行参数化来使脚本运行成功。
头绪:
user1 | user2 | user3 | |
迭代1 | account1 | account2 | account3 |
迭代2 | account4 | account5 | account6 |
从上表我们可以看到用户迭代使用不同账号操作脚本,此处我们列举用户注册的例子。
转换思维,不同用户用不同的账号信息去进行注册,也就是说可以看做一个队列排队取数的一个过程。
【account1,account2,。。。。】
Python库中正好有Queue队列完美符合我们的使用场景
Queue介绍:
Queue的种类:
- FIFO:
Queue.Queue(maxsize=0)
FIFO即First in First Out,先进先出。Queue提供了一个基本的FIFO容器,使用方法很简单,maxsize是个整数,指明了队列中能存放的数据个数的上限。一旦达到上限,插入会导致阻塞,直到队列中的数据被消费掉。如果maxsize小于或者等于0,队列大小没有限制。
- LIFO
Queue.LifoQueue(maxsize=0)
LIFO即Last in First Out,后进先出。与栈的类似,使用也很简单,maxsize用法同上
- priority
class Queue.PriorityQueue(maxsize=0)
构造一个优先队列。maxsize用法同上。
基本方法:
Queue.Queue(maxsize=0) FIFO, 如果maxsize小于1就表示队列长度无限
Queue.LifoQueue(maxsize=0) LIFO, 如果maxsize小于1就表示队列长度无限
Queue.qsize() 返回队列的大小
Queue.empty() 如果队列为空,返回True,反之False
Queue.full() 如果队列满了,返回True,反之False
Queue.get([block[, timeout]]) 读队列,timeout等待时间
Queue.put(item, [block[, timeout]]) 写队列,timeout等待时间
Queue.queue.clear() 清空队列
Locust中使用场景:
通过循环,每次put 数据data到队列结尾
user_data = queue.Queue() for i in range(100): data = { "username": "test%d" % i, "password": "pwd%d" % i, "email": "test%d@xxx.com" % i, "phone": "135%08d" % i, } user_data.put_nowait(data)
再通过queue.get方法,取出队列第一个数据
实际使用场景:
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, }
如果需要对数据进行循环使用(比如登入脚本),可以在队列取出后,再把取出数据放入队尾中:
self.locust.queueData.put_nowait(data)