Locust介紹:
Locust作為基於Python語言的性能測試框架。
其優點在於他的並發量可以實現單機10倍於LoadRunner和Jmeter工具。他的工作原理為協程並發,也就是gevent庫。
Locust的缺點也顯而易見,他沒有友好的性能監控頁面,沒有任何關聯,參數化,檢查點之類的定義。他僅僅就是一個輕量級的框架,但是正因為如此,我們可以通過python成千上萬的庫支持,定制自己任何想要的東西!
安裝
通過pip 安裝locust
pip install locustio
樣例
簡單的Locust框架樣例:
Locust每生成一個實例都代表一個虛擬的用戶,用來發送請求到進行負載測試的系統。
該用戶的行為由task_set屬性定義,該屬性應指向一個 TaskSet類。
這個類通常應該由某些類繼承並且重新定義。
例如:
1 from locust import Locust, TaskSet, task 2 3 class WebsiteTasks(TaskSet): 4 def on_start(self): 5 pass 6 7 @task(1) 8 def index(self): 9 pass 10 11 @task(5) 12 def about(self): 13 pass 14 15 class WebsiteUser(Locust): 16 task_set = WebsiteTasks 17 min_wait = 5000 18 max_wait = 15000
例如,當測試HTTP系統時,使用的HttpLocust類
1 from locust import HttpLocust, TaskSet, task 2 3 class MyTaskSet(TaskSet): 4 @task(2) 5 def index(self): 6 self.client.get("/") 7 8 @task(1) 9 def about(self): 10 self.client.get("/about/") 11 12 class MyLocust(HttpLocust): 13 task_set = MyTaskSet //測試集 14 min_wait = 5000 //單個請求下次發起的最小等待時間 15 max_wait = 15000 //單個請求下次發起的最大等待時間
host = 'xxx' //指定測試目標地址
WebsiteTasks(TaskSet): 繼承TaskSet類,該類中主要為用戶自己設定的測試集
TaskSet類中 :on_start是優先方法,他會優先於下面所有task方法。
:同樣 on_stop是結尾方法,會在結束時執行
@task裝飾器,task中的數字是測試中,該測試方法在測試集中的權重
HttpLocust 和 Locust繼承類中:
1.task_set 選擇需要的測試集,
2.min and max wait取最大和最小等待區間值,取值為隨機
3.host為指定測試目標地址
啟動
直接啟動:
locust --host=http://example.com
有文件路徑時:
locust -f locust_files/my_locust_file.py --host=http://example.com
例子:
locust -f test.py --host=127.0.0.1
需要多機並發操作時,主機啟動:
locust -f locust_files/my_locust_file.py --master --host=http://example.com
輔助機器啟動:
locust -f locust_files/my_locust_file.py --slave --host=http://example.com
注意點:
啟動時,有的同學打開web后8089端口,頁面打不開,可以使用以下方式打開:
locust -f locustfile.py --web-host=127.0.0.1
無網頁啟動:
locust -f locustfile.py --no-web -r 5 -c 1 -t 5m
r表示總用戶數,c表示每秒增加用戶數,t表示執行時間
打開測試頁面
打開測試頁面,Locust默認的地址通常為:http://127.0.0.1:8089
設定總人數和每秒增加人數,然后點擊開始
結尾:
引用debug-talk一段對整個Locust比較准確的概述和總結:
在Locust類
中,具有一個client
屬性,它對應着虛擬用戶作為客戶端所具備的請求能力,也就是我們常說的請求方法。通常情況下,我們不會直接使用Locust
類,因為其client
屬性沒有綁定任何方法。因此在使用Locust
時,需要先繼承Locust類
,然后在繼承子類中的client
屬性中綁定客戶端的實現類。
對於常見的HTTP(S)
協議,Locust
已經實現了HttpLocust
類,其client
屬性綁定了HttpSession
類,而HttpSession
又繼承自requests.Session
。因此在測試HTTP(S)
的Locust腳本
中,我們可以通過client
屬性來使用Python requests
庫的所有方法,包括GET/POST/HEAD/PUT/DELETE/PATCH
等,調用方式也與requests
完全一致。另外,由於requests.Session
的使用,因此client
的方法調用之間就自動具有了狀態記憶的功能。常見的場景就是,在登錄系統后可以維持登錄狀態的Session
,從而后續HTTP請求操作都能帶上登錄態
而對於HTTP(S)
以外的協議,我們同樣可以使用Locust
進行測試,只是需要我們自行實現客戶端。在客戶端的具體實現上,可通過注冊事件的方式,在請求成功時觸發events.request_success
,在請求失敗時觸發events.request_failure
即可。然后創建一個繼承自Locust類
的類,對其設置一個client
屬性並與我們實現的客戶端進行綁定。后續,我們就可以像使用HttpLocust類
一樣,測試其它協議類型的系統。
原理就是這樣簡單!