当前位置: 首页 > 后端技术 > Python

性能工具Jmeterscriptpythonstart

时间:2023-03-25 22:54:51 Python

背景上一节是一个启动Jmeter的shell命令,担心大家对shell脚本的语法不是很熟悉,如果自定义自己想要的,可能不太容易实现do,这次改用python启动脚本,在改造之前,大家先了解一下Jmeter线程组的相关参数,对大家修改脚本会有帮助。知识点Pythonos,sys,file模块函数Jmeter执行方法[jmeter-n-t[jmx文件]-l[结果文件]-e-o[web报告文件夹路径]]下面是线程组样式解释名称:ThreadGroup线程组的名称,可以根据项目名来定义Comments:备注,描述计划的目的ActiontotakenafteraSamplererror如果请求失败,接下来会采取什么动作continue继续执行下一个操作startNextThreadLoop执行下一个线程循环StopThead停止线程,不对线程执行任何操作StopTest等待线程完成采样,结束整个测试,不立即停止StopTestNow停止整个测试计划ThreadProperites:线程属性NumberofThreads(users):线程数,即虚拟用户数。Ramp-uoPeriod(inseconds):控制虚拟用户的启动时间。LoopCount:控制执行次数。Infinite如果勾选表示无线执行,主要配合下面的DurationSameuseroneachiteration:每次迭代使用相同的用户DelayThreadcreationuntilneeded延迟线程创建直到需要NumberofThreads*LoopCount就是Sampler的在查看结果树中可以看到执行次数。specifythreadlifetime:设置执行时间Duration(seconds):请求的执行时间,与(LoopCount'sInfinite)配合使用Startupdelay(seconds):延迟时间,工作中很少用到。python启动Jmeter脚本python基础复习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():运行shellcommandos.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):将工作目录更改为dirnameos.path.isdir(name):判断name是否为目录,如果不是,则返回falseos.path.isfile(name):判断名为name的文件是否存在,返回falseos。path.exists(name):判断文件或目录是否存在nameos.path.getsize(name):获取文件大小,如果name是目录则返回0Los.path.abspath(name):获取绝对路径os.path.isabs():判断是否为绝对路径os.path.normpath(path):标准化路径字符串形式os.path.split(name):拆分文件名和目录os.path.splitext():分离文件名称和扩展名os.path.join(path,name):连接目录和文件名或目录os.path.basename(path):返回文件名os.path.dirname(path):返回文件路径打开文件函数reviewwithopen(filename,'operationtype')asf:f.read()open(filename,operationtype)f.readlines()readswithrand()readline()readlines()seek...等同上面基础知识,现在开始分析Python启动Jmeter脚本获取脚本路径,通过命令打开文件替换jmeter脚本中的线程数、步长、执行时间,重命名脚本通过执行jmeter脚本命令行脚本参考代码#--coding:utf-8--#@Time:2019/12/1122:07#@Author:liwen406#@Email:Jmeter启动脚本#@File:startJmeter.pyimportos,sysdefjmeterNumber(caseName,num_threads,ramp_time,duration,remark,hostIps='127.0.0.1'):''':paramcaseName:脚本名称:paramnum_threads:线程数:paramramp_time:控制线程步骤:paramduration:执行时间:paramremark:flag:paramhostIps:加载参数:return:启动JMeter成功'''ifcaseNameisNone:return"testcaseisempty"ifnum_threadsisNone:return"虚拟并发数为空"iframp_timeisNone:return"teststepisempty"ifdurationisNone:return"executiontimeisempty"#执行脚本名称runJmeterFile='%s_%s_%s_%s_%s'%(caseName,num_threads,ramp_time,duration,remark)print("executenamescript:%s"%runJmeterFile)thisdir=os.getcwd()#originalscriptnewdir=os.path.join(thisdir,"testscript",caseName+".jmx")print("当前脚本路径:%s"%newdir)ifnotos.path.exists(newdir):print('脚本不存在!请检查脚本')returnFalse#保存测试结果路径resultFile=os.帕th.join(thisdir,'result',runJmeterFile)print("Scriptexecutionpath:",resultFile)#如果不存在则判断结果路径是否存在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')#打开你要写入的文件forsinlines:fp.write(s.replace('num_threads">1','num_threads">%s'%num_threads)#替换并发数.replace('ramp_time">1','ramp_time">%s'%ramp_time)#替换步骤Long.replace('scheduler">false','scheduler">true')#检查判断时间end.replace('duration">','duration">%s'%duration)#替换执行时间。replace('name="LoopController.loops">1','name="LoopController.loops">-1'))#查看判断结束的时间fp.close()os.chdir(resultFile)print("Currentpath:",os.getcwd())#查看环境变量ifisEvn():#判断分布式执行方式iflen(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)defisEvn():'''检查环境变量:返回:True/Fals'''cmd='jmeter-v'lin=os.popen(cmd)foriinlin:if'TheApacheSoftwareFoundation'ini:print("Jmeter环境变量配置成功")returnTrueelse:print("Jmeter环境变量配置失败")returnFalseifname=='__main__':#分布式ip写入,多个逗号分隔hostIps='127.0.0.1'iflen(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执行Jmeter脚本需要和Jmeter脚本达成协议,这样我们才能通过python脚本来执行我们的Jmeter测试脚本。xml中脚本中:执行结果Hmtml上报参数传递说明:pythonstartJmeter.pytiaoshi2130pythontiaoshipython表示通过python脚本语言执行startJmeter.py,tiaoshi表示启动脚本名2表示并发数1执行stepsize30表示Executiontimepythontiaoshi是一个注释,方便一个脚本被执行多次,每次执行的结果在替换脚本之前替换。替换脚本后,win环境下当前运行的是脚本当前运行目录。如果在linux中执行,相信应该是可以的。linux里面也有python环境,不过这次是使用python3来执行的。如果是linux下的python2,需要修改相应的位置才能执行。如果你喜欢shell启动,可以参考性能工具Jmeter使用shell启动来做性能测试。执行脚本是一项体力劳动,对于重复性的工作量,如何能够将体力劳动的时间用脚本语言来代替,这样我们就可以把更多的时间花在刀刃上。读累了,读一读我们中学的古文:不积小流,则不成江海。奔马不能一跃十步;粗马能骑十次,功德无穷。持之以恒,朽木不折;持之以恒,金石可雕。蚯蚓没有利爪和牙齿的锋利,却有强壮的肌肉和骨骼。它们以上面的泥土为食,喝下面的泉水。螃蟹有六个膝盖和两个爪子。他们不是蛇和鳗鱼的洞穴,没有任何依托。他们也不安分。