Jmeter并发执行Python 脚本的完整流程_第1页
Jmeter并发执行Python 脚本的完整流程_第2页
Jmeter并发执行Python 脚本的完整流程_第3页
Jmeter并发执行Python 脚本的完整流程_第4页
Jmeter并发执行Python 脚本的完整流程_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Jmeter并发执行Python脚本的完整流程目录1.前言2.Python实现文件上传2-1获取文件信息及切片数目2-2切片及分段上传2-3合并文件2-4文件路径参数化3.Jmeter并发执行4.最后本篇文章以文件上传为例,聊聊Jmeter并发执行Python脚本的完整流程

1.前言

大家好,我是安果!

最近有小伙伴后台给我留言,说自己用Django写了一个大文件上传的Api接口,现在想本地检验一下接口并发的稳定性,问我有没有好的方案

本篇文章以文件上传为例,聊聊Jmeter并发执行Python脚本的完整流程

2.Python实现文件上传

大文件上传包含3个步骤,分别是:

获取文件信息及切片数目

分段切片,并上传-API

文件合并-API

文件路径参数化

2-1获取文件信息及切片数目

首先,获取文件的大小

然后,利用预设的切片大小获取分段总数

最后,获取文件名及md5值

importos

importmath

importhashlib

defget_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,suffix

defget_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)

returnfile_total_size,total_chunks_num,filename,file_md5

2-2切片及分段上传

利用分段总数和分段大小,对文件进行切片,调用分段文件上传接口

importrequests

defdo_chunk_and_upload(self,file_path):

"""将文件分段处理,并上传"""

file_total_size,total_chunks_num,filename,file_md5=self.get_chunk_info(file_path)

#遍历

forindexinrange(total_chunks_num):

print('第{}次文件上传'.format(index+1))

ifindex+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合并文件

最后调用合并文件的接口,将分段小文件合成大文件

defmerge_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)

3.Jmeter并发执行

在使用Jmeter创建并发流程前,我们需要编写批处理脚本

其中,执行批处理脚本时,需要跟上文件路径一起执行

#cmd.bat

@echooff

setfilepath=%1

pythonC:\Users\xingag\Desktop\rpc_demo\fileupload.py%*

然后,在本地新建一个CSV文件,写入多个文件路径

C:\\Users\\xingag\\Desktop\\charles-proxy-4.6.1-win64.msi

C:\\Users\\xingag\\Desktop\\V2.0.pdf

C:\\Users\\xingag\\Desktop\\HBuilder1.zip

C:\\Users\\xingag\\Desktop\\HBuilder2.zip

接着,就可以使用Jmeter创建并发流程了

完整步骤如下:

创建一个测试计划,下面添加一个线程组

这里线程组数目与上面文件数目保持一致即可

线程组下,添加「同步定时器」

同步定时器中的「模拟用户组的数量」和上面参数数量保持一致

添加CSV数据文件设置

指向上面准备的csv数据文件,设置文件格式为UTF-8,变量名称设置为file_path,最后将线

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论