zoukankan      html  css  js  c++  java
  • 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:jmxapplyCertapplyCertP.jmx"
    
    JMETER_Home = r'''"D:Program Filesapache-jmeterinjmeter.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 Filesapache-jmeterin,就因为这个就碰到两个坑

      一、路径包含空格,识别不了可执行的程序命令

           解决办法:命令要用“”引号包起来

      二、执行命令识别不了Jmeter,即便将JMETER_Home加入path,或者用cd 命令进入JMETER_Home也无效。

      解决办法:控制台用cmd命令执行。如"cmd.exe /c {JMETER_Home} -n -t {tmpjmxfile} -l {csvfilename} -e -o {htmlreportpath}"

      效果如下:

      

     

     

  • 相关阅读:
    第一个WPF
    redis pub/sub 发布订阅
    php中header函数后是否应该有exit
    redis的图形界面管理工具
    redis key和value数据类型
    螺旋式打印一个二维数组
    jquery 提示插件 cluetip
    php异常处理
    ruby Methods, Procs, Lambdas, and Closures
    ruby迭代器iterator和枚举器Enumerator
  • 原文地址:https://www.cnblogs.com/yicaifeitian/p/7159305.html
Copyright © 2011-2022 走看看