Locust效能測試實踐

lldhsds發表於2024-06-14

Locust效能測試實踐

Locust 是一個開源的負載測試工具,使用Python語言實現,其簡潔、輕量、高效的併發機制基於Gevent協程,可以實現單機模擬生成較高的併發壓力。具有分散式和可擴充套件的特點,能夠幫助你評估系統的效能並找到潛在的瓶頸。

Locust 的主要特點:

  1. 使用 Python 編寫測試指令碼:你可以用 Python 編寫使用者行為指令碼,定義各種使用者操作和請求。
  2. 分散式測試:支援分散式測試,允許在多臺機器上同時執行,從而模擬大量的併發使用者。
  3. 實時 Web 介面:提供直觀的 Web 介面,用於配置測試引數、啟動和監控測試。
  4. 可擴充套件性強:可以透過編寫自定義程式碼來擴充套件 Locust 的功能,滿足不同測試需求。

1. 安裝Locust

使用 pip 進行安裝:

pip3 install locust -i https://mirrors.aliyun.com/pypi/simple/

檢視安裝版本:

locust -V

2. web demo應用

使用 Python 的 Flask 框架實現一個簡單的web伺服器,包含主頁 (/) 和關於頁 (/about),用於Locust執行測試。

2.1 安裝Flask

使用pip安裝:

pip3 install flask -i https://mirrors.aliyun.com/pypi/simple/

2.2 建立Flask應用

新建一個名為 app.py 的檔案,編寫如下程式碼:

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/')
def index():
    return jsonify(message="Welcome to the homepage!")

@app.route('/about')
def about():
    return jsonify(message="This is the about page.")

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)

2.3 執行 Flask 應用

在終端中執行以下命令啟動 Flask 伺服器:

python app.py

預設情況下,Flask 伺服器會在 http://localhost:5000 執行。你可以透過瀏覽器訪問這個地址,檢視主頁和關於頁是否正常顯示。

3. 執行模式

Locust支援單機模式、分散式模式和無頭模式。每種模式適用於不同的測試場景。

3.1 單機模式

適用於小規模測試。簡單直接,只需在一臺機器上執行 Locust。

一個簡單的 Locust 測試指令碼如下所示:

# locust-test1.py
from locust import HttpUser, TaskSet, task, between

# 定義一個任務類繼承TaskSet類
class UserBehavior(TaskSet):
    # @task(1) 是裝飾器,宣告此方法是一個任務,權重為1。權重不寫的話預設為1
    @task(1)
    def index(self):
        self.client.get("/")
    # @task(2) 是裝飾器,宣告此方法是一個任務,權重為2
    @task(2)
    def about(self):
        self.client.get("/about")

# 定義一個執行類繼承HttpUser類
class WebsiteUser(HttpUser):
    tasks = [UserBehavior]
    wait_time = between(1, 5)
    host = "http://localhost:5000"

在這個指令碼中,我們定義了一個 UserBehavior 類,其中包含兩個任務:訪問主頁(index)和訪問關於頁(about)。然後我們定義了一個 WebsiteUser 類,指定使用者行為、請求之間的等待時間以及測試的web伺服器。

執行 Locust

在終端中執行以下命令啟動 Locust:

locust -f locust-test1.py

配置和啟動測試

開啟瀏覽器訪問 http://localhost:8089,在 Locust 的 Web 介面中設定測試引數,設定併發使用者數為50,設定每秒增加的使用者數為10,即以多快的速度增加使用者。測試host為本機執行的flask伺服器,執行時間為60秒。然後啟動測試。

結果結果統計:

圖示效能曲線:

測試報告下載:

3.2 分散式模式

適用於大規模測試。支援多臺機器協同工作,能夠模擬大量併發使用者,包括 master 和 worker 節點,worker節點產生負載, master 節點主要負責協調和收集來自多個 worker 節點的資料。

執行方法

  • 啟動 master:

    locust -f locust-test1.py --master
    
  • 啟動 worker:

    # worker機器同樣需要安裝locust
    locust -f locust-test1.py --worker --master-host=<master_ip>
    

worker執行後,master側命令列會有worker已連線的列印,可以看到當前master下面連線的worker數量。

在瀏覽器中開啟 http://<master_ip>:8089,配置測試引數並啟動測試:

3.3 無頭模式(Headless Mode)

適用於持續整合(CI)環境或不需要圖形介面的場景。可以自動執行測試,並將結果輸出到控制檯或檔案中。

執行方法

使用命令列引數配置和啟動測試:

locust -f locust-test1.py --headless -u 100 -r 10 -H http://192.168.0.210:5000 --run-time 1m --csv=results

引數說明

  • --headless:無頭模式執行。
  • -u--users:模擬的使用者數。
  • -r--spawn-rate:每秒啟動的使用者數。
  • --run-time:測試執行時間,例如 1m 表示 1 分鐘。
  • --csv:將測試結果輸出到 CSV 檔案。

3.4 總結

  • 單機模式 適用於簡單的小規模測試。
  • 分散式模式 適用於大規模測試,透過多個 worker 節點協同工作來模擬大量併發使用者。
  • 無頭模式 適用於自動化測試和持續整合環境,可以在沒有圖形介面的情況下執行測試並輸出結果。

4. locust執行引數說明

