摘要:前言大家好,我是測試君最近有小伙伴后臺給我留言,說自己用寫了一個大文件上傳的接口,現在想本地檢驗一下接口并發的穩定性,問我有沒有好的方案本篇文章以文件上傳為例,聊聊并發執行腳本的完整流程實現文件上傳大文件上傳包含個步驟,
大家好,我是測試君!
最近有小伙伴后臺給我留言,說自己用 Django 寫了一個大文件上傳的 Api 接口,現在想本地檢驗一下接口并發的穩定性,問我有沒有好的方案
本篇文章以文件上傳為例,聊聊 Jmeter 并發執行 Python 腳本的完整流程
大文件上傳包含 3 個步驟,分別是:
2-1 獲取文件信息及切片數目
首先,獲取文件的大小
然后,利用預設的切片大小獲取分段總數
最后,獲取文件名及 md5 值
import osimport mathimport hashlibdef get_file_md5(self, file_path): """獲取文件的md5值""" with open(file_path, "rb") as f: data = f.read() return hashlib.md5(data).hexdigest()def get_filename(self, filepath): """獲取文件原始名稱""" # 文件名帶后綴 filename_with_suffix = os.path.basename(filepath) # 文件名 filename = filename_with_suffix.split(".")[0] # 后綴名 suffix = filename_with_suffix.split(".")[-1] return filename_with_suffix, filename, suffixdef get_chunk_info(self, file_path): """獲取分段信息""" # 獲取文件總大小(字節) file_total_size = os.path.getsize(file_path) print(file_total_size) # 分段總數 total_chunks_num = math.ceil(file_total_size / self.chunk_size) # 文件名(帶后綴) filename = self.get_filename(file_path)[0] # 文件的md5值 file_md5 = self.get_file_md5(file_path) return file_total_size, total_chunks_num, filename, file_md5
2-2 切片及分段上傳
利用分段總數和分段大小,對文件進行切片,調用分段文件上傳接口
import requestsdef do_chunk_and_upload(self, file_path):? """將文件分段處理,并上傳""" file_total_size, total_chunks_num, filename, file_md5 = self.get_chunk_info(file_path) # 遍歷 for index in range(total_chunks_num): print("第{}次文件上傳".format(index + 1)) if index + 1 == total_chunks_num: partSize = file_total_size % chunk_size else: partSize = chunk_size # 文件偏移量 offset = index * chunk_size # 生成分片id,從1開始 chunk_id = index + 1 print("開始準備上傳文件") print("分片id:", chunk_id, "文件偏移量:", offset, ",當前分片大小:", partSize, ) # 分段上傳文件 self.__upload(offset, chunk_id, file_path, file_md5, filename, partSize, total_chunks_num)def __upload(self, offset, chunk_id, file_path, file_md5, filename, partSize, total): """分次上傳文件""" url = "http://**/file/brust/upload" params = {"chunk": chunk_id, "fileMD5": file_md5, "fileName": filename, "partSize": partSize, "total": total } # 根據文件路徑及偏移量,讀取文件二進制數據 current_file = open(file_path, "rb") current_file.seek(offset) files = {"file": current_file.read(partSize)} resp = requests.post(url, params=params, files=files).text print(resp)
2-3 合并文件
最后調用合并文件的接口,將分段小文件合成大文件
def merge_file(self, filepath): """合并""" url = "http://**/file/brust/merge" file_total_size, total_chunks_num, filename, file_md5 = self.get_chunk_info(filepath)? payload = json.dumps( { "fileMD5": file_md5, "chunkTotal": total_chunks_num, "fileName": filename } ) print(payload) headers = { "Content-Type": "application/json" } resp = requests.post(url, headers=headers, data=payload).text print(resp)
2-4 文件路徑參數化
為了并發執行,將文件上傳路徑參數化
# fileupload.py...if __name__ == "__main__": filepath = sys.argv[1] # 每一段切片的大小(MB) chunk_size = 2 * 1024 * 1024 fileApi = FileApi(chunk_size) # 分段上傳 fileApi.do_chunk_and_upload(filepath) # 合并 fileApi.merge_file(filepath)
在使用 Jmeter 創建并發流程前,我們需要編寫批處理腳本
其中,執行批處理腳本時,需要跟上文件路徑一起執行
# cmd.bat@echo offset filepath=%1python C:/Users/xingag/Desktop/rpc_demo/fileupload.py %*
然后,在本地新建一個 CSV 文件,寫入多個文件路徑
# 準備多個文件路徑(csv)C://Users//xingag//Desktop//charles-proxy-4.6.1-win64.msiC://Users//xingag//Desktop//V2.0.pdfC://Users//xingag//Desktop//HBuilder1.zipC://Users//xingag//Desktop//HBuilder2.zip
接著,就可以使用 Jmeter 創建并發流程了
完整步驟如下:
這里線程組數目與上面文件數目保持一致即可
同步定時器中的「 模擬用戶組的數量 」和上面參數數量保持一致
指向上面準備的 csv 數據文件,設置文件格式為 UTF-8,變量名稱設置為 file_path,最后將線程共享模式設置為「 當前線程組 」
添加調試取樣器,方便調試
添加 OS 進程取樣器
選擇上面創建的批處理文件,命令行參數設置為「 ${file_path} 」
運行上面創建的 Jmeter 并發流程,在結果數中可以查看并發上傳文件的結果
當然,我們可以增加并發數量去模擬真實的使用場景,只需要修改 CSV 數據源及 Jmeter 參數即可
如果你覺得文章還不錯,請大家 點贊、分享、留言 下,因為這將是我持續輸出更多優質文章的最強動力!
最后: 可以關注公眾號:傷心的辣條 ! 進去有許多資料共享!資料都是面試時面試官必問的知識點,也包括了很多測試行業常見知識,其中包括了有基礎知識、Linux必備、Shell、互聯網程序原理、Mysql數據庫、抓包工具專題、接口測試工具、測試進階-Python編程、Web自動化測試、APP自動化測試、接口自動化測試、測試高級持續集成、測試架構開發測試框架、性能測試、安全測試等。
如果我的博客對你有幫助、如果你喜歡我的博客內容,請 “點贊” “評論” “收藏” 一鍵三連哦!
轉行面試,跳槽面試,軟件測試人員都必須知道的這幾種面試技巧!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/119796.html
摘要:前言大家好,我是安果之前寫過一篇文章,文中提出了一種方案,可以實現每天自動給微信群群發新聞早報如何利用爬蟲實現給微信群發新聞早報詳細但是對于很多人來說,首先編寫一款需要一定的移動端開發經驗,其次還需要另外編寫無障礙服務應用,如此顯得有一定難1. 前言大家好,我是安果!之前寫過一篇文章,文中提出了一種方案,可以實現每天自動給微信群群發新聞早報如何利用 Python 爬蟲實現給微信群發新聞早報?...
摘要:而對于功能測試升級來說,一般有這么個主流的發展方向一是性能測試,一是接口測試,一是自動化測試。主要被應用于的接口測試之中。 很多小伙伴工作在功能測試行業工作了2、3年后,發現自己已經把功能測試做的非常好了,已經到職業發展和薪資發展的瓶頸期了,就想著學點東西,提提升一下技能。? ?而對于功能...
jmeter web性能測試實例 img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; ma...
摘要:況且,即便使用了插件,也不能實現歷史數據追溯,數據持久化保存等功能。先來說下這套解決方案的原理,在運行過程中,將產生的性能數據寫入到數據庫里,然后定時從數據庫中讀取性能數據,并分類展示到頁面上。而提供了將性能數據寫入到的組件。 前 言 在服務端性能測試工具中,Jmeter毫無疑問是其中的王...
閱讀 1299·2021-11-24 09:39
閱讀 2669·2021-09-30 09:47
閱讀 1332·2021-09-22 15:15
閱讀 2419·2021-09-10 10:51
閱讀 1968·2019-08-30 15:55
閱讀 2982·2019-08-30 11:06
閱讀 902·2019-08-30 10:53
閱讀 839·2019-08-29 17:26