1. 程式人生 > 程式設計 >python效能測試工具locust的使用

python效能測試工具locust的使用

一、簡介

  Locust 是一個易於使用,分散式,使用者負載測試工具。它用於負載測試 web 站點(或其他系統),並計算出一個系統可以處理多少併發使用者。在測試期間,一大群虛擬使用者訪問你的網站。每個測試使用者的行為由您定義,叢集過程由 web UI 實時監控。這將幫助您在讓真正的使用者進入之前進行測試並識別程式碼中的瓶頸。

  Locust 完全是基於事件的,因此在一臺機器上支援數千個併發使用者是可能的。與許多其他基於事件的應用程式不同,它不使用回撥。相反它通過 gevent 使用輕量級協程。這允許您用 Python 編寫非常有表現力的場景,而不用回撥使程式碼複雜化。

二、安裝

用 pip 管理工具安裝:

pip3 install locust

檢查是否安裝成功,執行命令:locust --v

python效能測試工具locust的使用

三、壓測過程

1.編寫指令碼

Locust 不同於 jmeter 可以用 GUI 來建立壓測指令碼。Locust 需要自己編寫 python 指令碼,壓測負載指令碼主要包含兩個子類UserTask和WebsiteUser,分別繼承TaskSet和Httplocust類,擁有這兩個父類的公共屬性和方法。

from locust import HttpLocust,TaskSet,task,between
import os,json

# 定義使用者行為
class UserTask(TaskSet):
  def on_start(self):
    '''初始化資料,每個虛擬使用者只執行一次'''
    self.client.post("/login",{"username":"test","password":"123456"})

  @task(2)
  def home_index(self):
    r = self.client.get("/sz/Home/DefaultHomeV2Request")
    assert json.loads(r.text)['Error'] == 0

  @task(1)
  def sale(self):
    self.client.get("/sz/Home/FlashSaleRequest")
    assert json.loads(r.text)['Error'] == 0

  def on_stop(self):
    '''銷燬資料,每個虛擬使用者只執行一次'''
    self.client.post("/SignOut",{"CustomerGuid":"c7d7e646-9ce2-499b-a22e-a3c98d4545fe"})

class WebsiteUser(HttpLocust):
  host = 'http://10.1.62.126'
  task_set = UserTask
  wait_time = between(3,5)


if __name__ == "__main__":
  os.system('locust -f stress_test.py ')

locust 執行時:

  • on_start() :每個併發使用者在開始前各執行一次
  • on_stop():每個併發使用者在結束後各執行一次
  • @task: 通過裝飾器設定執行權重,比如上面程式碼中 執行任務 home_index 和 sale 的總請求為 2:1
  • assert:斷言設定
  • wait_time :每個任務之間設定間隔時間,隨機從3~5區間內取,單位是 s
  • locust -f:指定 .py 壓測指令碼路徑

2. Locust 監控

順帶提一下 locust web UI監控是基於 flask 框架,不指定 port 的話,預設地址:http://localhost:8089

python效能測試工具locust的使用

開始測試,Locust 提供一個簡易的監控介面,可以看到 RPS、響應時間 和 部分曲線圖

python效能測試工具locust的使用

python效能測試工具locust的使用

python效能測試工具locust的使用

python效能測試工具locust的使用

3.執行模式

1.web UI 模式

locust -f stress_test.py --web-host 10.1.44.31 --web-port 8090

--web-host:指定 web UI IP,預設 localhost

--web-port:指定 web UI 埠,預設 8089

2. no web 模式

locust -f stress_test.py --no-web -c 100 -r 20 -t 120

--no-web:指定無 web UI模式

-c:起多少 locust 使用者(等同於起多少 tcp 連線)

-r:多少時間內,把上述 -c 設定的虛擬使用者全部啟動

-t:指令碼執行多少時間,單位s

在 --no-web 模式下的報告如下:

python效能測試工具locust的使用

4.分散式程序

Locust 是由 python 編寫的,由於GIL的限制,單程序不能利用CPU多核的優勢(實際測試結果也是一樣,8核心的虛擬機器,只有一核達到了95%以上的使用率,其餘7核只圍觀,不出力)。所以單臺機器上想要儘可能的壓榨 CPU,只能開啟多程序,一般有多少個核心啟多少程序。

單臺多程序:

先啟一個 master

locust -f /home/script/stress_test.py --web-host 10.1.62.223 --master

再啟 8 個 slave

locust -f /home/script/stress_test.py --slave

slave 節點啟動後,在 locust 監控中能看到

python效能測試工具locust的使用

多臺多程序:

多臺機器搭建 Locust 分散式 和 單臺搭建多程序差不多。只有一個區別,如果 slave 和 master 不在一臺機器上, slave 需要指定 --master-host 引數:

python效能測試工具locust的使用

更多功能使用請檢視Locust官方文件,形成良好的習慣 :官方文件

四、總結

  Locust 基於 python 指令碼定製化壓測,使用 python 語言來實現 引數化、關聯引數、斷言和一些複雜的壓測場景非常方便。Locust 使用協程來構建tcp連線,本身單機併發能力強,但內部是由requests庫的httpclient 發起網路請求,requests庫功能挺全面,效能卻很一般,好在 Locust 支援分散式,彌補了一定的效能缺陷。根據自己做的測試,同樣幾臺客戶機,jmeter搭建分散式測出的 qps 比 Locust分散式 高1/3。如果要提升 locust 單程序效能,可以將 httpclient 的實現方式從 requests 換成geventhttpclient ,這個下一篇再講述。

以上就是python效能測試工具locust的使用的詳細內容,更多關於python效能測試工具locust的資料請關注我們其它相關文章!