AG广东会,山东十一选五,大发

?
  • AG广东会400电话
  • 微网小程序
  • AI电话山东十一选五
  • 电商代运营
  • AG广东会,山东十一选五,大发:全 部 栏 目

    AG广东会400电话 网络优化推广 AI电话山东十一选五 呼叫中心 网站建设 商标?知产 微网小程序 电商运营 彩铃?短信 增值拓展业务
    Jmeter并发执行Python 脚本的完整流程

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

    1. 前言

    大家好,我是安果!

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

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

    2. Python 实现文件上传

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

    AG广东会,山东十一选五,大发:2-1获取文件信息及切片数目

    首先,获取文件的大小

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

    最后,获取文件名及 md5 值

    import os
    import math
    import hashlib
    
    def 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, suffix
    
    def 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

    AG广东会,山东十一选五,大发:2-2切片及分段上传

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

    import requests
    
    def 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开始
            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)

    AG广东会,山东十一选五,大发: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).text
            print(resp)

    AG广东会,山东十一选五,大发: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
    
    @echo off
    set filepath=%1
    
    python  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 数据文件,设置文件格式为 UTF-8,变量名称设置为file_path,最后将线程共享模式设置为「当前线程组」

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

    4. 最后

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

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

    到此这篇关于Jmeter并发执行 Python 脚本的问题详解的文章就介绍到这了,更多相关Jmeter并发执行 Python 脚本内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Jmeter并发执行Python 脚本的完整流程
    • python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
    • Jmeter调用Python脚本实现参数互相传递的实现
    • 基于Python组装jmx并调用JMeter实现压力测试
    • python利用JMeter测试Tornado的多线程
    • python Django编写接口并用Jmeter测试的方法
    上一篇:关于Python中的 oct 函数与 min 函数
    下一篇:详解Pandas与openpyxl库的超强结合
  • 相关文章
  • ?

    ? 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Jmeter并发执行Python 脚本的完整流程 Jmeter,并发,执行,Python,脚本,

    AG广东会官网入口(中国)官方网站-IOS/Android通用版(2026已更新)