性能工具之 JMeter 使用 Python 脚本快速执行

简介: 性能工具之 JMeter 使用 Python 脚本快速执行

一、前言

上篇文章 性能工具之 JMeter 使用 shell 脚本快速执行 中介绍了 shell 命令快速启动 Jmeter,担心大家对 shell 脚本语法不是很熟悉,如果定制自己想要的恐怕不好弄,这次改用 Python 启动脚本,在改造之前大家先了解下 JMeter 线程组相关参数,这样对大家改造脚本有一定帮助。

二、预备知识

1、Python 基础知识

Python 中 os、sys、file 模块函数

os 模块函数:

  • os.sep: 取代操作系统特定的路径分隔符
  • os.name: 指示你正在使用的工作平台。
  • os.getcwd: 得到当前工作目录,即当前 python 脚本工作的目录路径。
  • os.getenv()和os.putenv: 分别用来读取和设置环境变量
  • os.listdir(): 返回指定目录下的所有文件和目录名
  • os.remove(file): 删除一个文件
  • os.stat(file): 获得文件属性
  • os.chmod(file): 修改文件权限和时间戳
  • os.mkdir(name): 创建目录
  • os.rmdir(name): 删除目录
  • os.removedirs: 删除多个目录
  • os.system(): 运行 shell 命令
  • os.exit(): 终止当前进程
  • os.linesep: 给出当前平台的行终止符。
  • os.path.split(): 返回一个路径的目录名和文件名
  • os.path.isfile() 和 os.path.isdir() 分别检验给出的路径是一个目录还是文件
  • os.path.existe(): 检验给出的路径是否真的存在
  • os.listdir(dirname): 列出 dirname 下的目录和文件
  • os.getcwd(): 获得当前工作目录
  • os.curdir: 返回当前目录('.')
  • os.chdir(dirname): 改变工作目录到 dirname
  • os.path.isdir(name): 判断 name 是不是目录,不是目录就返回 false
  • os.path.isfile(name): 判断 name 这个文件是否存在,不存在返回f alse
  • os.path.exists(name): 判断是否存在文件或目录 name
  • os.path.getsize(name): 获得文件大小,如果 name 是目录返回 0L
  • os.path.abspath(name): 获得绝对路径
  • os.path.isabs(): 判断是否为绝对路径
  • os.path.normpath(path): 规范 path 字符串形式
  • os.path.split(name): 分割文件名与目录
  • os.path.splitext(): 分离文件名和扩展名
  • os.path.join(path,name): 连接目录与文件名或目录
  • os.path.basename(path): 返回文件名
  • os.path.dirname(path): 返回文件路径

file 模块函数:

  • 打开文件函数:
    • with open( 文件名, '操作类型' ) as f: f.read()
    • open(文件名,操作类型) f.readlines()
  • 读取方式有:
    • rand()
    • readline()
    • readlines()
    • seek
    • ....等等

2、JMeter 基础知识

JMeter 执行方式:

jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]

以下是线程设置:
image.png

参数说明:

  • Name :Thread Group 线程组的名称,可以根据项目名称定义
  • Comments :备注信息,描述该计划的目的
  • Action to be taken after a Sampler error:假如请求失败后,接下来执行什么动作
    • ontinue:继续执行接下来的操作
    • start Next ThreadLoop:执行下一个线程循环
    • Stop Thead:停止该该线程,不在执行该线程的任何操作
    • Stop Test:等待该线程的采样结束后,结束整个测试,不会立即停止
    • Stop TestNow:停止整个测试计划
  • Thread Properites:线程属性
    • Number of Threads(users):线程数,也就虚拟用户数
    • Ramp-uo Period(in seconds):控制虚拟用户启动时间
    • Loop Count:控制执行次数。Infinite 假如勾选表示无线执行,它主要与后面的 Duration 配合使用
    • Same user on each iteration :每次迭代使用相同的用户
    • Delay Thread creation until needed:将线程创建延迟到需要的时候
    • Number of Threads * Loop Count:就是 Sampler 执行的次数,可以在 View Results Tree 中看到
      • specify thread lifetime: 设置执行时间
      • Duration(seconnds): 请求的执行时间,它与(Loop Count 的 Infinite)配合使用
      • Startup delay(seconds):延迟时间,工作中很少用

