Locust如何實現逐步負載?

yongheng999發表於2024-03-20

一、場景要求

我們在使用locust時,有時候預設的場景無法滿足我們的要求時,這時後我們需要自定義場景
比如我們要設定每一段時間啟動10個使用者執行,執行60s後再一次啟動10個使用者,總共執行10分鐘,預設的場景是無法滿足這樣的要求的,我們可以使用LoadTestshape類,LoadTestshape類提供了幾種負載測試策略

二、用法

在指令碼檔案中定義一個類繼承LoadTestshape類,locust在啟動時發現檔案中有使用這個類會自動啟動。

在該類中需要定義tick()方法,該方法返回使用者數以及產生率的元組(如果沒有返回這兩個測試將停止),locust啟動後每秒呼叫一次該函式。

在LoadTestshape類中可以使用get_run_time()方法來獲取測試執行的時間,使用此方法可以用來控制壓測的總時間。

三、基於時間峰值策略

需求:比如我們要設定每一段時間啟動10個使用者執行,過一段時間後再一次啟動10個使用者,持續加壓 60s

四、程式碼實現

import os
from locust import *


'''實現目標:每隔一段時間增加十個使用者,實現持續加壓'''


class CustomTaskSet(LoadTestShape):
# 設定壓測時間60s
time_limit=60
#設定啟動/停止的使用者數
spawn_rate=10
def tick(self):
"""
返回一個元組,包含兩值:
user_count -- 總使用者數
spawn_rate -- 每秒啟動/停止使用者數
返回None時,停止負載測試
"""
#獲取壓測時間
run_time=self.get_run_time()
if run_time<self.time_limit:
#每隔一段時間啟動10個使用者;為-1時,表示將個位變為0,逢5進一
user_count=round(run_time,-1)
print(f'當前使用者數{user_count},當前時間{run_time}')
return user_count,self.spawn_rate

return None

class IncrementalPressureMeasurement(HttpUser):
wait_time =between(1,2)
host="http://localhost:8080"
def on_start(self):

print("負載加壓開始")

def on_stop(self):
print("負載加壓結束")

@task
def increment_pressure(self):
self.client.post('/measurement',data={'measurement':''})


if __name__ == '__main__':
file_path = os.path.abspath(__file__)
os.system(f'locust -f {file_path} --web-host=127.0.0.1')
五、實現效果
最後我們欣賞下勞動成果吧,haha!

最後,還請大家可以點個免費的贊,你們的點贊才是我更新的動力!

 

相關文章