1. 前言

大家好,我是测试君!

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

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

2. Python 实现文件上传

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

  • 获取文件信息及切片数目
  • 分段切片,并上传 - API
  • 文件合并 - API
  • 文件路径参数化

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

首先,获取文件的大小

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

最后,获取文件名及 md5 值

import os
import math
import 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_sizeelse:partSize = chunk_size# 文件偏移量offset = index * chunk_size# 生成分片id,从1开始chunk_id = index + 1print('开始准备上传文件')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).textprint(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).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)# 合并fileApi.merge_file(filepath)

3. Jmeter 并发执行

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

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

# cmd.bat@echo off
set filepath=%1python  C:\Users\xingag\Desktop\rpc_demo\fileupload.py %*

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

# 准备多个文件路径(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,最后将线程共享模式设置为「 当前线程组 」

  • 添加调试取样器,方便调试

  • 添加 OS 进程取样器

选择上面创建的批处理文件,命令行参数设置为「 ${file_path} 」

  • 添加查看结果数

4. 最后

运行上面创建的 Jmeter 并发流程,在结果数中可以查看并发上传文件的结果

当然,我们可以增加并发数量去模拟真实的使用场景,只需要修改 CSV 数据源及 Jmeter 参数即可

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

最后: 可以关注公众号:伤心的辣条 ! 进去有许多资料共享!资料都是面试时面试官必问的知识点,也包括了很多测试行业常见知识,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!


好文推荐

转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!

面试经:一线城市搬砖!又面软件测试岗,5000就知足了…

面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…

什么样的人适合从事软件测试工作?

那个准点下班的人,比我先升职了…

测试岗反复跳槽,跳着跳着就跳没了…

聊聊 Jmeter 如何并发执行 Python 脚本相关推荐

  1. Pytest如何并发执行自动化脚本

    [原文链接]Pytest如何并发执行自动化脚本 当自动化脚本数量非常多的时候,全量脚本的执行耗时很长,此时就希望自动化脚本能够并发执行,第三方插件pytest-xdist 能很好的支持此功能,pyte ...

  2. mac上使用crontab周期性执行python脚本

    这个月买了本书<Linux系统命令及Shell脚本实践指南>, 看到了一个周期性执行任务cron.顿时产生一个想法: mac上有这种机制么? 加上自己也在15年下半年也学了点python脚 ...

  3. 使用sae定时执行Python脚本

    使用sae定时执行Python脚本 使用sae定时执行Python脚本 12,May,2014 | 57 Views 毕设压力略大,必须是桂林游的锅.去之前放松了几天,回来又休闲了几天,加上桂林的一周 ...

  4. python运维脚本部署jdk_Jenkins自动执行Python脚本,并输出测试报告

    这段时间,在家时间自由(除了睡觉8小时,其他时间都在工作和学习),有大把的时间实操练习一些硬技能: 今天,更新一篇利用Jenkins这套框架,调用Python自动化脚本,并输出测试报告的手把手实操文章 ...

  5. python 任务计划_windows 10 设定计划任务自动执行 python 脚本的方法

    我用 python 写了一些脚本,有一些是爬虫脚本,比如爬取知乎特定话题的热门问题,有一些是定期的统计分析脚本,输出统计结果到文档中.之前我都是手动执行这些脚本,现在我希望如何这些脚本能自动定时执行. ...

  6. python能在excel运行吗-使用PyXLL在Excel中执行Python脚本

    PyXLL是一款能够使得在Excel中能够执行Python脚本的插件,不过它是使用Excel扩展库(XLL)的方式,这跟平常加载一些常用的宏方式是一样的. 使用pyXLL,首先你必须安装Python, ...

  7. contOS crontab 定时执行python脚本

    contOS crontab 定时执行python脚本 安装crontab yum install crontabs crontab语法 常用系统命令 ntsysv //查看系统开机启动项 chkco ...

  8. python脚本调度程序_Windows 任务调度程序定时执行Python脚本

    Windows 任务调度程序(Task Scheduler)可以定时执行程序,本文分享使用Task Scheduler定时执行Python脚本的两种方法. 在控制面版->管理员工具中打开 Tas ...

  9. python为运行为何出现乱码_解决执行python脚本出现乱码的问题

    解决执行python脚本出现乱码的问题 发布时间:2020-08-11 09:19:22 来源:亿速云 阅读:111 作者:小新 小编给大家分享一下解决执行python脚本出现乱码的问题,相信大部分人 ...

最新文章

  1. Android Dialog 弹出的时候标题栏闪烁一下的处理方法
  2. 女士细线毛衣起多少针_潇洒帅气的男童V领开襟毛衣编织,带教程图解
  3. AI版「盗梦空间」?谷歌大脑「世界模型」可实现在其梦境中对智能体进行训练
  4. 怎么提高大表和小表的连接查询效率?
  5. 前端开源项目周报0425
  6. 最强Transformer发布!谷歌大脑提出ViT-G:缩放视觉Transformer,高达90.45%准确率!
  7. 供应链 信用管理 大数据_以“大数据”引领农产品供应链变革,推动农产品供应链智能化发展...
  8. 大剑无锋之Hadoop的三个作业调度器【面试推荐】
  9. 大数据财税与python应用_大数据跟python
  10. windows键按了没反应_windows快捷键使用 - 小怜
  11. Linux中点号,星号,加号,问号实战
  12. 【飞秋】存储过程与业务类实现业务的差异比较
  13. 方便好用的接口协作工具
  14. 微信自动抢红包软件被判赔 475 万;日本科学家打破网速全球纪录;JavaScript蝉联最受欢迎编程语言|极客头条...
  15. apache ab测试与centos系统优化
  16. 微信小程序API之getLocal
  17. ORB_SLAM2之Pangolin的安装与问题处理
  18. iis6扩展php_教你IIS6的PHP最佳配置方法
  19. MIF/MID数据格式说明
  20. Ineligible Devices 不被识别的设备

热门文章

  1. shared_ptr使用场景、陷阱、性能分析,使用建议
  2. centos mysql开发包_CentOS 7 安装 MySQL-阿里云开发者社区
  3. 冒泡排序代码_凡人能看懂的冒泡排序和快速排序(附动态图和代码详解))
  4. Java多线程详解(线程不安全案例)
  5. c语言人事管理系统,c语言人事管理系统
  6. 计算机word实训项目任务说明,计算机项目实训报告怎么写啊
  7. 如何使用 Buildah 构建容器镜像
  8. 交换技术及其具体应用
  9. nginx配置url重定向-反向代理
  10. 集中云数据加密能否填补安全漏洞?