针对Jmeter用java做二次开发支持多人并发运行

本文介绍了如何通过Java对JMeter进行二次开发,以支持多人并发执行测试计划。讨论了三种并发运行的方式,包括独立客户端、主从模式,并详细讲解了如何通过代码实现远程调用,以及解决远程运行后的一系列问题,如监听服务器状态、控制测试计划运行位置、手动停止服务等。文章还提到了在多线程组运行时回调请求的处理和生成测试报告的时机控制。
摘要由CSDN通过智能技术生成

背景:本次是为了支持多人同时运行,互不干扰的场景
为了满足这个场景需要解决一系列问题

1、什么机制支持多人同时运行?

为了获取答案,尝试了很多方式

第一个方式:2个独立jmeter客户端分别运行

场景:在同一个服务器上安装2个jmeter,当触发2个测试计划时分别执行2个不同的jmeter。
结论:当运行2个测试计划时,jtl报告虽然会生成2个独立的测试报告,但依旧以最后执行完的时间点同时生成2个测试报告,实际上依旧没有做到互补干扰。

第二个方式:1个master客户端,2个不同服务器上的远程server

场景:在不同的服务器上安装2个jmeter,分别启动jmeter-server服务,端口一致,默认1099端口,通过一个master控制2个server运行
首先,master的jmeter.properties修改如下:

remote_hosts=172.16.1.209:1099,172.16.3.250:1099
server_port=1099
server.rmi.port=1099
server.rmi.localport=1099
server.rmi.ssl.disable=true

远程服务的server的jmeter.properties配置如下:

server.rmi.ssl.disable=true

分别在server端开启服务:
./jmeter-server -D java.rmi.server.hostname=172.16.13.48
结论:远程的请求方式会生成2个独立的jtl文件,并按照各自的测试计划结束,可以互相独立,但需要将所有的参数化csv文件在所有服务器上同步,那么同一个服务上是否可以启动多个server来实现。

第三个方式:1个master客户端,2个相同的服务器上的远程server

场景:在同一个服务器上安装2个jmeter,分别启动jmeter-server服务,端口区分,通过1个master控制2个server
首先,master的jmeter.properties修改如下:

remote_hosts=172.16.1.209:1009,172.16.1.209:1029
server_port=1009
server.rmi.port=1009
server.rmi.localport=1009
server.rmi.ssl.disable=true

远程服务的server的jmeter.properties配置如下:

remote_hosts=172.16.1.209
server_port=1029
server.rmi.port=1029
server.rmi.localport=1029
server.rmi.ssl.disable=true

分别在server端开启服务:
在jmeter 1开启服务:./jmeter-server -D java.rmi.server.hostname=172.16.13.48 -Dserver_port=1009 &
在jmeter 2开启服务:./jmeter-server -D java.rmi.server.hostname=172.16.13.48 -Dserver_port=1029 &
结论:远程的请求方式会生成2个独立的jtl文件,并按照各自的测试计划结束,可以互相独立。以上方案可行。

踩过的坑:
server.rmi.ssl.disable=true 这个一定要设置,否则报错exception is:java.io.FileNotFoundException:rmi_keystore.jks(系统找不到指定的文件)”错误

2、如何通过代码在实现远程调用?

既然在已经知道用远程请求可以实现,那么代码要如何实现呢?
为了获取答案,尝试了很多方式

第一个方式:通过java调用cmd命令行方式,执行远程命令

结论:需要确保代码生成的jmx文件可以执行运行,很遗憾,这个成本过高,而且也不是首选。

第二个方式:ClientJMeterEngine 类

ClientJMeterEngine clientJMeterEngine= new DistributedRunner(“ip:port”);
clientJMeterEngine.configure(testPlanTree);
clientJMeterEngine.runTest();
结论:使用ClientJMeterEngine通过不同的ip和端口的确可以发起远程请求

第三个方式:DistributedRunner 类

ReportGenerator reportGenerator = new ReportGenerator(logFile, logger);
testPlanTree.add(testPlanTree.getArray()[0], new RemoteThreadsListenerTestElement());
List engines = new LinkedList<>();
ListenToTest testListener = new ListenToTest(
TestPlanLauncher.ListenToTest.RunMode.REMOTE, true, reportGenerator);
DistributedRunner distributedRunner = new DistributedRunner(remoteProps);
distributedRunner.setStdout(System.out); // NOSONAR
distributedRunner.setStdErr(System.err); // NOSONAR
testPlanTree.add(testPlanTree.getArray(), logger);
distributedRunner.init(hosts, testPlanTree);
engines.addAll(distributedRunner.getEngines());
testListener.setStartedRemoteEngines(engines);
distributedRunner.start(hosts);
startUdpDdaemon(hosts, engines);
结论:使用DistributedRunner通过不同的ip和端口的确可以发起远程请求,那么DistributedRunner和ClientJMeterEngine有什么区别呢?
通过查看jmeter源代码,发现DistributedRunner调用的ClientJMeterEngine,所以底层还是ClientJMeterEngine,所以我们还是选用Distr

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值