三、Python 脚本

1、主要步骤

  • 获取脚本路径,通过命令打开文件
  • 替换 JMeter 脚本中的线程数,步长、执行时间内容,并且重命名脚本
  • 通过命令行执行 JMeter 脚本

2、参考代码

# -*- coding: utf-8 -*-
# @Time    : 2019/12/11 22:07
# @Author  : 7FGroup
# @name   : Jmeter启动脚本
# @File    : startJmeter.py
import os, sys

def jmeterNumber(caseName, num_threads, ramp_time, duration, remark, hostIps='127.0.0.1'):

    '''
    :param caseName: 脚本名字
    :param num_threads: 线程数
    :param ramp_time: 控制线程步长
    :param duration: 执行时间
    :param remark: 标志
    :param hostIps: 负载参数
    :return: 启动JMeter成功
    '''

    if caseName is None:
        return "测试用例为空"
    if num_threads is None:
        return "虚拟并发数为空"
    if ramp_time is None:
        return "测试步骤为空"
    if duration is None:
        return "执行时间为空"

    # 执行脚本名字
    runJmeterFile = '%s_%s_%s_%s_%s' % (caseName, num_threads, ramp_time, duration, remark)
    print("执行名字脚本:%s" % runJmeterFile)
    thisdir = os.getcwd()

    # 原始脚本
    newdir = os.path.join(thisdir, "testscript", caseName + ".jmx")
    print("当前脚本路径: %s" % newdir)
    if not os.path.exists(newdir):
        print('脚本不存在!请检查脚本')
        return False

    # 保存测试结果路径
    resultFile = os.path.join(thisdir, 'result', runJmeterFile)
    print("脚本执行路径: ", resultFile)

    # 判断结果路径是否存在
    if not os.path.exists(resultFile):
        os.makedirs(resultFile)

    lines = open(newdir, encoding="utf-8").readlines()
    fp = open(os.path.join(thisdir, "result", resultFile, runJmeterFile) + '.jmx', 'w')  # 打开你要写得文件
    for s in lines:
        fp.write(s.replace('num_threads">1</stringProp>', 'num_threads">%s</stringProp>' % num_threads)  # 替换并发数
                    .replace('ramp_time">1</stringProp>', 'ramp_time">%s</stringProp>' % ramp_time)  # 替换步长
                    .replace('scheduler">false</boolProp>', 'scheduler">true</boolProp>')  # 勾选通过时间判断结束
                    .replace('duration"></stringProp>', 'duration">%s</stringProp>' % duration)  # 替换执行时间
                    .replace('name="LoopController.loops">1</stringProp>',
                            'name="LoopController.loops">-1</stringProp>'))  # 勾选通过时间判断结束

    fp.close()
    os.chdir(resultFile)
    print("当前路径: ", os.getcwd())

    # 检查环境变量
    if isEvn():
        # 判断分布式执行方式
        if len(hostIps.split(",")) > 2:
            # 根据自己需求添加执行类型
            Rcmd = 'jmeter -n -t %s.jmx -R %s -l %s.jtl -j %s.log' % (
                runJmeterFile, hostIps, runJmeterFile, runJmeterFile)

            # Rcmd = 'jmeter -n -t %s.jmx -R %s -l %s.jtl -j %s.log -e -o %s' % (runJmeterFile, hostIps, runJmeterFile, runJmeterFile, runJmeterFile)
            print('执行命令:%s' % Rcmd)
            # os.system(Rcmd)
        else:
            # 不生成html报告
            # cmd = 'jmeter -n -t %s.jmx -l %s.jtl -j %s.log' % (runJmeterFile, runJmeterFile, runJmeterFile, runJmeterFile)
            # 自动生成html报表
            cmd = 'jmeter  -n -t %s.jmx -l %s.jtl -j %s.log -e -o %s' % (
                runJmeterFile, runJmeterFile, runJmeterFile, runJmeterFile)
            print('执行命令:%s' % cmd)
            os.system(cmd)

