Python技術棧效能測試工具Locust入門

自動化程式碼美學發表於2021-05-07

Locust是一款Python技術棧的開源的效能測試工具。Locust直譯為蝗蟲,寓意著它能產生蝗蟲般成千上萬的併發使用者:

image-20210501150513778

Locust並不小眾,從它Github的Star數量就可見一斑:

image-20210501150222526

截止文章寫作時,一共15951Star。

Locust生態良好,它已在多家外企(包括世界500強)投入使用:

image-20210501150925439

如此看來,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一般按照以下步驟進行:

  1. 編寫Python使用者指令碼。
  2. 使用locust命令執行效能測試。
  3. (可選)通過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介面:

_images/webui-splash-screenshot.png

填寫資訊後,就能開始壓測了。Web介面提供了結果統計資料:

_images/webui-running-statistics.png

和效能指標走勢圖:

_images/webui-running-charts.png

指令碼解析

示例指令碼解析如下:

# 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實際上該怎麼寫呢?

參考資料:

https://locust.io/

https://docs.locust.io/en/stable/

相關文章