JMeter自定义Java客户端来测试Websocket应用程序 [英] JMeter Custom Java Client to Test Websocket Application

查看:52
本文介绍了JMeter自定义Java客户端来测试Websocket应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用JMeter对在云中运行的应用程序进行基准测试.底层协议使用websocket,但是我需要使用一些专有库来进行这些调用.我看了一些JMeter的websocket插件.但是我不仅仅是使用测试,还希望使用JMeter的功能来为服务器生成分布式负载.我想使用自己的客户端(用Java编写)对服务器发出实际请求.这有可能吗?

I am trying to benchmark an application running in the Cloud with JMeter. The underlying protocol uses websockets, but there are some proprietary libraries that I need to use to make those calls. I looked at some websocket plugins for JMeter. But more than just testing I want to use the ability of JMeter to be able to make distributed load generation for my server. I would like to use my own client (written in Java) to make the actual request for the server. Is this some how possible?

推荐答案

WebSocket客户端API有不同的实现,即用于WebSocket的Java API

There are different implementations of WebSocket Client API, i.e. Jetty Websocket API or Java API for WebSocket

最近,我一直在研究如何使用 JMeter负载测试云解决方案来测试WebSockets.请参阅下面的概念证明细节.它使用 JavaSamplerClient API,因此扩展名为打包为.jar并放在JMeter Classpath下的代码将作为Java Request Sampler提供.

Recently I've been investigating on how WebSockets can be tested using JMeter Load Testing Cloud Solution. Kindly see proof of concept details below. It's using JavaSamplerClient API so extension being packaged as a .jar and put under JMeter Classpath will be available as Java Request Sampler.

首先,您需要 Tyrus –开源JSR-356实现. Tyrus需要Java 7,因此请确保使用Java SE 7来构建和执行扩展.获取依赖关系最方便的方法是使用以下 Apache Maven 配置文件

First of all you'll need Tyrus – open source JSR-356 implementation. Tyrus requires Java 7 so make sure that you use Java SE 7 to build and execute the extension. The most convenient way of getting dependencies is using following Apache Maven configuration file

<?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>

调用目标"mvn依赖关系:复制依赖关系"会将所有必需的jar下载到/target/dependency文件夹中.但是,您可以继续进行构建,打包等maven插件.

Invokation of target "mvn dependency:copy-dependencies" will download all required jars into /target/dependency folder. However you may with to continue with build, package, etc. maven plugins.

扩展的源代码如下:

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.

这篇关于JMeter自定义Java客户端来测试Websocket应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