def isEvn():

    '''
    检查环境变量
    :return: True/Fals
    '''

    cmd = 'jmeter -v'
    lin = os.popen(cmd)
    for i in lin:
        if 'The Apache Software Foundation' in i:
            print("Jmeter环境变量配置成功")
            return True
    else:
        print("Jmeter环境变量配置失败")
        return False

if __name__ == '__main__':
    # 分布式ip写法,多个使用逗号隔开
    hostIps = '127.0.0.1'
    if len(sys.argv[1:]) == 5:
        print('参数个数为:', len(sys.argv), '个参数。')
        print('可用参数列表:', str(sys.argv[1:]))
        param = sys.argv[1:]
        print("脚本名字: %s,并发数: %s,步长: %s,执行时间: %s,备注: %s" % (param[0], param[1], param[2], param[3], param[4]))
        jmeterNumber(param[0], param[1], param[2], param[3], param[4], hostIps)
    else:
        print("参数不对")
    pass

上面脚本注释的很清楚,相信大家一看就知道怎么修改参数,上面脚本可以个参考,大家可以根据实际情况修改参数,达到自己预期结果。

四、使用说明

传参说明:

python startJmeter.py tiaoshi 2 1 30 pythontiaoshi
  • Python:表示通过 Python 脚本语言执行
  • startJmeter.py:表示启动脚本名字
  • tiaoshi:表示 JMeter 脚本名字
  • 2:表示并发数
  • 1:执行步长
  • 30:表示执行时间
  • pythontiaoshi:表示备注,方便一个脚本多次执行好分别每次执行的结果

使用 Python 执行 JMeter 脚本需要与 JMeter 脚本有约定,这样才能通过 python 脚本去执行咱们的 JMeter 测试脚本。

image.png

xml 中:
image.png

脚本中:
image.png

执行结果:
image.png

HTML 报表:
image.png

替换前脚本:
image.png

替换后脚本:
image.png

操作目录:
image.png

五、总结

该脚本支持 Win/Linux 环境,如果喜欢 shell 脚本的可以参考上文,做性能测试执行脚本是个体力活,怎么节约体力活的时间,可以通过脚本语言把重复的工作量替换,这样咱们可以把更多时间用到刀刃上。

源码地址:

目录
相关文章
|
2天前
|
JavaScript 前端开发 Android开发
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
34 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
1月前
|
测试技术 数据库 Python
Python装饰器实战:打造高效性能计时工具
在数据分析中,处理大规模数据时,分析代码性能至关重要。本文介绍如何使用Python装饰器实现性能计时工具,在不改变现有代码的基础上,方便快速地测试函数执行时间。该方法具有侵入性小、复用性强、灵活度高等优点,有助于快速发现性能瓶颈并优化代码。通过设置循环次数参数,可以更准确地评估函数的平均执行时间,提升开发效率。
106 61
Python装饰器实战:打造高效性能计时工具
|
4天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
23 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
4天前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
29 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
18天前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
97 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
1月前
|
数据可视化 算法 数据挖掘
Python时间序列分析工具Aeon使用指南
**Aeon** 是一个遵循 scikit-learn API 风格的开源 Python 库,专注于时间序列处理。它提供了分类、回归、聚类、预测建模和数据预处理等功能模块,支持多种算法和自定义距离度量。Aeon 活跃开发并持续更新至2024年,与 pandas 1.4.0 版本兼容,内置可视化工具,适合数据探索和基础分析任务。尽管在高级功能和性能优化方面有提升空间,但其简洁的 API 和完整的基础功能使其成为时间序列分析的有效工具。
80 37
Python时间序列分析工具Aeon使用指南
|
1月前
|
存储 算法 Serverless
剖析文件共享工具背后的Python哈希表算法奥秘
在数字化时代,文件共享工具不可或缺。哈希表算法通过将文件名或哈希值映射到存储位置,实现快速检索与高效管理。Python中的哈希表可用于创建简易文件索引,支持快速插入和查找文件路径。哈希表不仅提升了文件定位速度,还优化了存储管理和多节点数据一致性,确保文件共享工具高效运行,满足多用户并发需求,推动文件共享领域向更高效、便捷的方向发展。
|
2月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
2月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
2月前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
126 80

热门文章

最新文章

推荐镜像

更多