摘要:前言大家好,我是測(cè)試君最近有小伙伴后臺(tái)給我留言,說(shuō)自己用寫(xiě)了一個(gè)大文件上傳的接口,現(xiàn)在想本地檢驗(yàn)一下接口并發(fā)的穩(wěn)定性,問(wèn)我有沒(méi)有好的方案本篇文章以文件上傳為例,聊聊并發(fā)執(zhí)行腳本的完整流程實(shí)現(xiàn)文件上傳大文件上傳包含個(gè)步驟,
大家好,我是測(cè)試君!
最近有小伙伴后臺(tái)給我留言,說(shuō)自己用 Django 寫(xiě)了一個(gè)大文件上傳的 Api 接口,現(xiàn)在想本地檢驗(yàn)一下接口并發(fā)的穩(wěn)定性,問(wèn)我有沒(méi)有好的方案
本篇文章以文件上傳為例,聊聊 Jmeter 并發(fā)執(zhí)行 Python 腳本的完整流程
大文件上傳包含 3 個(gè)步驟,分別是:
2-1 獲取文件信息及切片數(shù)目
首先,獲取文件的大小
然后,利用預(yù)設(shè)的切片大小獲取分段總數(shù)
最后,獲取文件名及 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): """獲取文件原始名稱(chēng)""" # 文件名帶后綴 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): """獲取分段信息""" # 獲取文件總大小(字節(jié)) file_total_size = os.path.getsize(file_path) print(file_total_size) # 分段總數(shù) 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 切片及分段上傳
利用分段總數(shù)和分段大小,對(duì)文件進(jìn)行切片,調(diào)用分段文件上傳接口
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開(kāi)始 chunk_id = index + 1 print("開(kāi)始準(zhǔn)備上傳文件") print("分片id:", chunk_id, "文件偏移量:", offset, ",當(dāng)前分片大小:", 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 } # 根據(jù)文件路徑及偏移量,讀取文件二進(jìn)制數(shù)據(jù) 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 合并文件
最后調(diào)用合并文件的接口,將分段小文件合成大文件
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 文件路徑參數(shù)化
為了并發(fā)執(zhí)行,將文件上傳路徑參數(shù)化
# 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 創(chuàng)建并發(fā)流程前,我們需要編寫(xiě)批處理腳本
其中,執(zhí)行批處理腳本時(shí),需要跟上文件路徑一起執(zhí)行
# cmd.bat@echo offset filepath=%1python C:/Users/xingag/Desktop/rpc_demo/fileupload.py %*
然后,在本地新建一個(gè) CSV 文件,寫(xiě)入多個(gè)文件路徑
# 準(zhǔn)備多個(gè)文件路徑(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 創(chuàng)建并發(fā)流程了
完整步驟如下:
這里線(xiàn)程組數(shù)目與上面文件數(shù)目保持一致即可
同步定時(shí)器中的「 模擬用戶(hù)組的數(shù)量 」和上面參數(shù)數(shù)量保持一致
指向上面準(zhǔn)備的 csv 數(shù)據(jù)文件,設(shè)置文件格式為 UTF-8,變量名稱(chēng)設(shè)置為 file_path,最后將線(xiàn)程共享模式設(shè)置為「 當(dāng)前線(xiàn)程組 」
添加調(diào)試取樣器,方便調(diào)試
添加 OS 進(jìn)程取樣器
選擇上面創(chuàng)建的批處理文件,命令行參數(shù)設(shè)置為「 ${file_path} 」
運(yùn)行上面創(chuàng)建的 Jmeter 并發(fā)流程,在結(jié)果數(shù)中可以查看并發(fā)上傳文件的結(jié)果
當(dāng)然,我們可以增加并發(fā)數(shù)量去模擬真實(shí)的使用場(chǎng)景,只需要修改 CSV 數(shù)據(jù)源及 Jmeter 參數(shù)即可
如果你覺(jué)得文章還不錯(cuò),請(qǐng)大家 點(diǎn)贊、分享、留言 下,因?yàn)檫@將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強(qiáng)動(dòng)力!
最后: 可以關(guān)注公眾號(hào):傷心的辣條 ! 進(jìn)去有許多資料共享!資料都是面試時(shí)面試官必問(wèn)的知識(shí)點(diǎn),也包括了很多測(cè)試行業(yè)常見(jiàn)知識(shí),其中包括了有基礎(chǔ)知識(shí)、Linux必備、Shell、互聯(lián)網(wǎng)程序原理、Mysql數(shù)據(jù)庫(kù)、抓包工具專(zhuān)題、接口測(cè)試工具、測(cè)試進(jìn)階-Python編程、Web自動(dòng)化測(cè)試、APP自動(dòng)化測(cè)試、接口自動(dòng)化測(cè)試、測(cè)試高級(jí)持續(xù)集成、測(cè)試架構(gòu)開(kāi)發(fā)測(cè)試框架、性能測(cè)試、安全測(cè)試等。
如果我的博客對(duì)你有幫助、如果你喜歡我的博客內(nèi)容,請(qǐng) “點(diǎn)贊” “評(píng)論” “收藏” 一鍵三連哦!
轉(zhuǎn)行面試,跳槽面試,軟件測(cè)試人員都必須知道的這幾種面試技巧!
面試經(jīng):一線(xiàn)城市搬磚!又面軟件測(cè)試崗,5000就知足了…
面試官:工作三年,還來(lái)面初級(jí)測(cè)試?恐怕你的軟件測(cè)試工程師的頭銜要加雙引號(hào)…
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/119796.html
摘要:前言大家好,我是安果之前寫(xiě)過(guò)一篇文章,文中提出了一種方案,可以實(shí)現(xiàn)每天自動(dòng)給微信群群發(fā)新聞早報(bào)如何利用爬蟲(chóng)實(shí)現(xiàn)給微信群發(fā)新聞早報(bào)詳細(xì)但是對(duì)于很多人來(lái)說(shuō),首先編寫(xiě)一款需要一定的移動(dòng)端開(kāi)發(fā)經(jīng)驗(yàn),其次還需要另外編寫(xiě)無(wú)障礙服務(wù)應(yīng)用,如此顯得有一定難1. 前言大家好,我是安果!之前寫(xiě)過(guò)一篇文章,文中提出了一種方案,可以實(shí)現(xiàn)每天自動(dòng)給微信群群發(fā)新聞早報(bào)如何利用 Python 爬蟲(chóng)實(shí)現(xiàn)給微信群發(fā)新聞早報(bào)?...
摘要:而對(duì)于功能測(cè)試升級(jí)來(lái)說(shuō),一般有這么個(gè)主流的發(fā)展方向一是性能測(cè)試,一是接口測(cè)試,一是自動(dòng)化測(cè)試。主要被應(yīng)用于的接口測(cè)試之中。 很多小伙伴工作在功能測(cè)試行業(yè)工作了2、3年后,發(fā)現(xiàn)自己已經(jīng)把功能測(cè)試做的非常好了,已經(jīng)到職業(yè)發(fā)展和薪資發(fā)展的瓶頸期了,就想著學(xué)點(diǎn)東西,提提升一下技能。? ?而對(duì)于功能...
jmeter web性能測(cè)試實(shí)例 img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; ma...
摘要:吞吐量一般結(jié)合業(yè)務(wù)需求而定服務(wù)器資源占用占用率內(nèi)存使用率命中率篇是一種預(yù)測(cè)系統(tǒng)行為和性能的負(fù)載測(cè)試工具。負(fù)載測(cè)試與壓力測(cè)試都是性能測(cè)試。通過(guò)平臺(tái)接口可進(jìn)行合理的性能測(cè)試。有利于測(cè)試人員及時(shí)定位問(wèn)題。 Part 1:性能測(cè)試 性能測(cè)試是通過(guò)自動(dòng)化的測(cè)試工具模擬多種正常、峰值以及異常負(fù)載條件來(lái)對(duì)系統(tǒng)的各項(xiàng)性能指標(biāo)進(jìn)行測(cè)試。 A. 類(lèi)別 性能測(cè)試包括負(fù)載測(cè)試、壓力測(cè)試、基準(zhǔn)測(cè)試等。 i. 負(fù)...
摘要:況且,即便使用了插件,也不能實(shí)現(xiàn)歷史數(shù)據(jù)追溯,數(shù)據(jù)持久化保存等功能。先來(lái)說(shuō)下這套解決方案的原理,在運(yùn)行過(guò)程中,將產(chǎn)生的性能數(shù)據(jù)寫(xiě)入到數(shù)據(jù)庫(kù)里,然后定時(shí)從數(shù)據(jù)庫(kù)中讀取性能數(shù)據(jù),并分類(lèi)展示到頁(yè)面上。而提供了將性能數(shù)據(jù)寫(xiě)入到的組件。 前 言 在服務(wù)端性能測(cè)試工具中,Jmeter毫無(wú)疑問(wèn)是其中的王...
閱讀 1305·2021-11-24 09:39
閱讀 2686·2021-09-30 09:47
閱讀 1339·2021-09-22 15:15
閱讀 2433·2021-09-10 10:51
閱讀 1976·2019-08-30 15:55
閱讀 2987·2019-08-30 11:06
閱讀 906·2019-08-30 10:53
閱讀 848·2019-08-29 17:26