簡介
locust是一個開源的分布式用戶負載壓力測試工具,對網站(其他系統,例如接口等)進行負載測試,並確定可以處理多少的並發用戶,locust特點利用了協程支持,達到高數量級別的並發,以及基於事件驅動使用gevent庫來實現網絡並發請求。https://www.locust.io/
環境配置
- Python 3.8.2
- pycharm
- window or linux
安裝locust
pip install locust
依賴庫
安裝locust后,會自動下載對應的依賴庫
-
gevent: gevent是第三方庫,通過greenlet實現協程, 當訪問網絡時,IO操作會消耗很長時間出現等待情況,greenlet會自動切換其他greenlet,直到IO操作完成,再切換回來,保證greenlet始終再運行,而不是再等待
-
requests: requests庫,http庫,實現各種請求,get,post,put,delete, 這邊在locust封裝后與requests庫對應使用
request | locust |
---|---|
request.post() | client.post() |
request.get() | client.get() |
request.delete() | client.delete() |
request.put() | client.put() |
-
psutil:是一個監控庫,監控cpu, 內存,磁盤等
-
flask, Flask-BasicAuth: flask web第三方框架,Flask-BasicAuth:權限驗證
-
pyzmq: 可用於Locust分布運行在多個進程/機器上
實現原理
locust有比較重要的概念,一個定義用戶行為(繼承TaskSet), 一個是用戶類(繼承HttpUser)
TaskSet
定義一組用戶將要執行的tasks場景,實現了虛擬用戶所執行任務的調度算法,TaskSet子類重定義任務,采用@task裝飾器
例子
- @task(1) 權重為1,@task(2)權重為2, 意思就是test_job2執行的頻率是test_job1的兩部
from locust import TaskSet, task
class UserBehavior(TaskSet):
@task(1)
def test_job1(self):
self.client.get('/job1')
@task(2)
def test_job2(self):
self.client.get('/job2')
- 第二種權重寫法
from locust import TaskSet, task
class UserBehavior(TaskSet):
@task
def test_job1(self):
self.client.get('/job1')
@task
def test_job2(self):
self.client.get('/job2')
class WebUser(HttpUser):
tasks = [test_job1, test_job2] # 不寫的話比重就是1:1
# tasks = {test_job1:1, test_job2:2} # 兩種方式等價
HttpUser
代替了之前版本的Httplocust實例化時創建一個client屬性,該屬性是一個具有支持的HTTP客戶端用於在請求之間保持用戶會話,創建的HttpSession的實例。客戶端支持cookies,因此在HTTP請求之間保持會話,由於request.Session, 再登陸系統后維持了登陸的seesion, 后面的task腳本操作都帶上了session
簡單示例
代碼示例
__author__ = 'wangxiao'
import os
# 導入包
from locust import HttpUser, task, between, TaskSet
# 定義task行為類繼承TaskSet
class SouMiSearch(TaskSet):
#
@task
def search(self):
url = "/api/p/search/"
body = {"keywords": "ceess"}
with self.client.post(url, json=body) as response:
print(response.text)
class WebUser(HttpUser):
tasks = [SouMiSearch]
wait_time = between(2, 5)
host = "http://api.shoumilive.com:83"
if __name__ == '__main__':
os.system("locust -f test_search.py")
# 運行
[2020-08-19 09:59:48,212] md2bkpyc/WARNING/locust.main: System open file limit setting is not high enough for load testing, and the OS wouldnt allow locust to increase it by itself. See https://docs.locust.io/en/stable/installation.html#increasing-maximum-number-of-open-files-limit for more info.
[2020-08-19 09:59:48,212] md2bkpyc/INFO/locust.main: Starting web interface at http://:8089
[2020-08-19 09:59:48,229] md2bkpyc/INFO/locust.main: Starting Locust 1.1.1
默認端口8089, 瀏覽器訪問127.0.0.1:8089
- Number of total users to simulate: 設置總共的模擬用戶總數
- Hatch rate (users spawned/second):每秒啟動的虛擬用戶數
場景設置
- 設置用戶總數10個,每秒啟動5個
測試監控界面
Statustics
頁面指標 | 解析 | 備注 |
---|---|---|
type | 請求類型 | |
Name | 請求名稱 | 這個可以自定義,傳name參數即可 |
Requests | 當前已完成的請求數量 | |
Fails | 失敗的請求數量 | |
Requests | 當前已完成的請求數量 | |
Median | 響應時間的中間值,即50%的響應時間在這個數值范圍內,單位為毫秒 | |
90%ile | 90%的響應時間在正態分布平均值下方,即小於這個值 | |
Min | 最小響應時間,單位為毫秒 | |
Max | 最大響應時間,單位為毫秒 | |
average Size | 平均每個請求的數據量,單位為字節 | |
current RPS | 每秒鍾處理請求的數量 |