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


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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM