小贞贞jmeter基于python的分布式
Posted 小贞贞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小贞贞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_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
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".\\test_plan\\pressure_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_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()
以上是关于小贞贞jmeter基于python的分布式的主要内容,如果未能解决你的问题,请参考以下文章
小贞贞python关于requests和tkinter模块项目实战