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(os.path.realpath(__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 = output.communicate()
    print(f"stderrinfo={stderrinfo}")
    print(f"stdoutinfo={stdoutinfo}")
    print("returncode={0}".format(output.returncode))


def execjmxs(Num_Threads, Loops):
    tmpstr = ''
    with open(JmxTemlFileName, "r", encoding="utf-8") as file:
        tmpstr = Template(file.read()).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)
    if not os.path.exists(htmlreportpath):
        os.makedirs(htmlreportpath)
    execjmxouthtml = f"cmd.exe /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命令執行。如"cmd.exe /c {JMETER_Home} -n -t {tmpjmxfile} -l {csvfilename} -e -o {htmlreportpath}"

  效果如下:

  

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM