上一篇博客已經介紹了locust的基礎用法,現在講下腳本的參數化
因我這次的任務是壓測ocr類的產品,故它對不同大小、不同像素、不同清晰度的圖片的識別的響應時間是不一樣的,故而爲了更好的模擬現實現實場景,需要對腳本進行參數化,沒想到locust還真的可以像jmeter\loadrunner那樣進行參數化,今天介紹的參數化函數爲locust自帶的queue函數
queue.Queue(maxsize)
Queue提供了一個基本的FIFO(先進先出)容器,使用方法很簡單,maxsize是個整數,指明瞭隊列中能存放的數據個數的上限。一旦達到上限,插入會導致阻塞,直到隊列中的數據被消費掉。如果maxsize小於或者等於0,隊列大小沒有限制。,故我選擇不限制隊列大小。
代碼如下:
# -*- coding: UTF-8 -*- import requests from locust import HttpLocust,TaskSet,task from requests.packages.urllib3.exceptions import InsecureRequestWarning import base64 import queue import glob # 禁用安全請求警告 requests.packages.urllib3.disable_warnings(InsecureRequestWarning) img_path_list = glob.glob('/home/ocrpython/nanjingocr/picture/*.jpg') #總共有150張圖片 def img_to_b64(img_path): with open(img_path, 'rb') as f: base64_data = base64.b64encode(f.read()) return base64_data.decode('utf-8') class set_task (TaskSet): @task def post_api (self): # 定義請求頭 # data_dis = {"img": img_to_b64(image_path), "orderNo": "test101901080933541948707600000004"} try: data1 = self.locust.queueData.get() #獲取隊列裏的數據 data2 = self.locust.queueData.put_nowait(data1) #再將取出的數據插入隊尾,對數據進行循環使用 except queue.Empty: #//隊列取空後,直接退出 print('no data exist') exit(0) payload = { 'img': data1['img'], 'orderNo': data1['orderNo'], } req = self.client.post("/id_ocr_batch", data=payload) http_code = req.status_code if http_code != 200: print("response null !!!") else: print(req.text) class apiUser(HttpLocust): task_set = set_task min_wait = 2 max_wait = 500 host = 'http://XX.XX.XX.XX:6022' # print(1) queueData = queue.Queue() # 隊列實例化 for i in range(150): #循環數據生成 data = { "img": img_to_b64(img_path_list[i]), "orderNo": "test%d" % i, } queueData.put_nowait(data) #將data存入隊列中 if __name__ == '__main__': import os os.system("locust -f /home/ocrpython/nanjingocr/locust_idocr.py")