Locust效能測試實踐
Locust 是一個開源的負載測試工具,使用Python語言實現,其簡潔、輕量、高效的併發機制基於Gevent
協程,可以實現單機模擬生成較高的併發壓力。具有分散式和可擴充套件的特點,能夠幫助你評估系統的效能並找到潛在的瓶頸。
Locust 的主要特點:
- 使用 Python 編寫測試指令碼:你可以用 Python 編寫使用者行為指令碼,定義各種使用者操作和請求。
- 分散式測試:支援分散式測試,允許在多臺機器上同時執行,從而模擬大量的併發使用者。
- 實時 Web 介面:提供直觀的 Web 介面,用於配置測試引數、啟動和監控測試。
- 可擴充套件性強:可以透過編寫自定義程式碼來擴充套件 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. 參考
-
官方文件:http://docs.locust.io/en/stable/installation.html
-
Locust效能測試之快速入門: https://www.cnblogs.com/xyztank/articles/16932194.html