天天看点

性能工具之Jmeter脚本python启动

背景

     上一节是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]】

性能工具之Jmeter脚本python启动

Name :Thread Group 线程组的名称,可以根据项目名称定义

Comments :备注信息,描述该计划的目的

假如请求失败后,接下来执行什么动作

continue 继续执行接下来的操作

start Next ThreadLoop 执行下一个线程循环

Stop Thead 停止该该线程,不在执行该线程的任何操作

Stop Test 等待该线程的采样结束后,结束整个测试,不会立即停止

Stop TestNow 停止整个测试计划

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 中看到。

Duration(seconnds): 请求的执行时间,它与(Loop Count 的 Infinite)配合使用

Startup delay(seconds):延迟时间,工作中很少用。

python启动Jmeter脚本

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脚本

脚本参考代码

<code># -*- coding: utf-8 -*-</code>

<code># @Time : 2019/12/11 22:07</code>

<code># @Author : liwen406</code>

<code># @Email : Jmeter启动脚本</code>

<code># @File : startJmeter.py</code>

<code>import os, sys</code>

<code>def jmeterNumber(caseName, num_threads, ramp_time, duration, remark, hostIps='127.0.0.1'):</code>

<code>'''</code>

<code>:param caseName: 脚本名字</code>

<code>:param num_threads: 线程数</code>

<code>:param ramp_time: 控制线程步长</code>

<code>:param duration: 执行时间</code>

<code>:param remark: 标志</code>

<code>:param hostIps: 负载参数</code>

<code>:return: 启动JMeter成功</code>

<code>if caseName is None:</code>

<code>return "测试用例为空"</code>

<code>if num_threads is None:</code>

<code>return "虚拟并发数为空"</code>

<code>if ramp_time is None:</code>

<code>return "测试步骤为空"</code>

<code>if duration is None:</code>

<code>return "执行时间为空"</code>

<code># 执行脚本名字</code>

<code>runJmeterFile = '%s_%s_%s_%s_%s' % (caseName, num_threads, ramp_time, duration, remark)</code>

<code>print("执行名字脚本:%s" % runJmeterFile)</code>

<code>thisdir = os.getcwd()</code>

<code># 原始脚本</code>

<code>newdir = os.path.join(thisdir, "testscript", caseName + ".jmx")</code>

<code>print("当前脚本路径: %s" % newdir)</code>

<code>if not os.path.exists(newdir):</code>

<code>print('脚本不存在!请检查脚本')</code>

<code>return False</code>

<code># 保存测试结果路径</code>

<code>resultFile = os.path.join(thisdir, 'result', runJmeterFile)</code>

<code>print("脚本执行路径: ", resultFile)</code>

<code># 判断结果路径是否存在</code>

<code>if not os.path.exists(resultFile):</code>

<code>os.makedirs(resultFile)</code>

<code>lines = open(newdir, encoding="utf-8").readlines()</code>

<code>fp = open(os.path.join(thisdir, "result", resultFile, runJmeterFile) + '.jmx', 'w') # 打开你要写得文件</code>

<code>for s in lines:</code>

<code>fp.write(s.replace('num_threads"&gt;1&lt;/stringProp&gt;', 'num_threads"&gt;%s&lt;/stringProp&gt;' % num_threads) # 替换并发数</code>

<code>.replace('ramp_time"&gt;1&lt;/stringProp&gt;', 'ramp_time"&gt;%s&lt;/stringProp&gt;' % ramp_time) # 替换步长</code>

<code>.replace('scheduler"&gt;false&lt;/boolProp&gt;', 'scheduler"&gt;true&lt;/boolProp&gt;') # 勾选通过时间判断结束</code>

<code>.replace('duration"&gt;&lt;/stringProp&gt;', 'duration"&gt;%s&lt;/stringProp&gt;' % duration) # 替换执行时间</code>

<code>.replace('name="LoopController.loops"&gt;1&lt;/stringProp&gt;',</code>

<code>'name="LoopController.loops"&gt;-1&lt;/stringProp&gt;')) # 勾选通过时间判断结束</code>

<code>fp.close()</code>

<code>os.chdir(resultFile)</code>

<code>print("当前路径: ", os.getcwd())</code>

<code># 检查环境变量</code>

<code>if isEvn():</code>

<code># 判断分布式执行方式</code>

<code>if len(hostIps.split(",")) &gt; 2:</code>

<code># 根据自己需求添加执行类型</code>

<code>Rcmd = 'jmeter -n -t %s.jmx -R %s -l %s.jtl -j %s.log' % (</code>

<code>runJmeterFile, hostIps, runJmeterFile, runJmeterFile)</code>

<code># Rcmd = 'jmeter -n -t %s.jmx -R %s -l %s.jtl -j %s.log -e -o %s' % (runJmeterFile, hostIps, runJmeterFile, runJmeterFile, runJmeterFile)</code>

<code>print('执行命令:%s' % Rcmd)</code>

<code># os.system(Rcmd)</code>

<code>else:</code>

<code># 不生成html报告</code>

<code># cmd = 'jmeter -n -t %s.jmx -l %s.jtl -j %s.log' % (runJmeterFile, runJmeterFile, runJmeterFile, runJmeterFile)</code>

<code># 自动生成html报表</code>

<code>cmd = 'jmeter -n -t %s.jmx -l %s.jtl -j %s.log -e -o %s' % (</code>

<code>runJmeterFile, runJmeterFile, runJmeterFile, runJmeterFile)</code>

<code>print('执行命令:%s' % cmd)</code>

<code>os.system(cmd)</code>

<code>def isEvn():</code>

<code>检查环境变量</code>

<code>:return: True/Fals</code>

<code>cmd = 'jmeter -v'</code>

<code>lin = os.popen(cmd)</code>

<code>for i in lin:</code>

<code>if 'The Apache Software Foundation' in i:</code>

<code>print("Jmeter环境变量配置成功")</code>

<code>return True</code>

<code>print("Jmeter环境变量配置失败")</code>

<code>if __name__ == '__main__':</code>

<code># 分布式ip写法,多个使用逗号隔开</code>

<code>hostIps = '127.0.0.1'</code>

<code>if len(sys.argv[1:]) == 5:</code>

<code>print('参数个数为:', len(sys.argv), '个参数。')</code>

<code>print('可用参数列表:', str(sys.argv[1:]))</code>

<code>param = sys.argv[1:]</code>

<code>print("脚本名字: %s,并发数: %s,步长: %s,执行时间: %s,备注: %s" % (param[0], param[1], param[2], param[3], param[4]))</code>

<code>jmeterNumber(param[0], param[1], param[2], param[3], param[4], hostIps)</code>

<code>print("参数不对")</code>

<code>pass</code>

     上面脚本注释的很清楚,相信大家一看就知道怎么修改参数,上面脚本可以个参考,大家可以根据实际情况修改参数,达到自己预期结果。

      使用python执行Jmeter脚本需要与Jmeter脚本有约定,这样才能通过python脚本去执行咱们的Jmeter测试脚本。

性能工具之Jmeter脚本python启动
性能工具之Jmeter脚本python启动
性能工具之Jmeter脚本python启动
性能工具之Jmeter脚本python启动
性能工具之Jmeter脚本python启动

python startJmeter.py tiaoshi 2 1 30 pythontiaoshi

python表示通过python脚本语言执行

startJmeter.py 表示启动脚本名字

tiaoshi 表示Jmeter脚本名字

2 表示并发数

1 执行步长

30 表示执行时间

pythontiaoshi 表示备注,方便一个脚本多次执行好分别每次执行的结果

替换前脚本

性能工具之Jmeter脚本python启动

替换后脚本

性能工具之Jmeter脚本python启动

目前操作目录

性能工具之Jmeter脚本python启动

总结

       目前该脚本在 win 环境中行,如果放到Linux中去执行相信应该是可以的,应Linux中也有python环境,不过本次使用的是python3执行,如果再Linux中是python2需要修改相应位置即可执行,如果喜欢shell启动的可以参考​​性能工具之Jmeter使用shell启动​​

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

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

                                 《劝学》

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