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()