小贞贞jmeter基于python的分布式

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

本期python脚本实现:

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

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

例如:

jmeter -n -t .jmeter_scriptTCtestcase_xnTC_testscript.jmx -R10.5.32.XX:1099,10.5.32.XX:1099 -Jthread_num=30 -Jrunup_time=2 -Jrun_time=10 -l . est_result est_jtl est2019-11-27-11-36-24.jtl -e -o . est_result est_htmlHTML2019-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

2.新增system.properties:

java.net.preferIPv4Stack=true

3.修改jmeter.bat

set JVM_ARGS="-Djava.net.preferIPv4Stack=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 os
import time
from openpyxl import load_workbook
#读取配置的excel
wb = load_workbook(r". est_planpressure_schedule.xlsx")
sheet = wb.worksheets[0]
row = sheet.max_row
column = sheet.max_column
def 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_scriptTCtestcase_xnTC_testscript.jmx"
+ip_msg
+" -Jthread_num="+str(thread_info)+" -Jrunup_time="+str(runup_info)
+" -Jrun_time="+str(time_info)+" -l "
+r". est_result est_jtl est"+now+".jtl"
+ r" -e -o "+r". est_result est_htmlHTML" +now
#执行命令
    os.system(exect)

print(exect)
wb.close()
#调用该方法
file_msg()
原文地址:https://www.cnblogs.com/xiaozhenzhen/p/11941168.html