当前位置: 首页 > news >正文

Jmeter压测实战:Jmeter二次开发之自定义函数

目录

1 前言

2 开发准备

3 自定义函数核心实现

3.1 新建项目

3.2 继承实现AbstractFunction类

3.3 最终项目结构

4 Jmeter加载扩展包

4.1 maven构建配置

4.2 项目打包

4.3 Jmeter加载扩展包

5 自定义函数调用调试

5.1 打开Jmeter函数助手,选择自定义函数

6 总结


1 前言

Jmeter是Apache基金会下的一款应用场景非常广的压力测试工具,具备轻量、高扩展性、分布式等特性。Jmeter已支持实现随机数、计数器、时间戳、大小写转换、属性校验等多种函数,方便使用人员使用。如果在使用过程中存在和业务强耦合的常用功能函数,在Jmeter不支持的情况下,那就需要单独开发自定义函数实现特定功能。

本文介绍如何开发Jmeter自定义函数实现快速生成京东宙斯下单标准sign,同时深刻理解Jmeter的插件化机制及高扩展性特性。

2 开发准备

  1. Java基础开发
  2. Maven基本使用
  3. 开发依赖版本
    JDK 1.8.0Maven 3.6.3Jmeter 5.4.3

3 自定义函数核心实现

3.1 新建项目

  • 新建maven项目,这里项目名为:JSF_Sampler
  • 因为是基于Jmeter的扩展,需要依赖包Jmeter两个核心包,分别是:
  • ApacheJMeter_core
  • ApacheJMeter_java
  • ApacehJMeter_functions

pom.xml文件核心配置如下

<groupId>com.jd.jmeter.jsf</groupId>
<artifactId>JSF_Sampler</artifactId>
<version>1.0-SNAPSHOT</version>
<properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><jmeter-version>5.4.3</jmeter-version>
</properties>
<dependencies><dependency><groupId>org.apache.jmeter</groupId><artifactId>ApacheJMeter_core</artifactId><version>${jmeter-version}</version></dependency><dependency><groupId>org.apache.jmeter</groupId><artifactId>ApacheJMeter_java</artifactId><version>${jmeter-version}</version></dependency><dependency><groupId>org.apache.jmeter</groupId><artifactId>ApacheJMeter_functions</artifactId><version>${jmeter-version}</version></dependency></dependencies>

3.2 继承实现AbstractFunction类

实现类依次实现以下几个步骤

1)新建实现类并继承 AbstractFunction

  • 注意:实现类的包名必须包含xxx.functions.xxx,Jmeter使用命名规则实现实现类的加载。

