我正在嘗試使用JMeter對在雲中運行的應用程序進行基準測試。底層協議使用websockets,但我需要使用一些專有庫來進行這些調用。我看了一些JMeter的websocket插件。但是,不僅僅是測試,我希望使用JMeter能夠爲我的服務器分佈負載生成的能力。我想用我自己的客戶端(用Java編寫)來實現服務器的實際請求。這有些可能嗎?JMeter自定義Java客戶端測試Websocket應用程序
0
A
回答
2
有WebSocket的客戶端API的不同實現,即Jetty Websocket API或Java API for WebSocket
最近我一直在研究如何能的WebSockets使用JMeter Load Testing Cloud Solution進行測試。請看下面的概念細節證明。它使用的是JavaSamplerClient API,因此將擴展打包爲.jar並放在JMeter Classpath下將作爲Java請求採樣器提供。
首先您需要Tyrus - 開源JSR-356實現。 Tyrus需要Java 7,因此請確保使用Java SE 7構建和執行擴展。越來越依賴的最方便的方法是使用下面的Apache Maven配置文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>blazemeter-websocket</groupId>
<artifactId>blazemeter-websocket</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-client-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.tyrus</groupId>
<artifactId>tyrus-client</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.tyrus</groupId>
<artifactId>tyrus-container-grizzly</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>javax.json</groupId>
<artifactId>javax.json-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.0.1</version>
</dependency>
</dependencies>
</project>
Invokation目標的「MVN依賴性:複製依賴」會下載所有需要的jar到/ target /依賴性文件夾中。不過你可以繼續構建,打包等maven插件。
來源擴展的代碼如下:
package com.blazemeter;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;
import org.glassfish.tyrus.client.ClientManager;
import javax.websocket.*;
import java.io.IOException;
import java.net.URI;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@ClientEndpoint
public class BlazemeterWebsocketRequest extends AbstractJavaSamplerClient {
private static String ws_uri;
private static String ws_message;
private static String response_message;
private static CountDownLatch latch;
private static final Logger log = LoggingManager.getLoggerForClass();
@Override
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("URI", "ws://echo.websocket.org");
params.addArgument("Message", "Blazemeter rocks!");
return params;
}
@Override
public void setupTest(JavaSamplerContext context) {
ws_uri = context.getParameter("URI");
ws_message = context.getParameter("Message");
}
@Override
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
SampleResult rv = new SampleResult();
rv.sampleStart();
latch = new CountDownLatch(1);
ClientManager client = ClientManager.createClient();
try {
client.connectToServer(BlazemeterWebsocketRequest.class, new URI(ws_uri));
latch.await(1L, TimeUnit.SECONDS);
} catch (Throwable e) {
throw new RuntimeException(e);
}
rv.setSuccessful(true);
rv.setResponseMessage(response_message);
rv.setResponseCode("200");
if (response_message != null) {
rv.setResponseData(response_message.getBytes());
}
rv.sampleEnd();
return rv;
}
@OnOpen
public void onOpen(Session session) {
log.info("Connected ... " + session.getId());
try {
session.getBasicRemote().sendText(ws_message);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@OnMessage
public String onMessage(String message, Session session) {
log.info("Received ... " + message + " on session " + session.getId());
response_message = message;
try {
session.close(new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE,""));
} catch (IOException e) {
e.printStackTrace();
}
return response_message;
}
@OnClose
public void onClose(Session session, CloseReason closeReason) {
log.info(String.format("Session %s close because of %s", session.getId(), closeReason));
}
}
希望這有助於
D.
相關問題
- 1. 自定義Web服務來測試Android客戶端應用程序
- 2. 負載測試Java客戶端服務器應用程序
- 3. 負載測試的Java客戶端/服務器應用程序
- 4. Junit測試Java EE應用程序客戶端
- 5. WebSocket流客戶端應用程序的Java/JVM或Node.js/V8?
- 6. Qooxdoo測試json rpc javascript websocket客戶端
- 7. 客戶端自定義驗證程序
- 8. 使用Apache HTTP客戶端自定義重試處理程序?
- 9. 需要Java websocket客戶端
- 10. Java(Android)WebSocket客戶端庫
- 11. 客戶端的iPad應用程序自定義系統
- 12. Facebook Android客戶端自定義應用程序通知
- 13. Akka HTTP客戶端websocket流的定義
- 14. 單元測試使用JUnit的自定義ElasticSearch客戶端
- 15. 測試遠程客戶端 - 服務器應用程序
- 16. Java opc客戶端應用程序
- 17. Java獨立客戶端應用程序
- 18. 保護客戶端Java應用程序
- 19. Java客戶端應用程序凍結
- 20. WCF客戶端測試程序和客戶端憑證
- 21. 使用JUnit和Jersey客戶端測試JAX-RS應用程序
- 22. 使用多個客戶端測試節點應用程序
- 23. 如何在java客戶端和自定義python服務器上使用Secure WebSocket?
- 24. 測試扭曲的應用程序 - 加載客戶端
- 25. 如何測試REST API +客戶端MVC應用程序?
- 26. 在客戶端測試iphone應用程序
- 27. 如何給我的應用程序客戶端進行測試
- 28. 測試客戶端 - 服務器應用程序
- 29. 加載測試胖客戶端Windows Forms應用程序
- 30. 開發和測試Web客戶端應用程序
感謝,尋找到Java的取樣! –