JMeter-Websocket接口自动化

JMeter-Websocket接口自动化

        • 结构图
    • 1.准备
    • 2.实现思路
      • 2.1 通过HTTP请求获取token
      • 2.2 设置循环控制、断言变量
      • 2.3 建立WebSocket连接
      • 2.4 设置While循环控制读取CSV文件数据
        • 2.4.1 csv文件设置,一般这样设置参数即可
          • 变量名称:message,expected_steps
      • 2.5 设置websocket请求体数据
      • 2.6 设置循环来保证接收到需要的响应(排除ping响应的影响)
        • JSR223后置处理脚本(从正确响应中拆解出需要的数据):
        • JSR223断言(从正确响应中拆解出需要的数据):
      • 2.7 进行安全处理,关闭websocket连接和确保循环终止(保险)
    • 3.csv文件格式
    • 4.结果查看和输出

结构图

在这里插入图片描述

1.准备

提前安装好JMeter Plugins Manager,后续用的到部分组件需要通过插件管理器安装,比如JSR断言、WebSocket Open Connection等组件

2.实现思路

2.1 通过HTTP请求获取token

token有过期时间,每次手动设置较为麻烦,故通过组件每次运行获取新的token

在这里插入图片描述

2.2 设置循环控制、断言变量

也有每次循环重置变量的作用,避免变量结果复用

在这里插入图片描述

2.3 建立WebSocket连接

WebSocket连接实在HTTP请求的基础上建立的,也就是在HTTP请求中高速对方,我要和你建立websocket连接,所以必要的HTTP请求头参数要带上

在这里插入图片描述
在这里插入图片描述

2.4 设置While循环控制读取CSV文件数据

2.4.1 csv文件设置,一般这样设置参数即可

在这里插入图片描述

变量名称:message,expected_steps

对应vars中的变量,变量值是根据分隔带JMeter自动处理的,变量名称 数量和分隔后的变量值 数量不对应也没影响,两者缺少的值会忽略或者设置为空值

2.5 设置websocket请求体数据

在这里插入图片描述

2.6 设置循环来保证接收到需要的响应(排除ping响应的影响)

在这里插入图片描述

JSR223后置处理脚本(从正确响应中拆解出需要的数据):

脚本是类似C语言的执行模式,方法在前,调用在后

import org.json.JSONObject;
import org.json.JSONArray;// 解析read的响应数据为json格式
public JSONObject parseResponse(String response) {try {JSONObject jsonResponse = new JSONObject(response);return jsonResponse;} catch (Exception e) {log.info("解析read结果失败: " + e.getMessage());return null;}
}// 判断action是否为chat
public Boolean processAction(JSONObject jsonResponse) {try{if (jsonResponse.has("action") && jsonResponse.get("action").toString().equals("chat")) {return true;} else {return false;}}catch (Exception e) {System.err.println("processAction发生异常: " + e.getMessage());return false;}	
}// 获取read结果的steps
public List<String> getStepsList(JSONObject jsonResponse){// 解析实际步骤List<String> actualSteps = new ArrayList<>();try{JSONArray plan = jsonResponse.getJSONObject("xxxx").getJSONObject("data");for (int i=0; i<plan.length(); i++) {JSONArray steps = plan.getJSONObject(i).getJSONArray("steps");for (int j=0; j<steps.length(); j++) {actualSteps.add(steps.getJSONObject(j).getString("xxxx"));}}}catch (Exception e) {log.info("获取steps失败: " + e.getMessage());}return actualSteps;
}// 获取csv文件中的预期步骤
public List<String> getExpectedStepsList(){return Arrays.asList(vars.get("expected_steps").split(";"));
}// 比较预期步骤和实际步骤是否符合
public Boolean getComparisonResult(List<String> actualSteps,List<String> expectedSteps){//比较方法return actualSteps.equals(expectedSteps);
}// 获取原始响应
String response = prev.getResponseDataAsString();// read的响应数据转为json格式
JSONObject jsonResponse = parseResponse(response);// 仅处理action:chat的响应
if (processAction(jsonResponse)) {// 解析实际步骤List<String> actualSteps = getStepsList(jsonResponse);// 获取预期步骤List<String> expectedSteps = getExpectedStepsList();// 对比数据Boolean temp = getComparisonResult(actualSteps,expectedSteps);// 实际与预期不符if(!temp){// 存储实际、预期数据vars.putObject("actualSteps", actualSteps);vars.putObject("expectedSteps", expectedSteps);// 标记需要断言vars.put("isAsser","true");}vars.put("isValidResponse", "true"); // 标记有效响应(停止读取流数据,进入下个案例循环)
}
JSR223断言(从正确响应中拆解出需要的数据):
// 断言
if ("true".equals(vars.get("isAsser"))) {// 获取测试数据List<String> expectedSteps = vars.getObject("expectedSteps");List<String> actualSteps = vars.getObject("actualSteps");String msg = vars.get("message");String actualStepsString = actualSteps.toString();String expectedStepsString = expectedSteps.toString();AssertionResult.setFailure(true); // 标记断言失败AssertionResult.setFailureMessage("案例 " + msg + " 预期不符\n" + "\t实际步骤:"+ actualStepsString + "\n" + "\t预期步骤:" + expectedStepsString);// 添加调试信息log.info("当前案例: {},与预期不符合", vars.get("message"));log.info("实际步骤列表: {}", actualSteps.toString());log.info("预期步骤列表: {}", expectedSteps.toString());
}

