1. 程式人生 > 實用技巧 >【效能測試】【locust】快速入門

【效能測試】【locust】快速入門

簡介

locust是一個開源的分散式使用者負載壓力測試工具,對網站(其他系統,例如介面等)進行負載測試,並確定可以處理多少的併發使用者,locust特點利用了協程支援,達到高數量級別的併發,以及基於事件驅動使用gevent庫來實現網路併發請求。https://www.locust.io/

環境配置

  • Python 3.8.2
  • pycharm
  • window or linux

安裝locust

pip install locust

依賴庫

安裝locust後,會自動下載對應的依賴庫

  1. gevent: gevent是第三方庫,通過greenlet實現協程, 當訪問網路時,IO操作會消耗很長時間出現等待情況,greenlet會自動切換其他greenlet,直到IO操作完成,再切換回來,保證greenlet始終再執行,而不是再等待

  2. 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()
  1. psutil:是一個監控庫,監控cpu, 記憶體,磁碟等

  2. flask, Flask-BasicAuth: flask web第三方框架,Flask-BasicAuth:許可權驗證

  3. 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

  1. Number of total users to simulate: 設定總共的模擬使用者總數
  2. 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 每秒鐘處理請求的數量