概述:
和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)