命令列選項 環境變數 配置檔案欄位 描述說明
-f, --locustfile LOCUST_LOCUSTFILE locustfile 要匯入的Python模組檔案,例如'../other.py'。預設為locustfile。
-H, --host LOCUST_HOST host 負載測試主機地址,例如'https://www.baidu.com'。
-u, --users LOCUST_USERS users 併發使用者數。主要與--headless一起使用。您可以在測試期間使用"w"和"W"(增加1或10個使用者)以及"s"和"S"(停止1或10個使用者)來更改。
-r, --spawn-rate LOCUST_SPAWN_RATE spawn-rate 每秒產生使用者的速率。主要與--headless一起使用。
--hatch-rate LOCUST_HATCH_RATE hatch-rate 啟動虛擬使用者的速率。
-t, --run-time LOCUST_RUN_TIME run-time 在指定的時間段後停止測試,例如(300s、20m、3h、1h30m等)。僅與--headless一起使用。預設為永久執行。
--web-host LOCUST_WEB_HOST web-host 繫結Web介面的主機。預設為'*'(所有介面)。
--web-port, -P LOCUST_WEB_PORT web-port 執行Web主機的埠地址。預設為8089。
--headless LOCUST_HEADLESS headless 禁用Web介面,立即開始負載測試。需要指定-u-t
--autostart LOCUST_AUTOSTART autostart 立即開始測試(不禁用Web UI)。使用-u-t控制使用者數和執行時間。
--autoquit LOCUST_AUTOQUIT autoquit 在測試執行完成後 X 秒後完全退出 Locust。僅與--autostart一起使用。預設為保持Locust執行,直到使用 CTRL+C 關閉。
--headful LOCUST_HEADFUL headful 啟用Headful模式。
--web-auth LOCUST_WEB_AUTH web-auth 使用基本身份驗證開啟Web介面。格式為username:password。
--tls-cert LOCUST_TLS_CERT tls-cert 用於HTTPS服務的TLS證書的路徑。
--tls-key LOCUST_TLS_KEY tls-key 用於HTTPS服務的TLS私鑰的路徑。
--master LOCUST_MODE_MASTER master 以Master模式執行,用於分散式負載測試。
--master-bind-host LOCUST_MASTER_BIND_HOST master-bind-host Master節點繫結的主機名或IP地址。僅在與--master一起使用。預設為'*'(所有可用介面)。
--master-bind-port LOCUST_MASTER_BIND_PORT master-bind-port Master節點繫結的埠。僅在與--master一起使用。預設為5557。
--expect-workers LOCUST_EXPECT_WORKERS expect-workers 預期的分散式客戶端數量。僅在與--headless一起使用時生效。
--expect-workers-max-wait LOCUST_EXPECT_WORKERS_MAX_WAIT expect-workers-max-wait 等待Worker連線的最長時間。預設為永遠等待。
--worker LOCUST_MODE_WORKER worker 以Worker模式執行,用於分散式負載測試。
--master-host LOCUST_MASTER_NODE_HOST master-host Master節點的主機名或IP地址。僅在與--worker一起使用。預設為127.0.0.1。
--master-port LOCUST_MASTER_NODE_PORT master-port Master節點使用的埠。僅在與--worker一起使用。預設為5557。
-T, --tags LOCUST_TAGS tags 測試中要包含的標籤列表,僅執行具有任何匹配標籤的任務。
-E, --exclude-tags LOCUST_EXCLUDE_TAGS exclude-tags 要從測試中排除的標籤列表,僅執行沒有匹配標籤的任務。
--csv LOCUST_CSV csv 將請求統計資訊以CSV格式儲存到檔案中。
--csv-full-history LOCUST_CSV_FULL_HISTORY csv-full-history 將每個統計資訊條目以CSV格式儲存到_stats_history.csv檔案中。
--print-stats LOCUST_PRINT_STATS print-stats 在控制檯中週期性列印統計資訊。
--only-summary LOCUST_ONLY_SUMMARY only-summary 僅列印摘要統計資訊。
--reset-stats LOCUST_RESET_STATS reset-stats 完成後重置統計資訊。在分散式模式下,應在Master和Worker上設定。
--html LOCUST_HTML html 將HTML報告儲存到指定的檔案路徑。
--skip-log-setup LOCUST_SKIP_LOG_SETUP skip-log-setup 禁用Locust的日誌記錄設定。
--loglevel, -L LOCUST_LOGLEVEL loglevel 日誌級別,選擇DEBUG/INFO/WARNING/ERROR/CRITICAL。預設為INFO。
--logfile LOCUST_LOGFILE logfile 日誌檔案的路徑。如果未設定,日誌將輸出到stderr。
--exit-code-on-error LOCUST_EXIT_CODE_ON_ERROR exit-code-on-error 在測試結果包含任何失敗或錯誤時設定退出程式碼。預設為1。
-s, --stop-timeout LOCUST_STOP_TIMEOUT stop-timeout 退出之前等待模擬使用者完成的任務的秒數。僅在執行Locust分散式時設定在主程序上。

有關更多詳細資訊,包括如何使用檔案或環境變數設定選項,請參閱文件:https://docs.locust.io/en/stable/configuration.html

5. 參考

  1. 官方文件:http://docs.locust.io/en/stable/installation.html

  2. Locust效能測試之快速入門: https://www.cnblogs.com/xyztank/articles/16932194.html

相關文章