locust 如何引數化?

FisherMan發表於2020-05-21
  • 一、思考一下,我們執行效能測試的時候,需要哪些資料呢?
    • 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 的佇列物件來控制多程序安全資料傳遞

相關文章