1-6 萬 Star!微軟谷歌都在用 Python 性能測試工具
Locust 是一款 Python 技術棧的開源的性能測試工具。Locust 直譯爲蝗蟲,寓意着它能產生蝗蟲般成千上萬的併發用戶。
Locust 並不小衆,從它 Github 的 Star 數量就可見一斑:
鏈接:https://github.com/locustio/locust
截止文章寫作時,一共 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}", )
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}", )
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 實際上該怎麼寫呢?
參考資料:
https://locust.io/
https://docs.locust.io/en/stable/
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/8xlMu2ZzLMAZtb4S3Qch0A