2016-03-15 135 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