获取Java中JMeter远程测试的结果
我试图直接从Java代码运行JMeter测试。应该通过JMeter服务器生成负载。在代码中,我使用了一个ClientJMeterEngine实例,该实例连接到服务器上运行的JMeter守护进程。到目前为止,我可以启动并运行我的测试。我目前不明白的是,在测试完成后如何从测试运行中获得结果。我当前的代码如下所示:获取Java中JMeter远程测试的结果,java,callback,jmeter,rmi,Java,Callback,Jmeter,Rmi,我试图直接从Java代码运行JMeter测试。应该通过JMeter服务器生成负载。在代码中,我使用了一个ClientJMeterEngine实例,该实例连接到服务器上运行的JMeter守护进程。到目前为止,我可以启动并运行我的测试。我目前不明白的是,在测试完成后如何从测试运行中获得结果。我当前的代码如下所示: // create ClientJMeterEngine instance ClientJMeterEngine jmeter = new ClientJMeterEngine("myHo
// create ClientJMeterEngine instance
ClientJMeterEngine jmeter = new ClientJMeterEngine("myHost:4000");
// load test
File file = new File("C:/myTest.jmx");
// configure test
HashTree testPlanTree = SaveService.loadTree(file);
jmeter.configure(testPlanTree);
// run test
jmeter.runTest();
如果我使用StandardJMeterEngine对象运行测试,我将使用ResultCollector从测试运行中获取结果。这正如预期的那样有效。当我尝试使用所描述的基于服务器的方法运行测试时,在运行服务器的机器上会出现以下异常:
2016/03/15 09:24:35 ERROR - jmeter.samplers.BatchSampleSender: testEnded(host) java.rmi.ConnectException: Connection refused to host: myHost; nested exception is:
java.net.ConnectException: Connection refused
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:631)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:228)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:214)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:238)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:190)
at com.sun.proxy.$Proxy1.processBatch(Unknown Source)
因此,服务器希望回调我从中启动测试运行的客户机。它失败了,因为我没有任何东西等待远程呼叫。我已经研究了JMeter源代码,但还没有找到答案,我需要在Java方面做些什么才能使它工作
编辑
与此同时,我取得了一些进展。我的发现如下:
客户端线程必须保持运行状态,以便客户端上的ResultCollector可以从服务器接收结果。现在,我通过在客户端Java代码中“忙着等待”来实现这一点。
现在的问题是要知道服务器上的测试执行何时完成,这样我也可以完成客户端线程。ResultCollector确实具有识别测试完成的功能,但没有用于此的公共方法。
解决方案是扩展ResultCollector并重写testEnded方法:此方法将公共布尔变量“testFinished”设置为true
虽然这感觉有点“黑”。这里有谁有更好的解决方案吗?我也遇到了同样的问题,并用覆盖ResultCollector类的testEnded()方法尝试了您的解决方案。我的测试无休止地等待来自远程JMeter从属服务器的响应 实际问题是远程服务器-从服务器-在早期阶段成功地响应了来自主服务器的请求。但是,连接在某个点断开,测试在没有从从属服务器收到任何报告的情况下完成。从属服务器无法启动新的TCP连接,并且在准备好测试报告时无法发送结果,因为其主机名(IP)未正确设置/发送给主服务器 因此,解决方案是在命令行或jmeter.properties中使用正确的参数启动从机 我是这样开始我的奴隶的:
// create ClientJMeterEngine instance
ClientJMeterEngine jmeter = new ClientJMeterEngine("myHost:4000");
// load test
File file = new File("C:/myTest.jmx");
// configure test
HashTree testPlanTree = SaveService.loadTree(file);
jmeter.configure(testPlanTree);
// run test
jmeter.runTest();
c:\JMeter\u new\apache-JMeter-3.1\bin>JMeter服务器-Djava.rmi.server.hostname=IP
其中IP是从机的IP地址
PS如果在GUI中运行测试,请使用以下参数运行Master:
D:\JMeter\u new\apache-JMeter-3.1\bin>jmeterw-Djava.rmi.server.hostname=IP\u of_master它在某个远程存根上调用它从某个地方得到的东西。我不知道JMeter远程处理,但您显然导出了一个远程对象,并提供了它的存根,然后取消了它的导出。或者杰米特做到了。