当前位置: 首页 > 后端技术 > Python

说说Jmeter如何并发执行Python脚本_0

时间:2023-03-26 15:08:19 Python

一、前言大家好,我是安国!最近有个后台小伙伴给我留言,说他用Django写了一个上传大文件的Api接口。现在他想在本地检查一下接口并发的稳定性,问我有没有什么好的解决办法。本文以文件上传为例。下面说一下Jmeter并发执行Python脚本的完整过程2.Python实现文件上传大文件上传包括3个步骤,分别是:获取文件信息和分片个数,分段分片,上传-API文件合并-API文件路径参数化2-1获取文件信息和分片数首先获取文件大小然后使用预设的分片大小获取总分片数最后获取文件名和md5值importosimportmathimporthashlibdefget_file_md5(self,file_path):"""获取文件"""的md5值withopen(file_path,'rb')asf:data=f.read()returnhashlib.md5(data).hexdigest()defget_filename(self,filepath):"""获取原始文件名"""#带后缀的文件名filename_with_suffix=os.path.basename(filepath)#文件名filename=filename_with_suffix.split('.')[0]#后缀名suffix=filename_with_suffix.split('.')[-1]returnfilename_with_suffix,filename,suffixdefget_chunk_info(self,file_path):"""获取段信息"""#获取文件总大小(字节)file_total_size=os.path.getsize(file_path)print(file_total_size)#Chunk总段数total_chunks_num=math.ceil(file_total_size/self.chunk_size)#文件name(withsuffix)filename=self.get_filename(file_path)[0]#文件的md5值file_md5=self.get_file_md5(file_path)returnfile_total_size,total_chunks_num,filename,file_md52-2Slice和multipartupload使用的parts总数分片大小,分片文件,调用分片文件上传接口)#traverseforindexinrange(total_chunks_num):print('{}thfileupload'.format(index+1))ifindex+1==total_chunks_num:partSize=file_total_size%chunk_sizeelse:partSize=chunk_size#fileOffset偏移量=index*chunk_size#生成分片id,从1开始chunk_id=index+1print('开始准备上传文件')print("Shardid:",chunk_id,"Fileoffset:",offset,",当前分片大小:",partSize,)#分段上传文件self.__upload(offset,chunk_id,file_path,file_md5,文件名,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).textprint(resp)2-3合并文件最后调用的接口合并文件,将小文件合并成大文件defmerge_file(self,filepath):"""Merge"""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).textprint(resp)2-4文件路径参数化对于并发执行,文件上传路径参数改造#fileupload.py...if__name__=='__main__':filepath=sys.argv[1]#每个分片的大小(MB)chunk_size=2*1024*1024fileApi=FileApi(chunk_size)#分片上传fileApi.do_chunk_and_upload(filepath)#MergefileApi.merge_file(filepath)3.Jmeter并发执行在使用Jmeter创建并发进程之前,我们需要编写一个批处理脚本。执行批处理脚本时,需要和文件路径一起执行#cmd.bat@echooffsetfilepath=%1pythonC:\Users\xingag\Desktop\rpc_demo\fileupload.py%*然后,新建一个CSV文件locallyandwritemultiplefilepaths#准备多个文件路径(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数据文件设置指向上面准备的csv数据文件,并设置文件格式。为UTF-8,变量名设置为file_path,大部分然后将线程共享模式设置为“当前线程组”,并添加调试采样器,方便调试。添加一个OS进程sampler选择上面创建的批处理文件,命令行参数设置为“${file_path}”添加查看结果的个数4.最后运行上面创建的Jmeter并发进程,可以查看结果结果中的并发上传文件数。当然我们可以增加并发文件数来模拟真实的使用场景,只需要修改CSV数据源和Jmeter参数即可。如果觉得文章还不错,请点赞、分享、留言,因为这将是我继续输出更多优质文章的最强大动力!