Python語言的locust接口性能測試
性能測試工具
性能工具首先想到的是Loadrunner或Jmeter,LoadRunner是非常有名的商業性能測試工具,功能非常強大,但不推薦使用該工具,使用比較復雜,工具體積比較大,付費價格不便宜.
Locust簡介
基於Python語言,采用純Python描述測試腳本,並且HTTP請求完全基於Requests庫,除HTTP/HTTPS協議外,Locust還可以測試其他協議的系統,只需采用Python調用對應的庫進行請求描述即可,Locust的並發機制摒棄了進程和線程,采用協程的機制,協程避免了系統級資源調度,因此可以大幅度提高單機的並發能力.
Locust的常規使用
安裝 pip install locust
針對開發的接口 https://api.apiopen.top/getJoke?page=1&count=2&type=video
負載場景
- 每秒生成2個用戶,總共生成60個用戶
- 負載測試5分鍾然后查看接口的平均響應時間
from locust import HttpUser, task, between
class QuickstartUser(HttpUser):
wait_time = between(5, 9)
# 測試新實時段子 https://api.apiopen.top/getJoke?page=1&count=2&type=video
@task
def view_item(self):
page = 1
count = 2
type = "video"
self.client.get(f"/getJoke?page={page}&count={count}&type={type}")分解解釋:
- 模擬用戶定義一個類,繼承自HttpUser的client屬性,從而為每個用戶提供一個屬性,該屬性是一個實例HttpSession,可用於像要加載測試的目標系統發出HTTP請求
- 類中定義了一個wait_time函數,該函數將使模擬用戶在每個任務執行后等待5-9秒
- 通過修飾兩個方法來聲明兩個任務@task() 傳入參數在選擇任務的時候,傳入2表示有2倍的選擇任務機會,越大倍數越高
- 此外還聲明了on_start方法,每個模擬用戶在啟動時,都會調用具有該名稱的方法
- 如果將測試代碼放在當前目錄下的locustfile.py,直接運行locust就會執行該測試用例;如果在其他目錄位置,使用locust -f 文件絕對路徑
locust的頁面解釋
首頁
- Number of users to simulate 設置模擬用戶數
- Hatch rate(users spawned/second) 每秒產生的虛擬用戶數
- 但是Start swarming 開始運行性能測試
測試報告頁
- Type 請求的類型
- Name 請求的路徑
- request 當前請求的數量
- fails 當前請求失敗的數量
- Median 中間值
- Average 平均值,所有請求的平均響應時間
- Min 請求的最小服務器響應時間
- Max 請求的額最大服務器響應時間
- Content Size 單個請求的大小,單位字節
- reqs/sec 每秒中請求的個數
- 點擊Charts菜單可以查看性能圖表
locust的分解教程
wait_time屬性
用於確定模擬用戶在執行任務之間等待多長時間
最常見的是between,模擬用戶在每次執行任務后等待介於最小值和最大值之間的隨機時間,其他內置的等待時間函數時constant和constant_pacing wait_time=between(5,15)
weight屬性
如果文件存在多個用戶類,並且希望模擬更多特定類型的用戶,則可以在這些類上設置一個weight屬性,比如WebUser可能是MobileUser的三倍
class WebUser(User): weight = 3 ... class MobileUser(User): weight = 1 ...
主機屬性
一般在locust啟動時或者命令行中執行該選項指定(locust -f 絕對路徑 --host="https://ww.w.baidu.com")
如果在用戶類中聲明了主機屬性,則--host在命令行貨web請求中未指定任何主機屬性的情況下將使用該屬性
on_start和on_stop方法
用戶和TaskSet類可以聲明一個on_start方法或on_stop方法,用法跟selenium中setup、setdown用法類似
- on_start 在開始運行時將調用它的方法,對於TaskSet,on_start方法在模擬用戶開始執行時被調用
- on_stop 在停止運行時調用它的方法
test_start和test-stop事件
如果需要在負載測試的呃開始或結束時運行一些代碼,則使用test_start和test_stop事件,可以在locustfile的模塊級別為這些事件設置偵聽器
from locust import events @events.test_start.add_listener def on_test_start(**kwargs): print("A new test is starting") @events.test_stop.add_listener def on_test_stop(**kwargs): print("A new test is ending")
使用http客戶端
HttpUser的每個實例在client屬性中都有一個實例,在HttpSession類實際上是一個子類ruquest.Session,可以用來做HTTP請求,將使用報告給用戶get、post、put、delete、head、patch和options方法
在沒有UI的情況下運行locust
希望在某種自動化流程運行locust,結合headless標志與-u和-r一起使用
locust -f locust_files/my_locust_file.py --headless -u 1000 -r 100
設置測試時間限制(一旦時間到,locust將關閉)
locust -f locust_files/my_locust_file.py --headless -u 1000 -r 100 --run-time 1h30m
通過更快的HTTP客戶端提高Locust的性能
子類FastHttpUser而不是HttpUser(需要注意的是FastHttpUser使用具有稍微不同的API的其他客戶端實現,所以它可能並不總是可以替代HttpUser。)
from locust import task, between from locust.contrib.fasthttp import FastHttpUser class MyUser(FastHttpUser): wait_time = between(2, 5) @task def index(self): response = self.client.get("/")