Locust 測試結果趨勢圖分析
阿新 • • 發佈:2018-11-22
目的:
相信大家對於使用Loadrunner測試後的結果分析詳細程度還是有比較深刻的感受的,每個請求,每個事務點等都會有各自的趨勢指標,在同一張圖示中展示。如下圖:
而Locust自身提供的chart趨勢圖缺很簡單,如下圖:
那麼要達到Loadrunner對於每個請求的詳細的描述,用locust能否實現呢?
答案是肯定的,那麼我們想到就開始做!
思路:
我們整理一下思路,按照步驟去達到我們的目的:
1. 首先我們需要知道每個請求的響應時間
2. 我們需要把每個請求的響應時間進行資料整理和拆分
3. 我們需要把整理好的資料生成圖示
實施:
按照初步的思路,我們來按步驟進行實施:
1. 抓取每個請求的響應時間。
我們需要獲取每個請求的響應時間,可以通過Locust本身自帶的鉤子函式列印成日誌檔案。
具體程式碼如下:
#!/usr/bin/python3.6 # -*- coding: UTF-8 -*- # author:Lucien # 基礎包: 壓力Log日誌封裝 from locust import events import os import time import logging from logging.handlers import RotatingFileHandlerclass loadLogger(): def __init__(self, filePath, fileName): self.filePath = filePath # 存放檔案的路徑 self.fileName = fileName # 存放檔案的名字 self.BACK_UP_COUNT = 5000 # 檔案分割上限數 self.MAX_LOG_BYTES = 1024 * 1024 * 1 # 單個檔案最大記錄數1M self.create_handler() # 初始化建立日誌handler self.create_logger() #初始化建立Logger def create_handler(self): # 建立handler self.success_handler = RotatingFileHandler(filename=os.path.join(self.filePath, self.fileName), maxBytes=self.MAX_LOG_BYTES * 100, backupCount=self.BACK_UP_COUNT, delay=1) # 分割檔案處理按100m分割 formatter = logging.Formatter('%(asctime)s | %(name)s | %(levelname)s | %(message)s') # 設定輸出格式 formatter.converter = time.gmtime # 時間轉換 self.success_handler.setFormatter(formatter) # 格式載入到handler def create_logger(self): # 建立Logger self.success_logger = logging.getLogger('request_success') self.success_logger.propagate = False self.success_logger.addHandler(self.success_handler) def success_request(self, request_type, name, response_time, response_length): # 成功日誌輸出格式載入到Logger中 msg = ' | '.join([str(request_type), name, str(response_time), str(response_length)]) self.success_logger.info(msg) def get_locust_Hook(self): # 鉤子掛載到Locust中 events.request_success += self.success_request
以上為封裝好的Log日誌輸出
在併發時帶入log日誌輸出為本地檔案存放,程式碼如下:
# !/usr/bin/python3.6 # -*- coding: UTF-8 -*- # author: lucien # 基礎包: locust趨勢圖生成包 from locust import TaskSet, task, HttpLocust from Performance_Core.performance_log import loadLogger import os class file_server_stress(TaskSet): def on_start(self): '''警號,部門編號等''' self.deptID = '520' self.pcMemberID = '10000001' self.phoneMemberID = '10000004' self.logger = loadLogger(filePath='E:\\PrintLog', fileName='11-12-logs') # 上傳檔案 @task(1) def update_file(self): payload = "xxx" url = ':6061/file/upload/file' headers = { 'content-type': "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW", 'Cache-Control': "no-cache", 'Postman-Token': "9889c0b4-b91c-4b23-a713-cae4d60e623a" } response = self.client.post(url=url, data=payload, headers=headers, name='update_file', catch_response=True, timeout=20) print(response.text) # 驗證請求成功與失敗 if response.status_code == 200: self.logger.get_locust_Hook() #重點!此處掛載Log日誌鉤子 response.success() else: self.logger.get_locust_Hook() response.failure('上傳檔案失敗') class userbehavior(HttpLocust): host = 'http://192.168.1.222' task_set = file_server_stress min_wait = 3000 max_wait = 5000 if __name__ == '__main__': '''網頁啟動,在網頁中輸入127.0.0.1:8089''' os.system('locust -f file_server_stress.py --web-host=127.0.0.1')