简单的jmeter数据请求学习
简单的jmeter数据请求学习
1.需求
我们的流程服务由原来的workflow-server调用wfms进行了优化,将wfms服务操作并入了workflow-server中,去除了原来的webservice服务调用形式,增加了并发处理,现在想测试模拟一下,在一定并发的条件下获取下一岗位信息的接口,发起流程,提交流程等接口是否会有问题,此处使用jmeter进行测试,所以我这简单了解了一下jmeter的基本逻辑以及接口测试流程,简单记录一下方便后续使用时查看。
2. 简单使用
2.1 调用接口整理
此次主要测试流程发起,获取下一岗位以及下一岗位提交接口,我们微服务有权限验证,所以需要先调用登录接口,然后进行模拟。那么确定了主要就是5个接口了,具体的接口信息如下:
- 登录接口 + 选择机构 获取权限信息
- 发起流程
- 查询下一岗位信息
- 提交流程到下一岗位
- 撤销流程
2.2 编写登录/选择机构接口
2.2.1 登录接口
观察一下我们登录接口的请求路径以及请求形式,了解到登录url: 3.1.19.155:8901/login/login
设置请求的参数类型为 text/plain
,header中带有一个请求systemflag
参数用于判定请求系统,0信贷 1风险
那么我们的登录接口jmeter设置如下:
我们的整体调用ip地址固定,所以设置用户自定义全局参数ip,value值为:3.1.19.155
设置完自定义全局参数后,再设置一个setUp线程组,用于设置请求接口的请求线程数量,我们的是登录接口,登录一次即可,所以设置参数全部为1
注意:setUp线程组在开始前执行一次,setDown线程组在结束前执行一次,线程组正常中间执行
之后我们添加取样器,http请求,里面具体配置我们的请求参数,地址,请求方式等信息,具体的设置信息如下所示:
在此之后,我们还要添加JSON提取器
,用于获取接口响应的参数信息,我们调用脚本$.data.X_Token
获取,此处我们获取的token信息,并且创建一个名为token的参数进行存储,可在后续接口中使用,具体实现如下:
此处为我们响应的参数信息,所以才能使用如上脚本$.data.X_Token
获取token信息
{"code": 1,"data": {"X_Token": "LOGIN_TOKEN:0f3b9dba281944eab8f493856d6c0c09","organization": [{"orgCd": "0001","orgName": "辽宁省农村信用社联合社"}]},"msg": "ok"
}
在此后,我们还要设置一个beanShell后置处理器,用于将token设置为全局变量,让所有请求都可以使用,具体配置如下:
脚本内容为:${__setProperty(new_token,${token},)};
,设置参数
__setProperty 是 JMeter 提供的一个内置函数,用于设置全局属性(property)。全局属性可以在整个测试计划中访问,并且可以跨线程组共享,JSON提取器获取参数作用域为线程级别,所以需要调用__setProperty 设置全局可用。
参数解释:
- 第一个参数 (new_token):这是你要设置的属性名称。在这个例子中,属性名称为 new_token。
- 第二个参数 (
${token}
):这是你要设置的属性值。${token} 是一个变量引用,表示从其他地方获取的值(例如通过 HTTP 请求返回的响应数据)。 - 第三个参数 (空字符串 ,):这是一个可选参数,通常用于指定默认值。如果省略或为空,则不使用默认值。
- 整体含义:
这个表达式的目的是将 ${token} 的值赋给名为 new_token 的全局属性。之后,你可以在整个 JMeter 测试计划中的任何地方使用 ${__P(new_token,)} 或 ${__property(new_token,)} 来引用这个属性值。
2.2.2 选机构接口
我们的选机构接口与登录接口略有不同,登录接口在网关中没有设置验签验证,但是其他接口在调用网关接口时,都需要进行验签,需要按照规则生成验签码,并且还需要用到之前登录接口生成的token信息,作为header必要参数传入到选机构接口,具体配置如下:
首先新增一个http请求,并且设置请求参数信息
新增http请求之后,我们需要设置其header请求信息,包含验签sign信息以及token信息,具体配置如下所示:
我们看到,我们的请求接口header信息中包含了X_token,X_sign,X_Timestamp,systemFlag信息,Cookie信息非必填,其值分别如下:
参数名称 | 参数值 | 含义 |
---|---|---|
X_Token | ${__property(new_token,)} | 获取登录接口token信息 |
X_Sign | ${__digest(MD5,${__V(${__substring(${__property(new_token,,)},num1,num2...... | 验签规则,下面详解 |
X_Timestamp | ${__time(/1000,)} | 时间戳,单位秒 |
systemFlag | 1 | 系统标识 |
我们主要观察一下验签部分,值具体的参数如下:
${__digest(MD5,${__V(${__substring(${__property(new_token,,)},num1,num2,)}${__time(/1000,)}${__substring(${__property(new_token,,)},num3,num4,)})},,,)}
此表达式使用了多个 JMeter 内置函数来生成一个 MD5 摘要,需要逐步解析这个表达式的各个部分
- __property 函数
${__property(new_token,,)}
- 功能:获取全局属性 new_token 的值。
- 参数:
- new_token:属性名称。
- 空字符串 ,:默认值(如果属性不存在,则返回空字符串)
- __substring 函数
${__substring(${__property(new_token,,)},num1,num2,)}
${__substring(${__property(new_token,,)},num3,num4,)}
- 功能:从字符串中提取子串。
- 参数:
- ${__property(new_token,)}:源字符串。
- num1 和 num2:起始和结束位置(第一个子串)。
- num3 和 num4:起始和结束位置(第二个子串)。
- __time 函数
${__time(/1000,)}
- 功能:获取当前时间戳(以秒为单位)。
- 参数:
- /1000:将毫秒转换为秒。
- __V 函数
${__V(${__substring(${__property(new_token,,)},num1,num2,)}${__time(/1000,)}${__substring(${__property(new_token,,)},num3,num4,)})}
- 功能:用于嵌套变量或函数的结果,确保它们按顺序执行并组合成一个字符串。
- 参数:嵌套的表达式。
- __digest 函数
${__digest(MD5,${__V(${__substring(${__property(new_token,,)},num1,num2,)}${__time(/1000,)}${__substring(${__property(new_token,,)},num3,num4,)})},,,)}
- 功能:生成指定算法的摘要(哈希值)。
- 参数:
- MD5:使用的哈希算法。
- ${__V(…):要哈希的字符串。
- 空字符串 ,:盐值(可选,默认为空)。
- 空字符串 ,:编码(可选,默认为空)。
整体解释,这个表达式的目的是:
获取全局属性 new_token 的值。从 new_token 中提取两个子串(第num1到num2位和第num3到num4位)。获取当前时间戳(以秒为单位)。将上述三个部分组合成一个字符串。对组合后的字符串进行 MD5 哈希运算,生成一个 MD5 摘要。
最后在setUP线程组上设置汇总报告以及查看结果树信息
2.2.3 测试结果
我们选中登录选选岗,然后点击运行绿色按钮,观察汇总报告以及查看结果树信息,发现都可以正常访问了,具体信息如下所示:
2.3 发起流程
在岗位选择之后,我们便可以发起流程了,注意,我们发起流程的时候,我们需要携带验签信息以及权限信息才能访问接口,所以需要使用到前面的token信息以及时间戳信息,还有sign信息。
具体实现步骤如下,首先新增一个线程组,设置线程个数以及线程启动时间,以及持续时间等
我们发起的业务编号也需要动态设定,按照 MCON + 时间戳 + 7位自增序列
进行生成,整体是post json格式传递请求参数
请求参数信息具体如下:
{"bizId": "MCON${__time(yyyyMMdd,date)}99${__Random(10000,99999,n)}", "creatorLV": "","customerName": "沈阳艺锦园林工程有限公司","customerNum": "20330134297","orgCd": "1019","userCd": "153805","variableMap": {"custManager":"153805", "FSFlag":"0","ruleResult":"0"},"workFlowProductEnum": "BIZ_TYPE_CD_BIZ","workFlowSysEnum": "DICS"
}
参数解释如下:
-
${__time(yyyyMMdd,date)}:
__time 是JMeter的一个函数,用于获取当前时间。
参数 yyyyMMdd 指定了日期格式为年月日(例如:20231005)。
date 是一个可选参数,通常可以省略,默认使用当前系统时间。
该部分会生成类似 20231005 的字符串。 -
${__Random(10000,99999,n)}:
__Random 是JMeter的一个函数,用于生成随机数。
参数 10000 和 99999 分别指定了随机数的最小值和最大值范围(即五位数)。
参数 n 表示返回的随机数是数字格式。
该部分会生成一个五位的随机数,例如 12345
添加一个请求头处理器,用于添加请求头信息,主要设置sign,token等验签鉴权信息,请求头信息与之前的选机构接口一致,就不多赘述。
添加JSON提取器,提取接口响应数据信息,具体配置如下:
创建三个参数信息,processId、taskId以及bizId,其中Match No. (0 for Random) 1;1;1 表示获取json响应数据第一个匹配值,具体匹配策略如下所示:
Match No. (0 for Random):这个参数决定了从所有匹配的结果中选择哪一个。
- 1:表示选择第一个匹配项。
- 2:表示选择第二个匹配项。
- 0:表示随机选择一个匹配项。
添加一个beanShell后置处理器,用于获取发起流程的结果,然后将结果配置到一个固定目录的文件之中
具体配置如下所示:
测试结果写入文件部分代码如下所示:
FileWriter fstream = new FileWriter("D://test2.csv",true);
BufferedWriter out = new BufferedWriter(fstream);
num = vars.get("bizId_matchNr");
for(int i=1;i<=(Integer.parseInt(num));i++){out.write(vars.get("processId")+",");out.write(vars.get("taskId")+",");out.write(vars.get("bizId")+"\n");
}
out.close();
fstream.close();
vars.get(“bizId_matchNr”); 语句含义如下所示:
-
vars.get
vars是JMeter中的一个内置对象,表示当前线程(用户)的变量映射。你可以通过 vars 对象来设置和获取自定义变量。
get 方法用于从 vars 对象中获取指定名称的变量值。 -
bizId_matchNr:
JMeter中的_matchNr变量用于表示通过JSON提取器匹配到的数据条数。
在JMeter中,_matchNr是一个特殊的变量,用于表示通过JSON提取器匹配到的数据条数。当使用JSON提取器提取响应数据 时,如果响应中包含多个匹配项,_matchNr变量会记录匹配到的数据条数。这个变量可以用于后续的测试脚本中,以便根据匹配到的数据条数进行相应的操作
我们可以添加调试后置处理器,观察里面的参数变化
我们可以看到对应参数信息,bizId,processId。。。。。。
相关文章:

简单的jmeter数据请求学习
简单的jmeter数据请求学习 1.需求 我们的流程服务由原来的workflow-server调用wfms进行了优化,将wfms服务操作并入了workflow-server中,去除了原来的webservice服务调用形式,增加了并发处理,现在想测试模拟一下,在一…...
智能水文:ChatGPT等大语言模型如何提升水资源分析和模型优化的效率
大语言模型与水文水资源领域的融合具有多种具体应用,以下是一些主要的应用实例: 1、时间序列水文数据自动化处理及机器学习模型: ●自动分析流量或降雨量的异常值 ●参数估计,例如PIII型曲线的参数 ●自动分析降雨频率及重现期 ●…...

民宿酒店预订系统小程序+uniapp全开源+搭建教程
一.介绍 一.系统介绍 基于ThinkPHPuniappuView开发的多门店民宿酒店预订管理系统,快速部署属于自己民宿酒店的预订小程序,包含预订、退房、WIFI连接、吐槽、周边信息等功能。提供全部无加密源代码,支持私有化部署。 二.搭建环境 系统环境…...

计算机网络掩码、最小地址、最大地址计算、IP地址个数
一、必备知识 1.无分类地址IPV4地址网络前缀主机号 2.每个IPV4地址由32位二进制数组成 3. /15这个地址表示网络前缀有15位,那么主机号32-1517位。 4.IP地址的个数:2**n (n表示主机号的位数) 5.可用(可分配)IP地址个数&#x…...

Mac中配置vscode(第一期:python开发)
1、终端中安装 xcode-select --install #mac的终端中安装该开发工具 xcode-select -p #显示当前 Xcode 命令行工具的安装路径注意:xcode-select --install是在 macOS 上安装命令行开发工具(Command Line Tools)的关键命令。安装的主要组件包括:C/C 编…...

软件项目体系建设文档,项目开发实施运维,审计,安全体系建设,验收交付,售前资料(word原件)
软件系统实施标准化流程设计至关重要,因为它能确保开发、测试、部署及维护等各阶段高效有序进行。标准化流程能减少人为错误,提升代码质量和系统稳定性。同时,它促进了团队成员间的沟通与协作,确保项目按时交付。此外,…...

计算机网络--路由表的更新
一、方法 【计算机网络习题-RIP路由表更新-哔哩哔哩】 二、举个例子 例1 例2...
CDN防御如何保护我们的网络安全?
在当今数字化时代,网络安全成为了一个至关重要的议题。随着网络攻击的日益频繁和复杂化,企业和个人都面临着前所未有的安全威胁。内容分发网络(CDN)作为一种分布式网络架构,不仅能够提高网站的访问速度和用户体验&…...

matlab离线安装硬件支持包
MATLAB 硬件支持包离线安装 本文章提供matlab硬件支持包离线安装教程,因为我的matlab安装的某种原因(破解),不支持硬件支持包的安装,相信也有很多相同情况的朋友,所以记录一下我是如何离线安装的ÿ…...
使用virtualenv创建虚拟环境
下载 virtualenv pip install virtualenv 创建虚拟环境 先进入想要的目录 一般为 /envs virtualenv 文件名 --python解释器的版本 激活虚拟环境 .\虚拟项目的文件夹名称\Scripts\activate 退出虚拟环境 deactivate...

Java链表
链表(Linked List)是一种线性数据结构,它由一系列节点组成,每个节点包含两部分:一部分为用于储存数据元素,另部分是一种引用(指针),指向下一个节点。 这种结构允许动态地添加和删除元素,而不需要像数组那种大规模的数…...

Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s
前言:纯个人记录使用。 搭建 Zero to JupyterHub with Kubernetes 上篇 - Kubernetes 离线二进制部署。搭建 Zero to JupyterHub with Kubernetes 中篇 - Kubernetes 常规使用记录。搭建 Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s。 官方文档…...

解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域
解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域 Tomcat 配置允许跨域Web 项目配置允许跨域Tomcat 同时允许静态文件和 Web 服务跨域 偶尔遇到一个 Tomcat 部署项目跨域问题,因为已经处理…...
在C语言中使用伪终端与bash交互
了解伪终端概念: 伪终端(PTY)由一对设备组成:主设备(master)和从设备(slave)。数据写入主设备会出现在从设备,反之亦然。这允许一个进程通过主设备与另一个进程ÿ…...

阿里云 人工智能与机器学习
阿里云的 人工智能(AI)与机器学习(ML) 服务为企业提供了全面的AI解决方案,帮助用户在多个行业实现数据智能化,提升决策效率,推动业务创新。阿里云通过先进的技术和丰富的工具,支持用…...

HTML 显示器纯色亮点检测工具
HTML 显示器纯色亮点检测工具 相关资源文件已经打包成html等文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Html相关程序案例,秉着开源精神的想法,望大家喜欢&#…...

【漏洞分析】UDF提权漏洞——CVE-2016-6662-MySQL ‘malloc_lib’变量重写命令执行
0x00 前言 最近在做渗透笔记,其中有一个靶机在getshell后,需要进行提权。发现靶机使用root启动的mysql服务,那么尝试使用UDF提权。于是在提权成功后,花了一天时间特意搜了一下整个UDF提权的漏洞原理和利用,加深理解。…...

Mybatis(day09)
Mybatis基础操作 功能列表: 查询 根据主键ID查询 条件查询新增更新删除 根据主键ID删除 根据主键ID批量删除 准备 实施前的准备工作: 准备数据库表创建一个新的 springboot 工程,选择引入对应的起步依赖(mybatis、mysql 驱动、…...
模式识别与机器学习 | 十一章 概率图模型基础
隐马尔科夫模型(Hidden Markov Model,HMM) HMM是建模序列数据的图模型 1、第一个状态节点对应一个初始状态概率分布 2、状态转移矩阵A, 3、发射矩阵概率B 4、对特定的(x,y)的联合概率可以表示为 α递归计算——前向算法β递归…...
深圳知识产权保护中心再发力,两大产业专利预审服务全新升级
在当今科技迅猛发展、市场竞争日益激烈的时代,知识产权保护对于产业发展的重要性不言而喻。深圳知识产权保护中心又有大动作,为高端装备制造和珠宝加工产业带来了专利预审服务的新突破。这一举措不仅为这两个产业注入了强大的发展动力,也为深…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...