Python实现文件分片上传接口自动化测试

南乔
南乔
发布时间:2026-10-14 | 5人浏览过
原创

本文介绍如何使用Python的Requests库对文件分片上传接口进行自动化测试。通过模拟前端行为,将大文件按指定大小分片,计算整体及分片MD5值,并循环调用后端接口上传各分片。最后通过对比服务器返回的MD5值来验证上传完整性与正确性,适用于Vue前端与PHP后端的系统测试场景。

背景与目标

文件分片上传接口测试原理

本文旨在利用Python的Requests库编写脚本,对公司系统的文件上传接口进行自动化测试。前端逻辑是将文件读取大小后分片传输至后端,后端负责将各分片数据重新组合还原为原文件。具体流程为:前端向后台发送整个文件的MD5、文件大小(size)、文件名(name)、文件后缀(ext)以及分片总数(totalchunk),同时附带当前分片的MD5、分片数据(chunk)及分片索引(chunkindex)。后端接收这些数据后,依据chunkindex将各分片数据重组,并在重组完成后进行MD5校验,以判断文件上传是否成功。在自动化测试中,只需调用后台接口并验证文件上传成功且无错误即可,无需深入探究底层的文件校验逻辑。

开发前端采用Vue技术,后端使用PHP。为了利用Python实现对这一接口的调用,首先需要模拟前端发送的数据结构,然后循环调用接口以完成文件分片上传。整体思路如下:

Python实现分片上传脚本

1. 获取整个文件的大小、文件名、后缀及分片总数,并定义每个分片的大小:


def __init__(self,data):
  dat = json.loads(data)
  self.path = dat['path'] # 获取文件路径
  self.CHUNK_SIZE = 1024*1024*2 # 定义每片文件的大小
  self.size = os.path.getsize(dat['path']) # 获取文件的大小
  self.totalchunk = math.ceil(self.size / self.CHUNK_SIZE) # 获取文件的分片总数
  self.ext = os.path.basename(dat['path']).split('.').pop() # 获取文件的后缀
  self.name = os.path.basename(dat['path']) # 获取文件的名字

2. 获取文件的MD5值。经查阅开发提供的MD5算法,Python实现过程如下:


# 使用hashlib库的md5方法获取指定文件的md5
def getmd5(self,path):
m = hashlib.md5()
with open(path, 'rb') as f:
 for line in f:
  m.update(line)
  md5code = m.hexdigest()
  return md5code

 # 开发那边对md5的算法进行了优化,当文件的大小小于1M时,直接通过getmd5方法去获取文件的md5值;
 # 当文件大于1M时,通过截取整个文件中的某几个片段,然后拼接成一个文件,再去获取其md5值,最后删除这个文件
 def md5(self,path):
  if self.size < 1024 * 1024:
   return self.getmd5(path)
  f = open(path, 'rb')
  f.seek(0, 0)
  data = f.read(2012)
  f.seek(int(self.size / 2) - 1999, 0)
  data += f.read(1999)
  f.seek(-2010, 2)
  data += f.read(2010)
  f.close()
  path = 'D:/copy_' + str(os.path.basename(path))
  f = open(path, 'wb')
  f.write(data)
  f.close()
  val = self.getmd5(path)
  os.remove(path)
  return val

3. 调用文件上传接口:


def uploading(self, chunkIndex):
  MD5 = self.md5(self.path) # 整个文件的md5
  start = (chunkIndex - 1) * self.CHUNK_SIZE # 截取文件的起始位置
  end = min(self.size, start + self.CHUNK_SIZE)# 截取文件的结束位置
  f = open(self.path, 'rb')
  f.seek(start)
  data = f.read(end) # 待分片上传的数据
  f.close()
  path1 = 'D:/copy_' + str(os.path.basename(self.path)) # 将该数据保存在本地
  f = open(path1, 'wb')
  f.write(data)
  f.close()
  chunk_md5 = self.md5(path1) # 读取分片上传数据的md5
  # 将所有的数据储存在files字典当中,利用requests的files传输数据
  # 使用requests files类型时,要像下面一样构建参数,不然会有错误
  files={
   'chunk':('blob',data,'application/octet-stream'),
   'name':(None,self.name),
   'ext':(None,self.ext),
   'index':(None,chunkIndex),
   'total': (None,self.totalchunk),
   'size': (None,self.size),
   'chunk_md5': (None,chunk_md5),
   'md5': (None,MD5),
  }
  # 使用requests发送接口请求
  res = self.request.send('post', 'https://10.104.17.222/bank/elements/uploading', verify=False, files=files)
  os.remove(path1) # 删除存在本地的分片文件
  return res.json()

4. 循环调用文件上传接口以完成所有分片的上传:


chunkIndex = 1
 while chunkIndex <= totalchunk:
 res2 = upload.uploading(chunkIndex)
 chunkIndex += 1

5. 从服务器读取通过接口上传文件的MD5值,并与预期值进行比对,判断上传是否正确。

测试总结

以上即为本文的全部内容,希望对读者学习有所帮助,也欢迎大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表