当前位置: 首页 > 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的技术…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...