2.7 进行安全处理,关闭websocket连接和确保循环终止(保险)

在这里插入图片描述

3.csv文件格式

在这里插入图片描述

4.结果查看和输出

在这里插入图片描述

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

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

相关文章

大模型在闭合性胫骨平台骨折诊疗全流程中的应用研究报告

目录 一、引言 1.1 研究背景与目的 1.2 国内外研究现状 1.3 研究方法与创新点 二、大模型预测原理及数据基础 2.1 大模型概述 2.2 数据收集与处理 2.3 模型训练与优化 三、术前预测与方案制定 3.1 骨折类型及损伤程度预测 3.2 手术时机评估 3.3 手术方案制定 3.4 …

Dify大语言模型应用开发环境搭建:打造个性化本地LLM应用开发工作台

文章目录 前言1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 各位小伙伴们&#xff0c;大家好&#xff01;今天我们要来一场技术大冒险&#xff0c;手把手教你如何在Linux Ubuntu系统上使用Docke…

【MySQL成神之路】MySQL插入、删除、更新操作汇总

MySQL 插入、删除和更新操作详解 一、插入数据(INSERT) 1. 基本插入语法 2. 插入多行数据 3. 从其他表插入数据 4. 插入NULL值和默认值 二、更新数据(UPDATE) 1. 基本更新语法 2. 使用子查询更新 3. 批量更新注意事项 三、删除数据(DELETE) 1. 基本删除语法 2. 清空…

亚马逊第四个机器人中心将如何降低30%配送成本?

近年来&#xff0c;亚马逊越来越依赖自动化技术来提升仓储效率和配送速度。2024年&#xff0c;亚马逊宣布其全球第四个机器人中心在美国正式投入运营&#xff0c;这一中心将成为改变供应链策略的新变量。据亚马逊官方消息&#xff0c;这一机器人中心有望帮助公司进一步削减运营…

MongoDB大数据量的优化——mongoTemplate.stream()方法使用

传统查询 在传统的 MongoDB 查询中&#xff0c;我们通常使用find方法&#xff1a; List<Document> results mongoTemplate.find(query, Document.class, "collection");这种方式会直接将查询结果全部加载到内存中&#xff0c;当数据量较大&#xff08;如百万…

JDK8中的 Stream流式编程用法优化(工具类在文章最后)

Java从JDK8起提供了Stream流这个功能&#xff0c;于是项目里出现了大量基于Stream流的写法。随着项目的进行&#xff0c;慢慢的代码中铺天盖地的都是下面的写法&#xff1a; List<User> userList null;if (condition) {userList new ArrayList<>();userList.add(…

Spring Cloud生态与技术选型指南:如何构建高可用的微服务系统?

引言&#xff1a;为什么选择Spring Cloud&#xff1f; 作为全球开发者首选的微服务框架&#xff0c;Spring Cloud凭借其开箱即用的组件、与Spring Boot的无缝集成&#xff0c;以及活跃的社区生态&#xff0c;成为企业级微服务架构的基石。但在实际项目中&#xff0c;如何从众多…

Android清单文件

清单文件AndroidManifest.xml AndroidManifest.xml 配置清单文件是 每个 Android 应用的配置中心&#xff0c;系统在安装和运行应用时&#xff0c;首先会读取它。 它是 Android 应用的 “说明书”&#xff0c;主要作用是&#xff1a; 功能说明声明应用组件比如 Activity、Se…

大语言模型与人工智能:技术演进、生态重构与未来挑战

