小贞贞jmeter基于python的分布式

白昼怎懂夜的黑 提交于 2019-12-05 19:17:17

jmeter进行分布式压力测试:所谓分布式,即一台作为控制机,去控制其他多台负载机一起去运行我们的测试脚本,最终对我们的被测系统产生压力

本期python脚本实现:

1.从excel表中读取配置的执行时间、线程数、IP和端口等

2.拼接命令 jmeter -n -t jmx脚本的路径 -R负载机的ip:端口,负载机的IP:端口  -J脚本中设置的关于线程数变量  -J脚本中设置的启动时间变量  -l 测试结果路径 -e -o 测试html报告路径

例如:

jmeter -n -t .\jmeter_script\TCtestcase_xn\TC_testscript.jmx -R10.5.32.XX:1099,10.5.32.XX:1099 -Jthread_num=30 -Jrunup_time=2 -Jrun_time=10 -l .\test_result\test_jtl\test2019-11-27-11-36-24.jtl -e -o .\test_result\test_html\HTML2019-11-27-11-36-24


一:环境准备

环境:linux服务器

控制机  负载机:都为Windows  

确保:控制机与负载机在同一个网段,即IP前三位需要相同 ,要求能相互ping通

环境准备:

1.负载机和控制机安装相同版本的JDK(1.8版本及以上) 和相同版本的jmeter,最好放在同一个路径下

2.负载机和控制机配置JDK的jmeter的环境变量

3.环境变量配置完成后,在cmd 中输入: java -version 能够查看JDK的版本 ,在cmd中输入:jmeter 能够正确打开jmeter,则表明环境配置成功

4.在控制机和负载机的相同目录下放入要运行的测试脚本,脚本中如引用了CSV文件等,需要写绝对路径,不然运行结果会为空

控制机修改:

1.修改jmeter目录中bin/jmeter.properties文件的如下内容:

remote_host:填入负载机的IP,可以多台,端口可都为1099,格式是ip:端口,IP:端口,ip:端口 , 备注:控制机也可作为负载机,填入负载机的ip和端口,

server_port:填入1099

 

 

 

继续修改该文件下的如下内容: 

server.rmi.ssl.disable=true

language=zh_CN

jmeter.save.saveservice.label=true

jmeter.save.saveservice.response_code=true

jmeter.save.saveservice.response_data=true

jmeter.save.saveservice.response_message=true
jmeter.save.saveservice.successful=true
jmeter.save.saveservice.thread_name=true
jmeter.save.saveservice.time=true

jmeter.save.saveservice.latency=true

jmeter.save.saveservice.samplerData=true
jmeter.save.saveservice.responseHeaders=true

jmeter.save.saveservice.bytes=true

jmeter.save.saveservice.thread_counts=true

jmeter.save.saveservice.timestamp_format=ms
jmeter.save.saveservice.timestamp_format=yyyy/MM/dd HH:mm:ss.SSS

sampleresult.timestamp.start=true

负载机修改:

1.修改jmeter目录中bin/jmeter.properties文件的如下内容:

server.rmi.ssl.disable=true

二、脚本执行

1.所有的负载机打开 jmeter目录bin/jmeter-server.bat文件(右键管理员打开)

打开的cmd窗口中显示出了该机器的ip和端口

 

 

 2.在cmd中运行脚本 

 jmeter -n -t jmx脚本的路径 -R负载机的ip:端口,负载机的IP:端口  -J脚本中设置的关于线程数变量  -J脚本中设置的启动时间变量  -l 测试结果路径 -e -o 测试html报告路径

第二次运行该命令时要注意 修改jtl结果文件和测试报告的名称,不然jtl结果会叠加,html文件会提示重复或目录不为空


3. 在cmd中运行脚本由于每次需要修改文件名称非常的不方便,所有与python脚本集成,每次能够动态的生成不同名称的测试结果和测试报告

具体的python代码如下:

该段代码实现:

1.在一个excel表手动填入需要的线程数、启动时间、执行时间、执行机器数、控制机的ip和端口

2.python脚本读取该Excel文件

3.在jmeter脚本中,通过Tools--函数助手,选择__p函数,通过下图的步骤生成变量,主要是用于后期命令的调用,避免每次运行脚本都需要打开jmeter进行修改这些参数

 

 

 

 

 

 

 

 

3.在我们的Excel中配置要运行的线程数、启动时间、执行时间、执行机数、IP 端口

4.python脚本去读取以上的Excel,然后拼接成一个命令,然后执行该命令

 

 

 

import osimport timefrom openpyxl import load_workbook#读取配置的excelwb = load_workbook(r".\test_plan\pressure_schedule.xlsx")sheet = wb.worksheets[0]row = sheet.max_rowcolumn = sheet.max_columndef file_msg():    for i in range(row-1):        thread_info = sheet.cell(i + 2, 3).value        runup_info = sheet.cell(i + 2, 4).value        time_info = sheet.cell(i + 2, 5).value        ip_num = sheet.cell(i + 2, 6).value        now = time.strftime("%Y-%m-%d-%H-%M-%S")        ip_msg1 = ""        for m in range(ip_num):            ip = sheet.cell(i + 2, 7 + int(m) * 2).value            port = sheet.cell(i + 2, 8 + int(m) * 2).value            str_msg = str(ip)+":"+str(port)            ip_msg1 = ip_msg1+str_msg+","        ip_msg2 = " -R"+ip_msg1        ip_msg = ip_msg2[:-1]        print(ip_msg)#拼接jmeter命令       exect = "jmeter  -n -t "\            + r".\jmeter_script\TCtestcase_xn\TC_testscript.jmx"\            +ip_msg\            +" -Jthread_num="+str(thread_info)+" -Jrunup_time="+str(runup_info)\            +" -Jrun_time="+str(time_info)+" -l "\            +r".\test_result\test_jtl\test"+now+".jtl"\            + r" -e -o "+r".\test_result\test_html\HTML" +now#执行命令
    os.system(exect)
print(exect)wb.close()#调用该方法file_msg()
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!