背景
     上一节是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启动

      做性能测试执行脚本是个体力活,怎么节约体力活的工夫,能够通过脚本语言把反复的工作量替换,这样咱们能够把更多工夫用到刀刃上。

看累了读一读咱们中学的古文:

                                 《劝学》

         积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明得意,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;持之以恒,金石可镂。蚓无帮凶之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。