目录 技术演进:从专用AI到通用智能的跃迁核心能力:LLM如何重构AI技术栈应用场景:垂直领域的技术革命生态关系:LLM与AI技术矩阵的协同演进挑战局限:智能天花板与伦理困境未来趋势:从语言理解到世界模型1. 技术演进:从专用AI到通用智能的跃迁 1.1 三次技术浪潮的跨越 #me…

SC3000智能相机-自动存图

1、需求:SC3000智能相机开机自动存图。相机自带的相机存储空间有限,预留存图需要开启SCMVS、并手动点存图。如果工人忘了开启则不会存图,导致生产严重失误! 2、方法:利用相机提供的FTP协议,将图自动存到本地。 1、在本地建立FTP服务器。 (1)win10默认开启了FTP服务器…

Wan2.1 文生视频 支持批量生成、参数化配置和多语言提示词管理

Wan2.1 文生视频 支持批量生成、参数化配置和多语言提示词管理 flyfish 设计 一个基于 Wan2.1 文本到视频模型的自动化视频生成系统。 文件关系图 script.py ├── 读取 → config.json │ ├── 模型配置 → 加载AI模型 │ ├── 生成参数 → 控制生成质量 │ └…

Flannel后端为UDP模式下,分析数据包的发送方式——tun设备(三)

在分析 Kubernetes 环境中 Flannel UDP 模式的数据包转发时&#xff0c;我们提到 flannel.1 是一个 TUN 设备&#xff0c;它在数据包处理中起到了关键作用。 什么是 TUN 设备&#xff1f; TUN 设备&#xff08;Tunnel 设备&#xff09;是 Linux 系统中一种虚拟网络接口&#x…

Java中创建线程的几种方式

目录 Java 创建线程的几种方式 一、继承 Thread 类 核心原理 实现步骤 代码示例 简化写法&#xff08;Lambda 表达式&#xff09; 优缺点 二、实现 Runnable 接口 核心原理 实现步骤 代码示例 简化写法&#xff08;Lambda 表达式&#xff09; 优缺点分析 三、实现…

[Git] 基本操作及用户配置

文章目录 现在所讲&#xff0c;全部是本地Git仓库&#xff0c;不是远程仓库&#xff01;Git是版本控制工具&#xff0c;而并非只能用远程仓库的版本控制工具&#xff01; 什么是“仓库”&#xff08;Repository&#xff09;&#xff1f;创建一个 Git 本地仓库&#xff1a;git i…

layui 介绍

layui&#xff08;谐音&#xff1a;类 UI) 是一套开源的 Web UI 解决方案&#xff0c;采用自身经典的模块化规范&#xff0c;并遵循原生 HTML/CSS/JS 的开发方式&#xff0c;极易上手&#xff0c;拿来即用。其风格简约轻盈&#xff0c;而组件优雅丰盈&#xff0c;从源代码到使用…

笔记:NAT

一、NAT 的基本概念 NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09; 是一种在 IP 网络中重新映射 IP 地址的技术&#xff0c;主要用于解决 IPv4 地址短缺问题&#xff0c;同时提供一定的网络安全防护作用。 功能&#xff1a; 将内部网络&am…

cursor/vscode启动项目connect ETIMEDOUT 127.0.0.1:xx

现象&#xff1a; 上午正常使用cursor/vscode&#xff0c;因为需要写前端安装了nodejs16.20和vue2&#xff0c;结果下午启动前端服务无法访问&#xff0c;浏览器一直转圈。接着测试运行最简单的flask服务&#xff0c;vscode报错connect ETIMEDOUT 127.0.0.1:xx&#xff0c;要么…

EXO分布式部署deepseek r1

EXO 是一个支持分布式 AI 计算的框架&#xff0c;可以用于在多个设备&#xff08;包括 Mac Studio&#xff09;上运行大语言模型&#xff08;LLM&#xff09;。以下是联调 Mac Studio 512GB 的步骤&#xff1a; 安装 EXO • 从 EXO GitHub 仓库 下载源码或使用 git clone 获取…

python训练营打卡第30天

模块和库的导入 知识点回顾&#xff1a; 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 一、导入官方库 1.标准导入&#xff1a;导入整个库 import mathprint(&quo…

Unity 多时间源Timer定时器实战分享:健壮性、高效性、多线程安全与稳定性能全面解析

简介 Timer 是一个 Unity 环境下高效、灵活的定时任务调度系统&#xff0c;支持以下功能&#xff1a; •支持多种时间源&#xff08;游戏时间 / 非缩放时间 / 真实时间&#xff09; •支持一次性延迟执行和重复执行 •提供 ID、回调、目标对象等多种查询和销毁方式 •内建…