2016-03-15 150 views
3

我试图直接从Java代码运行JMeter测试。负载应该通过JMeter服务器产生。在代码中,我使用连接到服务器上运行的JMeter守护进程的ClientJMeterEngine实例。这工作到目前为止,我可以开始并运行我的测试。我目前不了解的是如何在测试结果完成后从测试结果中获得结果。我当前的代码如下所示:从Java中的JMeter远程测试中获得结果

// 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。

虽然这感觉有点“哈克”。有人在这里有更好的解决方案吗?

+0

好吧在某个远程存根上调用它从某处获得的东西。我不知道JMeter远程处理,但你显然确实导出了一个远程对象并提供了它的存根,并且随后未导出它。或者JMeter做到了。 – EJP

回答

0

我有同样的问题,并尝试用重写ResultCollector类的testEnded()方法的解决方案。我的测试无休止地等待远程JMeter从服务器的响应。

实际的问题是,远程服务器 - 从服务器在初始阶段成功地响应来自主服务器的请求。但是,连接在某个时候下降,测试完成而没有收到来自Slave的任何报告。从站无法启动新的TCP连接,并且在准备好测试报告时无法发送结果,因为其主机名(IP)尚未正确设置/发送给主站。

因此,解决方法是在命令行或jmeter.properties中使用正确的参数启动从站。

我开始了我的奴隶这样的:

C:\ JMeter_new \ Apache的JMeter的-3.1 \ BIN> JMeter的服务器-Djava.rmi.server.hostname = IP

其中IP是的与参数从

PS:如果您在GUI测试,运行法师还有:

d:\ JMeter_new \ Apache的JMeter的-3.1 \ BIN> jmeterw -Djava.rmi.server.hostname = IP_of_master