上篇文章 性能工具之 JMeter 使用 shell 脚本快速执行
中介绍了 shell 命令快速启动 Jmeter,担心大家对 shell 脚本语法不是很熟悉,如果定制自己想要的恐怕不好弄,这次改用 Python 启动脚本,在改造之前大家先了解下 JMeter 线程组相关参数,这样对大家改造脚本有一定帮助。
Python 中 os、sys、file 模块函数
os 模块函数:
file 模块函数:
JMeter 执行方式:
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
以下是线程设置:
参数说明:
Thread Group
线程组的名称,可以根据项目名称定义Action to be taken after a Sampler error
:假如请求失败后,接下来执行什么动作
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)
:延迟时间,工作中很少用# -*- coding: utf-8 -*- # @Time : 2019/12/11 22:07 # @Author : 7FGroup # @name : 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 startJmeter.py tiaoshi 2 1 30 pythontiaoshi
startJmeter.py
:表示启动脚本名字使用 Python 执行 JMeter 脚本需要与 JMeter 脚本有约定,这样才能通过 python 脚本去执行咱们的 JMeter 测试脚本。
xml 中:
脚本中:
执行结果:
HTML 报表:
替换前脚本:
替换后脚本:
操作目录:
该脚本支持 Win/Linux 环境,如果喜欢 shell 脚本的可以参考上文,做性能测试执行脚本是个体力活,怎么节约体力活的时间,可以通过脚本语言把重复的工作量替换,这样咱们可以把更多时间用到刀刃上。
相关系列: