在Java中获取JMeter远程测试结果

4

我正试图直接从我的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”。有人有更好的解决方案吗?

1
好吧,它正在调用某个远程存根上的某些东西,这些东西来自某个地方。我对JMeter远程操作一无所知,但您显然导出了一个远程对象并提供了它的存根,随后又取消了导出。或者是JMeter这样做的。 - user207421
1个回答

0

我遇到了同样的问题,并尝试使用重写 ResultCollector 类的 testEnded() 方法的解决方案。我的测试一直在等待远程 JMeter 从服务器的响应。

实际问题是:远程服务器 - 从节点 - 在早期阶段成功地回复了主节点的请求。但是,连接在某个时刻断开,测试完成时没有从从节点接收到任何报告。从节点无法启动新的 TCP 连接,并且无法在准备好测试报告后发送结果,因为它的主机名(IP)未正确设置/发送给主节点。

因此,解决方案是以正确的参数在命令行或 jmeter.properties 中启动从节点。

我是这样启动从节点的:

c:\JMeter_new\apache-jmeter-3.1\bin>jmeter-server -Djava.rmi.server.hostname=IP

其中 IP 是从节点的 IP。

如果您在 GUI 中运行测试,请同时使用参数运行主节点:

D:\JMeter_new\apache-jmeter-3.1\bin>jmeterw -Djava.rmi.server.hostname=IP_of_master


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接