-
一、思考一下,我們執行效能測試的時候,需要哪些資料呢?
-
step1 準備指令碼過程資料
- 1.全域性資料:exp(一批測試使用者、一批測試商品)
- 2.區域性資料:
- a) 用於介面動態入參,不用從上下文中獲取 (exp:時間戳)
- b) 用於介面動態入參,需要從上下文中獲取(exp:使用者登入 token 或者 cookie,訂單 ID)
- 3.轉換資料:exp(將明文密碼轉換為 md5 加密)
-
setp2 執行指令碼過程中資料使用
- 1.同一批資料:每個介面可重複取數
- 2.同一批資料,每個介面取數不重複
- 3.不同批資料:每個介面分別隨機取值,不同批資料無關聯關係,可隨機匹配
- 4.不同批資料:每個介面分別隨機取值,不同批資料有對應關聯關係
-
二、關於上述場景資料引數化
-
step1 準備指令碼過程中引數化處理
- 1.全域性資料:(對比 jmeter 呼叫 text 或者 csv 的文件方法)
- 可以使用 txt 或者 csv,在透過 pyton 中檔案讀取函式讀取出來,有資料關聯的建議每條以 dict of list 形式進行儲存
- 使用 python 中 list 型別讀取
- 2.區域性資料:
- a.上下文無關的動態引數,使用 def 函式返回值進行動態獲取
- b.上下文相關的動態引數,使用 taskset 中類屬性來進行獲取並引數化
# txt中資料為1,2,3,4,5,6
def get_txt_data():
with open("user.txt", "r") as f:
data = f.read()
return data
# 列表形式資料
s = [1, 2, 3, 4, 5, 6]
s1 = [{"user_name": "張三", "password": 123456},
{"user_name": "李四", "password": 456789},
{"user_name": "王五", "password": 123789}]
# 從上下文中取資料
from locust import Locust, TaskSet, task, between
from time import time
from uuid import uuid1
# 返回當前時間戳
def get_time_stamp():
return str(int(time()))
class MyTaskSet(TaskSet):
# 該函式不是task任務的,可以新增函式來進行獲取token,方便任務來呼叫
def get_login_token(self):
return uuid1()
# 使用類屬性來進行引數傳遞
token = None
# TaskSet相當於下面所有task的大腦
@task(1) # 宣告任務
def my_task(self):
print("執行task1" + get_txt_data())
MyTaskSet.token = uuid1()
@task(2)
def my_task_2(self):
print("執行task2" + str(s[0])+str(MyTaskSet.token))
class AppUser(Locust):
weight = 1 # 賦值權重 weight = 10 預設為10
task_set = MyTaskSet
wait_time = between(1, 2)
host = "" # 域名host
-
step2 指令碼執行過程中
- 1.同一批資料或者多批資料:
- 不同的 taskset 對應的 user 類中,使用相同的 data 資料
- 不同的 taskset 對應的 user 類中,透過一個或者多個佇列進行不重複取值 (如果有關聯關係的資料,可以重新一個佇列,把對應關係用字典存入到佇列)
# 兩個UserLocust重複呼叫一個list資料
from locust import HttpLocust, TaskSet, task, Locust, between
import queue
# from multiprocessing import Queue
s=[1,2,3,4,5,6]
class MyTaskSet(TaskSet):
@task()
def task_test1(self):
print(queue_data_test1[0])
class MyTaskSet2(TaskSet):
@task()
def task_test2(self):
print(queue_data_test2[0])
class UserLocust2(Locust):
task_set = MyTaskSet2
wait_time = between(3, 10)
queue_data_test2 =s
class UserLocust(Locust):
task_set = MyTaskSet
wait_time = between(3, 10)
queue_data_test1 = s
# 兩個UserLocust呼叫同一個佇列,資料取值不重複;(存在多批次不重複,可定義多個Queue()物件)
from locust import HttpLocust, TaskSet, task, Locust, between
import queue
# from multiprocessing import Queue
def queue_data():
queue_data = queue.Queue() # 預設為先進先出 該佇列為task_set共享
# queue.LifoQueue(),後進先出
for i in range(0, 13):
queue_data.put_nowait(i) # put_nowait 不阻塞
return queue_data
class MyTaskSet(TaskSet):
@task()
def task_test1(self):
print(self.locust.queue_data_test1.get())
class MyTaskSet2(TaskSet):
@task()
def task_test2(self):
print(self.locust.queue_data_test2.get())
class UserLocust2(Locust):
weight =1
task_set = MyTaskSet2
wait_time = between(3, 10)
queue_data_test2 = queue_data() # 預設為先進先出 該佇列為task_set共享
class UserLocust(Locust):
weight =3
task_set = MyTaskSet
wait_time = between(3, 10)
queue_data_test1 = queue_data()
-
三.總結:
- 上面只是用了樣例描述了一下 locust 引數化的過程,基本上是用 python 的方法或者類呼叫來獲取資料和傳遞引數
- 選擇使用 Queue() 物件來實現資料的不重複呼叫,從其他資料中也可以看到使用 from multiprocessing import Queue 的佇列物件來控制多程序安全資料傳遞