我正试图直接从我的Java代码运行JMeter测试。负载应该通过JMeter服务器产生。在代码中,我使用一个ClientJMeterEngine实例连接到运行在服务器上的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。
虽然这感觉有点“hacky”。有人有更好的解决方案吗?