2)重写以下方法,每个方法的用途见下方代码注释

  • execute()
  • setParameters()
  • getReferenceKey()
  • getArgumentDesc()
   /*** 京东宙斯 下单标准字段常量*/private static final String APP_KEY = "app_key";private static final String APP_SECRET = "app_secret";private static final String ACCESS_TOKEN = "access_token";private static final String TIMESTAMP = "timestamp";private static final String V = "v";private static final String METHOD = "method";private static final String BUY_PARAM_JSON = "360buy_param_json";/*** Jmeter中自定义的函数名,在Jmeter的函数助手中可以看到*/private static final String FUNC_NAME = "__GenSignFunction";/*** 自定义函数的描述,入参,出参,方便使用人员参考使用*/private static final List<String> desc = new ArrayList<>();static {desc.add("This function is used to generate the JD's JOS sign value");}/*** 此为自定义函数核心实现类,其中,入参SampleResult为上次运行的结果,Sampler为当前的采集器;* 返回值为该函数的返回值* @param sampleResult* @param sampler* @return* @throws InvalidVariableException*/@Overridepublic String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {// 入参处理String param = String.valueOf((CompoundVariable)paramValues[0]);String signResult = paramHandler(param);return signResult;}/*** 按京东宙斯sign加密规则生成标准sign* @param param* @return*/public String paramHandler(String param){Map<String,String> valueMap = new HashMap();// 按&符号分割String[] paramArray = param.split("&");for (int i = 0; i < paramArray.length-1; i++) {String key = paramArray[i].split("=")[0];String value = paramArray[i].split("=")[1];valueMap.put(key,value);};// 京东宙斯标准signString josGign = EncryptUtil.getSignature(valueMap.get("app_secret")+BUY_PARAM_JSON+valueMap.get("360buy_param_json")+ACCESS_TOKEN+valueMap.get("access_token")+APP_KEY+valueMap.get("app_key")+METHOD+valueMap.get("method")+TIMESTAMP+valueMap.get("timestamp")+V+valueMap.get("v")+valueMap.get("app_secret"));return josGign;}/**
* 配置入参,jmeter函数助手入参
*/@Overridepublic void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {paramValues = collection.toArray();}
/**
* 此方法返回自定义的函数名称
*/@Overridepublic String getReferenceKey() {return FUNC_NAME;}
/**
* 此方法返回函数描述信息
*/@Overridepublic List<String> getArgumentDesc() {return desc;}

3.3 最终项目结构

4 Jmeter加载扩展包

以上开发完成,打包此项目,注意这里的打包要包含依赖包。

4.1 maven构建配置

<build><finalName>${project.artifactId}</finalName><defaultGoal>install</defaultGoal><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>assemble-all</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build>

4.2 项目打包

打包指令如下
mvn package -Dmaven.test.skip=true

4.3 Jmeter加载扩展包

将打包后的扩展包放置到Jmeter的ext目录:apache-jmeter-5.4.3/lib/ext/

启动Jmeter后,Jmeter会自动加载ext目录中的扩展包

打开Jmeter函数助手后,可以看到本次实现类中打印的相关日志

5 自定义函数调用调试

5.1 打开Jmeter函数助手,选择自定义函数

5.2 京东宙斯接口验证

这里使用京东快递获取预制运单号接口,输入GET请求后,直接点击运行函数【Generate & Copy to clipboard】,出参返回32位sign值。

GET请求入参
method=jingdong.etms.waybillcode.get&app_key=349559FAE87E66826499890862E40A44&access_token=c8c2bdc8d1684630bb771a503d5b5a7fkyzh×tamp=2022-01-28 15:10:00&360buy_param_json={"preNum":"1","customerCode":"10K43816","orderType":"0"}&v=2.0&sign=EBB52C6CEDA34703ADE72D4AA4D8F316&app_secret=29959e4cadc14ff4998d4fc26d1e5063

6 总结

本文通过自定义函数实现了京东宙斯下单标准sign的生成,希望通过本项目大家可以学习到:

  • 如何二次开发Jmeter,实现自己特有的自定义函数。
  • 理解为何官方介绍Jmeter是插件化的,高扩展性特性。
  • 更好的理解Jmeter内部处理机制。

 以下是我收集到的比较好的学习教程资源,虽然不是什么很值钱的东西,如果你刚好需要,可以评论区,留言【777】直接拿走就好了

各位想获取资料的朋友请点赞 + 评论 + 收藏,三连!

三连之后我会在评论区挨个私信发给你们~

相关文章:

Jmeter压测实战:Jmeter二次开发之自定义函数

目录 1 前言 2 开发准备 3 自定义函数核心实现 3.1 新建项目 3.2 继承实现AbstractFunction类 3.3 最终项目结构 4 Jmeter加载扩展包 4.1 maven构建配置 4.2 项目打包 4.3 Jmeter加载扩展包 5 自定义函数调用调试 5.1 打开Jmeter函数助手&#xff0c;选择自定义函数…...

在python中使用nvidia的VPF库对RTSP流进行硬解码并使用opencv进行显示

解码并处理视频流的多线程应用 随着视频处理技术的不断发展&#xff0c;越来越多的应用需要对视频流进行解码和处理。在本文中&#xff0c;我们将介绍一个基于Python的多线程应用程序&#xff0c;该应用程序可以解码并处理多个RTSP视频流&#xff0c;同时利用GPU加速&#xff0…...

C++中using namespace std的作用记录

using namespace std;这句代码的作用是引入std命名空间,使得程序可以直接使用std命名空间下的标识符,而不需要加上std::前缀。 在C中,标识符被组织在不同的命名空间中,以避免命名冲突。最常见的命名空间是std,它包含了C标准库中的所有标识符,如cout、vector、string等。 默认…...

【TX 企业微信私有化历史版本 API 信息泄露】

目录 影响版本 复现过程 修复方式 影响版本 影响私有化部署&#xff1a; toB toG版微信 2.5.x 版本 2.6.930000 版本以下 危险程度&#xff1a;高危。攻击者可以进行获取企业的部门信息&#xff0c;员工信息&#xff0c;如权限较高包括应用获取&#xff0c;记录文件等等均…...

腾讯云轻量应用服务器镜像应用模板清单大全

腾讯云轻量应用服务器支持多种应用模板镜像&#xff0c;Windows和Linux镜像模板都有&#xff0c;如&#xff1a;宝塔Linux面板腾讯云专享版、WordPress、WooCommerce、LAMP、Node.js、Docker CE、K3s、宝塔Windows面板和ASP.NET等应用模板镜像&#xff0c;腾讯云服务器网分享腾…...

C语言链表操作

目录 链表基本操作 删除重复元素 查找倒数第N个节点 查找中间节点 约瑟夫环 循环链表 合并有序链表 逆置链表 逆置链表(双向链表) 链表基本操作 //linklist.c#include "linklist.h" #include <stdlib.h>struct node *head NULL; struct node *tail…...

详解拦截器和过滤器

目录 代码演示过滤器Demo拦截器Demo 过滤器自定义拦截器配置拦截器过滤器执行原理多个过滤器的执行顺序 拦截器自定义拦截器注册拦截器1&#xff09;注册拦截器2&#xff09;配置拦截的路径3&#xff09;配置不拦截的路径 多个拦截器的执行顺序 过滤器和拦截器的区别 代码演示 …...

关于`IRIS/Caché`进程内存溢出解决方案

文章目录 关于IRIS/Cach进程内存溢出解决方案 描述原因相关系统变量$ZSTORAGE$STORAGE 什么情况下进程内存会变化&#xff1f;内存不足原理解决方案 关于 IRIS/Cach进程内存溢出解决方案 描述 在IRIS/Cach中&#xff0c;进程内存溢出错误是指一个进程&#xff08;例如运行中的…...

构建Docker容器监控系统(cadvisor+influxDB+grafana)

目录 一、部署 1、安装docker-cd 2、阿里云镜像加速 3、下载组件镜像 4、创建自定义网络 5、创建influxdb容器 6、创建Cadvisor 容器 7、创建granafa容器 一、部署 1、安装docker-cd [rootlocalhost ~]# iptables -F [rootlocalhost ~]# setenforce 0 setenforce: SELi…...

最强自动化测试框架Playwright(17)- 模拟接口

模拟接口 介绍 Web API 通常作为 HTTP 终结点实现。Playwright提供了API来模拟和修改网络流量&#xff0c;包括HTTP和HTTPS。页面所做的任何请求&#xff0c;包括 XHR 和获取请求&#xff0c;都可以被跟踪、修改和模拟。使用Playwright&#xff0c;您还可以使用包含页面发出的…...

Python爬虫——requests_get请求

import requests# ?可加可不加 url http://www.baidu.com/s?headers {Cookie: ,User-Agent: , }data {wd: 北京 } # params 参数 response requests.get(urlurl, paramsdata, headersheaders)content response.text print(content)总结&#xff1a; 参数使用params传递…...

【EI复现】一种建筑集成光储系统规划运行综合优化方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

C++11 异步与通信之 std::async

概念简介 std::async 异步运行一个函数&#xff0c;将返回值保存在std::future中。 含有2个策略参数&#xff1a; launch::deferred 延迟执行&#xff0c;当调用wait()和get()时&#xff0c;任务才会被运行&#xff0c;且不创建线程&#xff1b;launch::async : 创建线程并执…...

影视站用什么cms好?

影视站是指用于提供电影、电视剧、综艺等视频资源的网站。由于影视站需要频繁更新大量的内容&#xff0c;因此使用一个好的内容管理系统&#xff08;CMS&#xff09;非常重要。以下是几个受欢迎的影视站CMS的介绍。最新下载地址&#xff1a;roulang WordPress WordPress是目前…...

HOT88-乘积最大子数组

leetcode原题链接&#xff1a;乘积最大子数组 题目描述 给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的非空连续子数组&#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该子数组所对应的乘积。测试用例的答案是一个 32-位 整数。子数组 是…...

工博士与纷享销客达成战略合作,开启人工智能领域合作新篇章

近日&#xff0c;工博士与纷享销客在上海正式签署了战略合作协议&#xff0c;正式拉开了双方在人工智能与数字营销领域的合作序幕。这次合作将为双方带来更多机遇和发展空间&#xff0c;并为全球人工智能领域的客户提供更高效、智能的CRM解决方案。 < 双方项目人员合影 >…...

拆解与重构:慕云游首页组件化设计

目录 前言1 项目准备1.1 创建项目目录1.2 搭建项目开发环境 2 项目组件化2.1 在当前环境启动原有项目2.2 顶部组件2.3 幻灯片组件2.4 机酒自由行组件2.5 拆分余下的css文件 3 项目完善3.1 幻灯片组件3.1.1 结构和样式3.1.2 功能实现3.1.3 使用Ajax获取数据3.1.4 加载中组件 3.2…...

刷了3个月的华为OD算法题,刷出感觉了,如洁柔般丝滑,文末送《漫画算法2:小灰的算法进阶》

目录 一、考研二战&#xff0c;入职华为&#xff0c;反向调剂电子科大深圳下面分享一道2023 B卷 朋友抽中题 简易内存池&#xff1a;二、题目描述三、输入描述四、输出描述样例&#xff1a;输出样例&#xff1a; 五、解题思路六、Java算法源码七、效果展示1、输入2、输出3、说明…...

ip转换器哪个好用 ip地址切换器有哪些

在互联网时代&#xff0c;IP转换器成为了实现高效工作的常见工具。而如今&#xff0c;市面上涌现出了众多的IP转换器软件&#xff0c;使得用户在选择时感到困惑。本文将介绍一种深度IP转换器软件&#xff0c;探讨其特点和优势&#xff0c;以及与其他软件相比的差异&#xff0c;…...

【python】爬取豆瓣电影Top250(附源码)

前言 在网络爬虫的开发过程中&#xff0c;经常会遇到需要处理一些反爬机制的情况。其中之一就是网站对于频繁访问的限制&#xff0c;即IP封禁。为了绕过这种限制&#xff0c;我们可以使用代理IP来动态改变请求的来源IP地址。在本篇博客中&#xff0c;将介绍如何使用代理IP的技术…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...