Locust是一款Python技術棧的開源的效能測試工具。Locust直譯為蝗蟲,寓意著它能產生蝗蟲般成千上萬的併發使用者:
Locust並不小眾,從它Github的Star數量就可見一斑:
截止文章寫作時,一共15951Star。
Locust生態良好,它已在多家外企(包括世界500強)投入使用:
如此看來,Locust是非常值得學習和掌握的一款工具。
Python的魔力在於化繁為簡,基於Python的Locust也能給仍然困惑於效能測試的我們帶來啟發。
Locust特點
- 以純Python方式編寫使用者指令碼,提供極大自由度。
- 使用者指令碼可以序列方式編寫,Locust會通過輕量級程式/協程產生併發,無需自己做併發程式設計。
- 併發量大,藉助於gevent庫,Locust能產生成千上萬併發請求。
- 開銷小,Locust使用者執行時開銷很小。
- 良好的Web UI對效能結果實時監測。
- 能測任何系統任何協議,只需要寫個client即可。
- 開放REST API,盡情發揮。
安裝Locust
需要Python版本3.6及以上。
執行pip命令:
$ pip install locust
驗證安裝成功:
$ locust -V
安裝時會一併安裝依賴庫:
Installing collected packages: Werkzeug, pywin32, zope.event, greenlet, gevent, geventhttpclient, itsdangerous, flask, Flask-BasicAuth, ConfigArgParse, pyzmq, psutil, locust
能看出來flask為Locust提供了Web功能。
快速上手
使用Locust一般按照以下步驟進行:
- 編寫Python使用者指令碼。
- 使用
locust
命令執行效能測試。 - (可選)通過Web介面監測結果。
示例程式碼如下,新建locustfile.py檔案:
import time
from locust import HttpUser, task, between
class QuickstartUser(HttpUser):
wait_time = between(1, 2.5)
@task
def hello_world(self):
self.client.get("/hello")
self.client.get("/world")
@task(3)
def view_items(self):
for item_id in range(10):
self.client.get(f"/item?id={item_id}", name="/item")
time.sleep(1)
def on_start(self):
self.client.post("/login", json={"username":"foo", "password":"bar"})
路徑切換到locustfile.py檔案所在目錄,執行命令:
$ locust
也可以通過
-f
指定某個目錄檔案:$ locust -f locust_files/my_locust_file.py
執行後,開啟http://127.0.0.1:8089看到Web介面:
填寫資訊後,就能開始壓測了。Web介面提供了結果統計資料:
和效能指標走勢圖:
指令碼解析
示例指令碼解析如下:
# Locust使用者指令碼就是Python模組
import time
from locust import HttpUser, task, between
# 類繼承自HttpUser
class QuickstartUser(HttpUser):
# 每個模擬使用者等待1~2.5秒
wait_time = between(1, 2.5)
# 被@task裝飾的才會併發執行
@task
def hello_world(self):
# client屬性是HttpSession例項,用來傳送HTTP請求
self.client.get("/hello")
self.client.get("/world")
# 每個類只會有一個task被選中執行
# 3代表weight權重
# 權重越大越容易被選中執行
# view_items比hello_wolrd多3倍概率被選中執行
@task(3)
def view_items(self):
for item_id in range(10):
# name引數作用是把統計結果按同一名稱進行分組
# 這裡防止URL引數不同會產生10個不同記錄不便於觀察
# 把10個彙總成1個"/item"記錄
self.client.get(f"/item?id={item_id}", name="/item")
time.sleep(1)
# 每個模擬使用者開始執行時都會執行
def on_start(self):
self.client.post("/login", json={"username":"foo", "password":"bar"})
小結
本文先了解了Locust的背景和生態,它是值得學習的,對於Python技術棧來說更加如此。接著介紹了使用pip命令安裝Locust,其中發現順帶安裝了flask,Locust的Web功能是flask提供的。然後給出了一段示例程式碼,按照步驟上手Locust。最後對示例程式碼進行了解析,淺嘗輒止。locustfile實際上該怎麼寫呢?
參考資料: