性能工具之Jmeter脚本python启动

Posted 高楼(Zee)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了性能工具之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启动_Jmeter\'

解释

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

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

Action to be taken after a Sampler error

  • continue 继续执行接下来的操作
  • 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):延迟时间,工作中很少用。
python启动Jmeter脚本

python基础知识复习

  • 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脚本
脚本参考代码
  1. # -*- coding: utf-8 -*-
    
    # @Time : 2019/12/11 22:07
    
    # @Author : liwen406
    
    # @Email : 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执行Jmeter脚本需要与Jmeter脚本有约定,这样才能通过python脚本去执行咱们的Jmeter测试脚本。

 

\'性能工具之Jmeter脚本python启动_Jmeter_02\'

xml中

\'性能工具之Jmeter脚本python启动_Jmeter_03\'

脚本中:

\'性能工具之Jmeter脚本python启动_Jmeter_04\'

执行结果

\'性能工具之Jmeter脚本python启动_Jmeter_05\'

Hmtml报表

\'性能工具之Jmeter脚本python启动_Jmeter_06\'

传参说明:

python startJmeter.py tiaoshi 2 1 30 pythontiaoshi

  • python表示通过python脚本语言执行
  • startJmeter.py 表示启动脚本名字
  • tiaoshi 表示Jmeter脚本名字
  • 2 表示并发数
  • 1 执行步长
  • 30 表示执行时间
  • pythontiaoshi 表示备注,方便一个脚本多次执行好分别每次执行的结果

 

替换前脚本

\'性能工具之Jmeter脚本python启动_python_07\'

 

替换后脚本

\'性能工具之Jmeter脚本python启动_python_08\'

 

目前操作目录

\'性能工具之Jmeter脚本python启动_Jmeter_09\'

 

总结

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

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

 

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

                                 《劝学》

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

以上是关于性能工具之Jmeter脚本python启动的主要内容,如果未能解决你的问题,请参考以下文章

性能工具之Jmeter使用shell启动

性能工具之 Jmeter 通过 SpringBoot 工程启动

性能工具之 Jmeter 通过 SpringBoot 工程启动

性能工具之 Jmeter 通过 SpringBoot 工程启动

性能工具之 JMeter 使用 shell 脚本快速执行

性能工具之 JMeter 上传与下载脚本编写