Jmeter对websocket进行测试

JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar下载

公司使用websocket比较奇怪,需要带认证信息进行长连接,通过websocket插件是请求失败,如下图,后面通过代码实现随再打包jar包完成websocket测试

本地实现代码如下:

package com.fangdd.socket;import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;
import java.net.URI;
import java.net.URISyntaxException;
import java.io.IOException;public class SocketIOExample {public static void main(String[] args) throws URISyntaxException, IOException {IO.Options options = new IO.Options();        options.query="tid=wwwww1231&uid=12352547&ticket=mxLqAgCaq7R";Socket socket = IO.socket(URI.create("http://localhost:9092"), options);socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {@Overridepublic void call(Object... args) {System.out.println("connect");// 如果需要发消息参考此代码 连接成功后发送具有body的自定义事件,公司暂不需要注释此代码
//                JSONObject body = new JSONObject();
//                try {
//                    body.put("message", "Hello, Server!");
//                } catch (JSONException e) {
//                    e.printStackTrace();
//                }
//
//                // 发送事件到服务器--需要与开发确认事件(customEvent)
//                socket.emit("customEvent", body);}});socket.on(Socket.EVENT_CONNECT_ERROR, new Emitter.Listener() {@Overridepublic void call(Object... args) {System.out.println("connect_error: " + args[0]);}});socket.on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {@Overridepublic void call(Object... args) {System.out.println("disconnect due to: " + args[0]);}});socket.connect();// 监听服务器返回的自定义事件----需要与开发确认监听事件(messageEvent)socket.on("messageEvent", new Emitter.Listener() {@Overridepublic void call(Object... args) {// 处理服务器返回的数据,如果是json需要数据处理//JSONObject response = (JSONObject) args[0];System.out.println("Server response: " + args[0].toString());}});}}

显示如下:

 开发代码打包到lib/ext目录,通过Jmeter对本地方法进行测试,具体实现代码如下:

底层实现代码:


import java.net.URI;
import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;public class NomalTools {	public static void  IOsocket(String url,String tid) {IO.Options options = new IO.Options();        options.query="tid="+tid+"&uid=12352547&ticket=mxLqA";Socket socket = IO.socket(URI.create(url), options);socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {@Overridepublic void call(Object... args) {System.out.println("connect");}});socket.on(Socket.EVENT_CONNECT_ERROR, new Emitter.Listener() {@Overridepublic void call(Object... args) {System.out.println("connect_error: " + args[0]);}});socket.on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {@Overridepublic void call(Object... args) {System.out.println("disconnect due to: " + args[0]);}});socket.connect();// 监听服务器返回的自定义事件socket.on("messageEvent", new Emitter.Listener() {@Overridepublic void call(Object... args) {// 处理服务器返回的数据
//                JSONObject response = (JSONObject) args[0];System.out.println("Server response: " + args[0].toString());}});//10秒后自动关闭连接
//        try {
//			Thread.sleep(10000);
//			System.out.println("10秒自动关闭连接");
//		} catch (InterruptedException e) {
//			e.printStackTrace();
//		}
//        socket.close();}}

Jmeter封装代码:


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 Common.NomalTools;public class socketTest extends AbstractJavaSamplerClient{private NomalTools nomalTools;private String url;private String tid;private static long start = 0;private static long end = 0;public Arguments getDefaultParameters() {Arguments params = new Arguments();params.addArgument("url", "");params.addArgument("tid", "");return params;}//每个线程测试前执行一次,做一些初始化工作;public void setupTest(JavaSamplerContext arg0) {nomalTools=new  NomalTools();url = arg0.getParameter("url");tid = arg0.getParameter("tid");start = System.currentTimeMillis();}public SampleResult runTest(JavaSamplerContext arg0) {SampleResult sr = new SampleResult();sr.setSamplerData("请求参数num1:"+url+"\n请求参数num2:"+tid);try {sr.sampleStart();// jmeter 开始统计响应时间标记// 通过下面的操作就可以将被测方法的响应输出到Jmeter的察看结果树中的响应数据里面了。nomalTools.IOsocket(url, tid);            
//             System.out.println(resultData);sr.setSuccessful(true);} catch (Throwable e) {sr.setSuccessful(false);e.printStackTrace();} finally {sr.sampleEnd();// jmeter 结束统计响应时间标记}return sr;}//测试结束时调用;public void teardownTest(JavaSamplerContext arg0) {end = System.currentTimeMillis();// 总体耗时System.err.println("cost time:" + (end - start) + "毫秒");}public static void main(String[] args) {Arguments params = new Arguments(); params.addArgument("url", "http://localhost:9092");//设置参数,并赋予默认值1 params.addArgument("tid", "qwe123");//设置参数,并赋予默认值2JavaSamplerContext arg0 = new JavaSamplerContext(params); socketTest test = new socketTest(); test.setupTest(arg0); test.runTest(arg0);test.teardownTest(arg0); }
}

集成到Jmeter的效果:

 

 参考文献:

【JMeter】Jmeter进行webSocket接口测试_千重萌的博客-CSDN博客

https://github.com/socketio/socket.io-client-java/blob/main/src/test/java/io/socket/Fiddle.java

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/47520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++学习笔记总结练习:C++完美转发

完美转发 1 概念 首先解释一下什么是完美转发&#xff0c;它指的是函数模板可以将自己的参数“完美”地转发给内部调用的其它函数。所谓完美&#xff0c;即不仅能准确地转发参数的值&#xff0c;还能保证被转发参数的左、右值属性不变。 template<typename T> void fu…

前馈神经网络解密:深入理解人工智能的基石

目录 一、前馈神经网络概述什么是前馈神经网络前馈神经网络的工作原理应用场景及优缺点 二、前馈神经网络的基本结构输入层、隐藏层和输出层激活函数的选择与作用网络权重和偏置 三、前馈神经网络的训练方法损失函数与优化算法反向传播算法详解避免过拟合的策略 四、使用Python…

【HCIP】08.ISIS中间系统

链路状态协议&#xff0c;传递LSA信息ISIS基于数据链路层封装在OSI时&#xff0c;也有自己的网络层地址和自己的路由协议&#xff0c;即ISIS。之前的ISIS支持OSI的网络层地址&#xff0c;是为OSI中的CLNP&#xff08;无连接网络协议&#xff09;网络设计的路由协议&#xff0c;…

情人节特别定制:多种语言编写动态爱心网页(附完整代码)

写在前面案例1&#xff1a;HTML Three.js库案例2&#xff1a;HTML CSS JavaScript案例3&#xff1a;Python环境 Flask框架结语 写在前面 随着七夕节的临近&#xff0c;许多人都在寻找独特而令人难忘的方式来表达爱意。在这个数字时代&#xff0c;结合创意和技术&#xff0…

Ubuntu22.04编译Nginx源码

执行如下命令 # ./configure --sbin-path/usr/local/nginx/nginx --conf-path/usr/local/nginx/nginx.conf --pid-path/usr/local/nginx/nginx.pid输出结果&#xff0c;出现如下&#xff1a; Configuration summary using system PCRE2 library OpenSSL library is not used …

计算机视觉入门 3)最大池化

目录 一、最大池化最大池化进行压缩平移不变性 二、代码示例步骤2&#xff1a;图像读取转换步骤2&#xff1a;Filter & ReLU步骤3&#xff1a;Pool 一、最大池化 最大池化进行压缩 在Keras中&#xff0c;通过一个 MaxPool2D 层&#xff0c;将压缩步骤添加到之前的模型中&…

电脑找不到MSVCR120.dll怎么办?MSVCR120.dll是什么?

在我们的日常生活和工作中&#xff0c;电脑故障是难以避免的问题。而MSVCR120.dll文件是Windows系统中的一个重要组件&#xff0c;如果出现损坏或丢失&#xff0c;可能会导致程序无法正常运行&#xff0c;这个问题可能是由于系统文件损坏、病毒感染等原因导致的。因此&#xff…

Day17-Node后端身份认证-JWT

Day17-Node后端身份验证 一 密码加密 1 MD5加密 创建MD5.js//node提供了一个内置模块crypto用于密码加密 const crypto = require("crypto")module.exports.getMd5 = function(password){const md5

记录一次wordpress项目的发布过程

背景&#xff1a;发布一套已完成的代码到线上&#xff0c;有完整的代码包&#xff0c;sql文件&#xff0c;环境是linux 宝塔。无wordpress相关经验。 过程&#xff1a;正常的发布代码 问题1&#xff1a;访问自己的域名后跳转到别的域名。 解决&#xff1a; 修改数据表wp_optio…

Apipost中自定义接口字段如何配置

Apipost项目设置中可以配置接口文档中的自定义接口字段&#xff0c;创建状态码字典。分享分档时会展示到文档页面 状态码字典 在状态码字典中可以自定义状态码即其含义 自定义的状态码会在分享的API文档中展示 接口属性 接口属性中可以自定义接口和接口文档展示字段&#xf…

MySQL索引

目录 一、什么是索引 二、索引的原理 三、优缺点 四、分类 1、聚簇索引--顺序IO 2、非聚簇索引--随机IO 五、索引的设计原则 六、创建索引 1、创建表时创建索引 2、在已经存在的表上创建索引 3、使用ALTER TABLE语句来创建索引 1)普通索引 2&#xff09;唯一性索引 …

2308C++协程流程4

参考 #include <协程> #include "简异中.cpp" //用来中文定义的.构 任务{构 承诺型{任务 取中(){中{协柄<承诺型>::从承诺(*本)};}从不挂起 初挂起(){中{};}从不挂起 终挂起()无异{中{};}空 中空(){ 输出<<"取协程结果\n"; }//5空 对异…

蓝奥声智能工业安全用电监测与智慧能源解决方案

能源管理变得越来越重要。如今&#xff0c;能源成本已成为国内预算的核心因素&#xff0c;因此用电监控对大多数现代企业来说都很重要。许多企业在日常能源消耗监控中面临着一些挑战&#xff0c;因为它们的规模庞大&#xff0c;基础设施多样化&#xff0c;灵活性低&#xff0c;…

前端框架学习-React(一)

React 应用程序是由组件组成的。 react 程序是用的jsx语法&#xff0c;使用这种语法的代码需要由babel进行解析&#xff0c;解析成js代码。 jsx语法&#xff1a; 只能返回一个根元素 所有的标签都必须闭合&#xff08;自闭和或使用一对标签的方式闭合&#xff09; 使用驼峰式…

Java之包,权限修饰符,final关键字详解

包 2.1 包 包在操作系统中其实就是一个文件夹。包是用来分门别类的管理技术&#xff0c;不同的技术类放在不同的包下&#xff0c;方便管理和维护。 在IDEA项目中&#xff0c;建包的操作如下&#xff1a; 包名的命名规范&#xff1a; 路径名.路径名.xxx.xxx // 例如&#xff…

sql数据导出到excel

一、打开Navicat Premium 12 二、导出

R语言处理缺失数据(1)-mice

#清空 rm(listls()) gc()###生成模拟数据### #生成100个随机数 library(magrittr) set.seed(1) asd<-rnorm(100, mean 60, sd 10) %>% round #平均60&#xff0c;标准差10 #将10个数随机替换为NA NA_positions <- sample(1:100, 10) asd[NA_positions] <- NA #转…

ClickHouse(二十一):Clickhouse SQL DDL操作-临时表及视图

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术&#xff0c;IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &…

大模型之BloomLLAMA----SFT(模型微调)

0. 简介 随着chatgpt的爆火&#xff0c;最近也有很多大模型在不断地出现&#xff0c;比如说Bloom系列以及以LLAMA为基础的ziya和baichuan。这些模型相较于chatglm来说&#xff0c;更加具有发展前景&#xff0c;因为其是完全可商用&#xff0c;并可以不断迭代更新的。最近作者在…

面试题 16.11. 跳水板

​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;面试题 16.11. 跳水板 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 使用哈希表记录所有可能结果&#xff0c;然后再将哈希表中的数据放入数组中&#xff0c;最后对数组进行排序即可。 解题…