Python调Jmeter执⾏参数化jmx脚本
  本渣使⽤python已久,⼀直响应“Life is short, use Python”(⼈⽣苦短,我⽤python)这句话号召。⽤着久了,真会变“懒“,但凡是⼿⼯处理的任务,都想使⽤python脚本替代。
  烦透了jmeter输⼊如下⿁命令:
  Jmeter -n -t {tmpjmxfile} -l {csvfilename} -e -o {htmlreportpath}
尤其是{htmlreportpath}这个⽂件夹路径,没有这个⽂件夹⼜不会⾃动创建,有的话⼜必须为空。经常要给⽂件夹、⽂件命名,⽽且命名⼜没什么规范,乱七⼋糟的。
  于是想着,即便是⽤python帮我创建⽂件夹,帮我⽣成命令,也是好的。
精益求精,做着做着,就会想着,⼲脆把命令也给执⾏了,于是就有这样的产出。
  使⽤场景:
    1.需要不断的运⾏性能测试脚本,摸底,取数。如线程数、循环次数。
    2.需要等待较长时间的
  话不多说,直接来段代码:
  python版本=3.6.1
# coding=utf-8
import os
import subprocess
import time
from string import Template
currpath = os.path.dirname(alpath(__file__))
JmxTemlFileName = r"F:\jmx\applyCert\applyCertP.jmx"
JMETER_Home = r'''"D:\Program Files\apache-jmeter\bin\jmeter.bat"'''
def getDateTime():
'''
获取当前⽇期时间,格式'20150708085159'
'''
return time.strftime(r'%Y%m%d%H%M%S', time.localtime(time.time()))
def execcmd(command):
print(f"command={command}")
output = subprocess.Popen(
command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True,
universal_newlines=True)
stderrinfo, stdoutinfo = outputmunicate()
print(f"stderrinfo={stderrinfo}")
print(f"stdoutinfo={stdoutinfo}")
print("returncode={0}".urncode))
def execjmxs(Num_Threads, Loops):
tmpstr = ''
with open(JmxTemlFileName, "r", encoding="utf-8") as file:
tmpstr = ad()).safe_substitute(
num_threads=Num_Threads,
loops=Loops
)
now = getDateTime()
tmpjmxfile = currpath + r"/T{0}XL{1}{2}.jmx".format(
Num_Threads, Loops, now)
with open(tmpjmxfile, "w+", encoding="utf-8") as file:
file.writelines(tmpstr)
csvfilename = currpath + "/result{0}.csv".format(now)
htmlreportpath = currpath + "/htmlreport{0}".format(now)
writelines使用方法python
if not ists(htmlreportpath):
os.makedirs(htmlreportpath)
execjmxouthtml = /c {JMETER_Home} -n -t {tmpjmxfile} -l {csvfilename} -e -o {htmlreportpath}"
execcmd(execjmxouthtml)
jobs = [dict(Num_Threads=x*10, Loops=1000) for x in range(2, 21)]
[execjmxs(x["Num_Threads"], x["Loops"]) for x in jobs]
  Jmx⽂本模板需要参数化,如图:
  期间,碰到的坑如下,如命令⾏执⾏Jmeter -n -t {tmpjmxfile} -l {csvfilename} -e -o {htmlreportpath}命令,由于本渣的 JMETER_Home =D:\Program Files\apache-jmeter\bin,就因为这个就碰到两个坑
  ⼀、路径包含空格,识别不了可执⾏的程序命令
解决办法:命令要⽤“”引号包起来
  ⼆、执⾏命令识别不了Jmeter,即便将JMETER_Home加⼊path,或者⽤cd 命令进⼊JMETER_Home也⽆效。
  解决办法:控制台⽤cmd命令执⾏。如" /c {JMETER_Home} -n -t {tmpjmxfile} -l {csvfilename} -e -o {htmlreportpath}"
  效果如下: