背景
上一节是 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:备注信息,形容该打算的目标
Action to be taken after a Sampler error
如果申请失败后,接下来执行什么动作
continue 继续执行接下来的操作
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 启动 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(): 运行 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 这个文件是否存在,不存在返回 false
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): 返回文件门路
关上文件函数温习
with open(文件名, ‘ 操作类型 ’) as f: f.read()
open(文件名,操作类型) f.readlines()
读取形式有
rand()
readline()
readlines()
seek
…. 等等
有下面基础知识,当初开始剖析 python 启动 Jmeter 脚本
获取脚本门路,通过命令关上文件
替换 jmeter 脚本中的线程数,步长、执行工夫内容,并且重命名脚本
通过命令行执行 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 测试脚本。
xml 中
脚本中:
执行后果
Hmtml 报表
传参阐明:
python startJmeter.py tiaoshi 2 1 30 pythontiaoshi
python 示意通过 python 脚本语言执行
startJmeter.py 示意启动脚本名字
tiaoshi 示意 Jmeter 脚本名字
2 示意并发数
1 执行步长
30 示意执行工夫
pythontiaoshi 示意备注,不便一个脚本屡次执行好别离每次执行的后果
替换前脚本
替换后脚本
目前操作目录
总结
目前该脚本在 win 环境中行,如果放到 Linux 中去执行置信应该是能够的,应 Linux 中也有 python 环境,不过本次应用的是 python3 执行,如果再 Linux 中是 python2 须要批改相应地位即可执行,如果喜爱 shell 启动的能够参考性能工具之 Jmeter 应用 shell 启动
做性能测试执行脚本是个体力活,怎么节约体力活的工夫,能够通过脚本语言把反复的工作量替换,这样咱们能够把更多工夫用到刀刃上。
看累了读一读咱们中学的古文:
《劝学》
积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明得意,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;持之以恒,金石可镂。蚓无帮凶之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。