locust工具使用詳解
今年負責部門的人員培養工作,最近在部門內部分享和講解了locust這個工具,今天再部落格園記錄下培訓細節
一、簡介
1、優勢
locust是python語言開發的一款的開源的的性能測試框架,他比jmeter更加的輕量級,主要是通過協程(gevent)的方式去實現並發,通過協程的方式可以大幅提高單機的並發能力,同時避免系統級的資源調度。locust具有開源性、分散式、支援高並發,支援webUI的操作方式。
2、劣勢
locust的圖表功能較弱,只展示了很少的數據
locust不支援監控服務端的狀態,需要藉助第三方工具,或者自己寫程式碼去實現
二、安裝
locust的安裝非常簡單,直接通過pip的方式就可以安裝
pip install locust
三、locust的庫和方法介紹
1、from locust import task
通過task可以把某個函數指定為任務,直接@task裝飾對應的函數即可,在@tast(n)中可以有一個參數n,意思是這個任務的佔比是多少
2、from locust import TaskSet
需要定義一個類,繼承TaskSet這個類,這個是是一個任務集的概念,這個類中可以包括多個task
3、from locust import HttpUser
需要定義一個類,這個類要繼承HttpUser,通過這個定義的類我們可以執行具體的任務集
看了上面的介紹,可能大家有點雲里霧裡的,下面我們由淺入深看程式碼
四、實戰程式碼V1.0(入門程式碼)
1、程式碼如下
from locust import HttpLocust from locust import HttpUser from locust import task from locust import TaskSet #指定一個任務集 class My_task_set(TaskSet): #這是某個任務,30是比例,比如這裡是30/50 @task(30) def getindex1(self): # client就是個requests對象 # catch_response,告訴locust如何判斷請求失敗還是成功 res = self.client.get("/bainianminguo/p/10952586.html") @task(20) def getindex2(self): # client就是個requests對象 res = self.client.get("/bainianminguo/p/7253930.html") class WebSite(HttpUser): # 指定要執行哪個任務集 tasks = [My_task_set,] # 請求和請求之間最小的間隔時間 min_wait = 1000 # 請求和請求之間最大的間隔時間 max_waif = 2000
2、進入程式碼的目錄,執行如下命令
3、打開瀏覽器,輸入//localhost:8089/
4、參數講解
Number of total users to simulate 模擬的總的用戶數
Spawn rate 每秒鐘新增的用戶數
五、實戰程式碼V1.1(入門程式碼)
1、任務集類中的on_start方法
class My_task_set(TaskSet): #添加初始化方法 def on_start(self): print("類似類中的構造方法,每個用戶在任務開始前,只執行一次,在這裡可以定義一個對象的屬性,這樣其它測試集就可以使用這個屬性")
這個方法類似pytest框架中的前置條件或者說是面向對象中的構造方法
2、任務集類中的on_start方法
def on_stop(self): print("類似類中的後置方法,每個用戶在任務開始後,只執行一次,在這裡可以定義一個對象的屬性,這樣其它測試集就可以使用這個屬性")
六、實戰程式碼V1.2(入門程式碼)
1、如何判斷請求是失敗還是成功
2、然後再響應的消息中指定判斷邏輯即可,success即為成功,failure即為失敗
七、實戰程式碼V1.3(全量程式碼)
from locust import HttpLocust from locust import HttpUser from locust import task from locust import TaskSet # locust中的client會自動幫我們處理cookies。類似request.session(),所以如果我們登陸的時候,只需要在on_start中登陸一次就可以了 # 如果在locust中,如果url是不需要統計,則我們不要用clent去訪問api,應該用request去訪問,這樣就locust就不會統計request庫發起的請請求 #指定一個任務集 class My_task_set(TaskSet): #添加初始化方法 def on_start(self): print("類似類中的構造方法,每個用戶在任務開始前,只執行一次,在這裡可以定義一個對象的屬性,這樣其它測試集就可以使用這個屬性") def on_stop(self): print("類似類中的後置方法,每個用戶在任務開始後,只執行一次,在這裡可以定義一個對象的屬性,這樣其它測試集就可以使用這個屬性") #這是某個任務,30是比例,比如這裡是30/50 @task(30) def getindex1(self): # client就是個requests對象 # catch_response,告訴locust如何判斷請求失敗還是成功 res = self.client.get("/bainianminguo/p/10952586.html",catch_response=True) if res.code == 200: res.success() else: res.failure("ff") print(res) @task(20) def getindex2(self): # client就是個requests對象 res = self.client.get("/bainianminguo/p/7253930.html") print(res) class WebSite(HttpUser): # 指定要執行哪個任務集 # task_set = My_task_set tasks = [My_task_set,] # 請求和請求之間最小的間隔時間 min_wait = 1000 # 請求和請求之間最大的間隔時間 max_waif = 2000 # Number of total users to simulate 模擬的用戶數 # Spawn rate 每秒鐘產生的用戶數
八、常見問題
1、cookies
locust中的client會自動幫我們處理cookies。類似request.session(),所以如果我們登陸的時候,只需要在on_start中登陸一次就可以了
2、多統計api的問題
# 如果在locust中,如果url是不需要統計,則我們不要用clent去訪問api,應該用request去訪問,這樣就locust就不會統計request庫發起的請請求
九、分散式調用的問題
一旦單台機器不夠模擬足夠多的用戶時,Locust支援運行在多台機器中進行壓力測試。 為了實現這個,你應該在 master 模式中使用--master標記來啟用一個 Locust 實例。這個實例將會運行你啟動測試的 Locust 交互網站並查看實時統計數據。
master 節點的機器自身不會模擬任何用戶。相反,你必須使用 --slave 標記啟動一台到多台 Locustslave 機器節點,與標記 --master-host 一起使用(指出master機器的IP/hostname)。 常用的做法是在一台獨立的機器中運行master,在slave機器中每個處理器內核運行一個slave實例。 注意:master 和每一台 slave 機器,在運行分散式測試時都必須要有 locust 的測試文件。
在 master 模式下啟動 Locust: locust -f my_loucstfile.py --master 在每個 slave 中執行(192.168.0.14 替換為你 msater 的IP): locust -f my_locustfile.py --slave --master-host=192.168.0.14