性能工具之 JMeter 使用 Python 脚本快速执行
文章目录
- 一、前言
- 二、预备知识
- 1、Python 基础知识
- 2、JMeter 基础知识
- 三、Python 脚本
- 1、主要步骤
- 2、参考代码
- 四、使用说明
- 五、总结
一、前言
上篇文章 性能工具之 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]
以下是线程设置:
参数说明:
- 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, sysdef 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 Trueelse:print("Jmeter环境变量配置失败")return Falseif __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 测试脚本。
xml 中:
脚本中:
执行结果:
HTML 报表:
替换前脚本:
替换后脚本:
操作目录:
五、总结
该脚本支持 Win/Linux 环境,如果喜欢 shell 脚本的可以参考上文,做性能测试执行脚本是个体力活,怎么节约体力活的时间,可以通过脚本语言把重复的工作量替换,这样咱们可以把更多时间用到刀刃上。
源码地址:
- https://github.com/zuozewei/blog-example/tree/master/Performance-testing/01-test-tool/jmeter/startJmeter
相关系列:
- 性能工具之 JMeter 使用 shell 脚本快速执行
- 性能工具之 JMeter 使用 Python 脚本快速执行
性能工具之 JMeter 使用 Python 脚本快速执行相关推荐
- python:通过python脚本快速执行 bash 命令
* git镇楼:git config --global core.filemode false* 实践出真知.虽然这个脚本代码量不大,但是也是经过3次修改才达到预期效果的. * 第一次写的时候,凭逻辑 ...
- jmeter脚本_性能工具之Jmeter脚本python启动
背景 上一节是shell命令启动Jmeter,担心大家对shell脚本语法不是很熟悉,如果定制自己想要的恐怕不好弄,这次改用python启动脚本,在改造之前大家先了解下Jmeter线程组相关参数,这样 ...
- 性能工具之Jmeter脚本python启动
背景 上一节是shell命令启动Jmeter,担心大家对shell脚本语法不是很熟悉,如果定制自己想要的恐怕不好弄,这次改用python启动脚本,在改造之前大家先了解下Jmeter线程组相关参数,这样 ...
- python快速入门答案-总算懂得python脚本快速入门教程
PyQt5是基于Digia公司强大的图形程式框架Qt5的python接口,由一组python模块构成.PyQt5本身拥有超过620个类和6000函数及方法.在可以运行于多个平台.PyQt5拥有双重协议 ...
- python编程怎么建立工程_教你如何用Python脚本快速创建项目
相信初学Cocos2D者对Python还很陌生,今天本篇教程教你如何用Python脚本快速创建项目. 在Cocos2d-x2.1.4以上的版本中,取消了使用vs模版创建项目的方法,开始使用python ...
- python脚本教程-总算懂得python脚本快速入门教程
PyQt5是基于Digia公司强大的图形程式框架Qt5的python接口,由一组python模块构成.PyQt5本身拥有超过620个类和6000函数及方法.在可以运行于多个平台.PyQt5拥有双重协议 ...
- Python 脚本如何执行另一个脚本
关于Python 脚本如何执行另一个脚本,可以使用os.system()来实现 os.system()的参数: 执行的命令 +执行的内容 举例说明: (1)显示当前文件夹下的全部目录和文件夹 os.s ...
- 接口测试(apipost、jmeter和python脚本)
一.什么是接口 接口就是内部模块对模块,外部系统对其他服务提供的一种可调用或者连接的能力的标准,就好比usb接口,他是系统向外接提供的一种用于物理数据传输的一个接口,当然仅仅是一个接口是不能进行传输的 ...
- python脚本中执行另一个脚本_如何用python调用另一个python脚本?
如果想要将已经设置好的内容,在转移到另一个位置要怎么做呢?小编能写到的方法有,照抄,复制,以及转移使用.在我们日常办公上是非常好理解的,就是ctr v,但是如果想在编程上,将某一位置拿去到别的项目上使 ...
最新文章
- .NET开发环境MonoDevelop 2.2 发布
- l3fwd 是什么_服务器DPDK l3fwd性能测试
- 在html中超链接_HTML 超级链接详细讲解
- node.js mysql 不退出_node.js,node-mysql_使用了node-mysql的代码无法自动停止,node.js,node-mysql - phpStudy...
- Vue-cli项目中路由的基础用法,以及路由嵌套
- 【重构之法】代码的坏味道
- 同一机器部署多个JVM
- python读取dicom序列_python读取dicom图像(SimpleITK和dicom包实现)
- 西门子g120c面板参数设定_西门子PCS7模拟量单位设置
- MS Expression Web中的Asp.net mvc(和其他网络编辑工具)
- sdut 2878 圆圈
- 20190906 On Java8 第十八章 字符串
- mysql允许远程访问的用户
- 【CometOJ】CometOJ#8 解题报告
- 近乎 5.3 发布,SNS 社区系统
- 张大哥笔记-有哪些可傻瓜式建站的开源网站程序
- 连接动态链接库时找不到链接库的解决办法
- 服务器上什么叫节点位置,服务器中内存和节点什么意思
- ACL——拒绝源地址
- 3. 布莱叶盲文与二进制码