【效能測試】【locust】快速入門
簡介
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 | 每秒鐘處理請求的數量 |