1. 程式人生 > 實用技巧 >Locust 指令碼開發入門(4)

Locust 指令碼開發入門(4)

指令碼開發入門

本節主要介紹 Locust 執行引數化的方法,引數化的目的無非就是以下幾種:

  • 模擬使用者在不同場景下的傳參差異化,比方說所有併發對同一個訂單執行支付,也許你需要檢驗這樣是否能發現到一些別的異常,但這是不符合效能測試需求的
  • 滿足業務對使用者傳參的約束條件,比方說你如果壓測的是即時通訊的訊息收發,即便支援多終端線上,但大量併發登入一個賬號也是是不符合實際的
  • 滿足系統對使用者傳參的約束條件

對一個引數執行引數化,首先得分清楚這個引數是屬於 “基礎資料” 還是 “業務資料” ,譬如 性別、省份、年月日,這些可以歸納為基礎資料,而對於與被測試系統業務有一定關聯性的,你可以歸為業務資料,例如 賬號密碼、userId、orderId。

通常來說,基礎資料 的資料範圍是相對數量固定的、內容有限的,即便切換測試環境也不影響的,所以一般在指令碼中內實現隨機抽取,例如:

import random

sex = random.choice(['男性', '女性'])
year = random.randint(1949,2020)

而業務資料動輒幾百上千條,相對來說數量和內容都是可變的,則應該通過讀取外部檔案實現(注意:Locust 的負載是通過 單程序 + 多協程 的實現,並非 多程序 + 多執行緒)。

範例:從 CSV 中讀取引數實現引數化

下面看一段指令碼範例,實現了登入賬號、密碼的引數化:

首先建立一個 csv 檔案,第一列是登入賬號,第二列是賬號對應的密碼,採用“,”分隔:

13800000001,abcd12ty
13800000002,abrd123y
13800000003,a12d1rty
13800000004,abc43454
13800000005,abcd12we
13800000006,abcd1wer
13800000007,abceqwe4
13800000008,abcd123k
13800000009,abcd1sd2
13800000010,123d124v

儲存為:username.csv

然後,指令碼實現:


from locust import HttpUser, task, constant, SequentialTaskSet
import queue

class taskcase(SequentialTaskSet):

    @task
    def pft(self):
        user = self.user.user_list.get()
        # print("username:{},password:{}".format(user["username"],user["password"]))
        
        self.client.post(
            "/login", {"username": user["username"], "password": user["password"]})
            
        # 登入後的一系列操作
        
        self.user.user_list.put_nowait(user)

class ApiUser(HttpUser):

    host = "http://www.demo.com"
    wait_time = constant(0)
    tasks = [taskcase]
    
    user_list = queue.Queue()
    
    with open("./username.csv") as file:
        for line in file:
            userInfo = line.split(',')
            data = {
                "username": userInfo[0],
                "password": userInfo[1]
            }
            
            user_list.put_nowait(data)

實現效果

建立了10個使用者,user1~user10,依次取出測試賬號 13800000001 ~ 13800000010,執行登入

Locust 指令碼開發入門(1)
Locust 指令碼開發入門(2)
Locust 指令碼開發入門(3)
Locust 指令碼開發入門(4): 引數化
返回:教程目錄
本節教程涉指令碼