上一节是shell命令启动Jmeter,担心大家对shell脚本语法不是很熟悉,如果定制自己想要的恐怕不好弄,这次改用python启动脚本,在改造之前大家先了解下Jmeter线程组相关参数,这样对大家改造脚本有一定帮助。
python中os、sys、file模块函数
Jmeter 执行方式【jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]】
Name :Thread Group 线程组的名称,可以根据项目名称定义
Comments :备注信息,描述该计划的目的
假如请求失败后,接下来执行什么动作
有上面基础知识,现在开始分析python启动Jmeter脚本
# -*- coding: utf-8 -*-
# @Time : 2019/12/11 22:07
# @Author : liwen406
# @Email : 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执行Jmeter脚本需要与Jmeter脚本有约定,这样才能通过python脚本去执行咱们的Jmeter测试脚本。
python startJmeter.py tiaoshi 2 1 30 pythontiaoshi
目前该脚本在 win 环境中行,如果放到Linux中去执行相信应该是可以的,应Linux中也有python环境,不过本次使用的是python3执行,如果再Linux中是python2需要修改相应位置即可执行,如果喜欢shell启动的可以参考性能工具之Jmeter使用shell启动
做性能测试执行脚本是个体力活,怎么节约体力活的时间,可以通过脚本语言把重复的工作量替换,这样咱们可以把更多时间用到刀刃上。
看累了读一读咱们中学的古文:
《劝学》
积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。