JMeter如何自定义HTTP组件

news2024/11/25 16:31:46

JMeter是一个优秀的开源项目,我们可以在jmeter的官网了解到如何使用和如何二次开发:Apache JMeter - Apache JMeter™

因工作需要,最近做了一个JMeter自定义的http组件(其实就是在http的基础上加了点东西而已)。现就该需求为例,简要地分享如何实现jmeter自定义组件。

1、了解jmeter架构

我们先按照平常使用jmeter的思路,看看jmeter到底保存了什么东西?

可以看到,每一个组件都有一个guiclass和testclass。guiclass就是你能看到的页面的代码,testclass就是你点击运行时后台处理的代码。

Jmeter由多个模块组成,其中我们本次需要了解的是http模块。我们常用的“http请求”取样器就是以HttpTestSampleGui+HTTPSamplerProxy(HTTPSamplerProxy为final类,故需继承其父类HTTPSamplerBase)组成。

注:图片描述不是完全准确,仅就所需内容铺排,大致了解即可。后续图片亦然。

2、需求分析

一般我们请求接口,需要在请求头上添加token等签名。而我本次需求,是在调用系统接口前,需要添加签名到请求体,而这个签名是使用系统门户生成的key和access、时间戳、请求体等,通过某种算法生成的。

系统生成签名分为两个情况:

1、发起获取session请求时,使用key、access、timestamp生成签名。(获取session在单线程组中只需要调用一次)

2、发起其他请求时,使用第一步获取到的session、key、access、timestamp、请求体生成签名。(其他请求可能调用多次)

那么对于这个需求,我一开始的处理方法是:在“http请求”下,添加“前置处理器”,生成签名。针对获取session的请求还需要再添加“json提取器”提取session。

但这么做发现我们新增的每一个请求都要添加“前置处理器”,实现同样的逻辑代码。我们能不能提供一个新的组件,让用户在不改变原http请求的逻辑上,自动生成签名呢?

我们可以在“http请求”的基础上,通过继承原生的HttpTestSampleGui和HTTPSamplerBase来实现自定义组件!

针对这个需求,我认为我们应该自定义两个组件,分别处理获取session请求和其他请求。用户在线程组里填入key、access,只需新增一个“PaimonSession请求”,请求后自动把接口返回的session存到这个线程组的公共变量里(即jmeter的vars变量)。对于其他请求,用户可以新增多个“Paimon请求”,填写的内容与普通http请求一致。

这里会引起另一个问题,就是如何配置key、access?一开始我们使用“用户定义的变量”配置,但发现多个线程组的情况下,会出现后者覆盖前者的情况,即无法做到每个线程组拥有独立的key、access。所以能否在原生的http请求上添加两个输入框呢?

原生:

预期:

需求转化:自定义两个组件,两个组件都需要在发起请求前生成签名并添加到请求头,其中一个组件需要新增两个输入框。

3、源码分析

3.1、需求一:增加输入框

我们根据jmx文件,分析源码。以contentEncoding为例,我们下载jmeter对应版本的源码,查看HttpTestSampleGui文件,在HttpTestSampleGui找不到contentEncoding这个变量。熟悉前端的同学可能会想到,前端一般会使用组件的形式达到代码复用的效果。这里jmeter也是这样实现的,guiclass是组件嵌套的。通过查看源码,可以在HttpTestSampleGui找到UrlConfigGui,UrlConfigGui内出现了contentEncoding这个变量(其实在查找原生组件的时候,我一般是调试jmeter源码)

 

所以除了继承HttpTestSampleGui和HTTPSamplerBase,我们还需要继承UrlConfigGui。

3.2、需求二:发起请求前生成签名

上面说到http请求的后端处理类是HTTPSamplerProxy,我们查看HTTPSamplerProxy的代码,发现他其实就只实现了几个方法。其中sample方法返回一个HTTPSampleResult对象,result大家都知道是结果的意思,所以大概率这个方法就是发起请求并得到结果(其实也可以debug知道,或者百度)。我们只需要继承其父类HTTPSamplerBase,同样实现这些方法,并在sample方法里生成签名,添加到请求头里,再同样发起请求,即可实现这个需求。

原生:

预期:

4、代码实现

新建一个maven项目,pom引入jmeter_core与jmeter_http

按照需要继承的类的路径,在项目中新建目录。剩下的步骤就是按以上分析的,新建并继承对应的类,按需修改父类方法,并建立关联。

这里特别说明一下增加输入框的代码实现:首先继承UrlConfigGui,然后参考UrlConfigGui的实现,增加key、access两个字段(需要注意的是,重写方法需要先使用父类的方法,再加上自定义的逻辑)

至于如何获取自定义输入框的值、如何获取和设置系统变量、如何设置变量到请求头等问题,可以私信问我拿源码

5、运行调试

编写好代码后,使用maven打包,并把jar包放到jmeter根目录/lib/ext下。IDEA添加启动配置,新增JAR Application,选择jmeter根目录/bin/ApacheJMeter.jar。保存后,DEBUG启动即可进行调试。

6、正式使用

如果只是需要在本地使用,就可以像调试时一样,直接把jar包放到jmeter根目录/lib/ext下。

因我们公司使用Metersphere,所以需要修改MS打包jmeter镜像的代码,添加自己的jar包,再重新打镜像(需要注意的是,maven项目打包时默认不打依赖,而MS的jmeter镜像缺少生成签名需要的加密算法包,所以我在pom里添加了maven-shade-plugin)

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

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

相关文章

TCO-PEG5-amine,NH2-PEG5-TCO,反式环辛烯-五聚乙二醇-氨基广泛应用于生物学研究

TCO-PEG5-NH2中英文名: CAS号:N/A | 英文名:TCO-PEG5-amine,TCO-PEG5-NH2 |中文名:反式环辛烯-五聚乙二醇-氨基TCO-PEG5-NH2物理参数: CASNumber:N/A Molecular formula:C21H40N2O7…

没有实施APS软件的工厂,常常面临的问题

对于制造工厂车间的运行而言,计划是核心的业务。制造工厂面对这么多订单并行生产执行、受制于有限的制造资源,如何安排次序、如何权衡轻重缓解,其实都是计划的范畴,计划执行过程总是受到各种形式的干扰或冲击,如何综合…

虹科分享 | 网络性能监控 | 网络中的应用性能意味着什么?

TCP协议的可靠性 数据包丢失是对网络的破坏,因为它导致延迟。TCP协议建立了可靠的数据传输,但掩盖了丢包的影响。TCP确保数据的传输是基于一个叫做 "滑动窗口 "的概念。这种机制控制着传输的字节序列和收到的确认。 在排序的帮助下&#xff…

项目管理之信息文档管理与配置管理(第一篇)

目录 前言 一、软件文档的分类 1.开发文档 2.产品文档 3.管理文档 二、文档质量的四个等级 1.1级文档 2.内部文档(2级) 3.工作文档(3级文档) 4.正式文档(4级文档) 三、配置管理 1.配置管理的定义…

XCTF-web1文件包含绕过file include

场景一: fileclude 题目描述 好多file呀! 进入场景 给出PHP源码 包含flag.php文件 GET获取两个参数file1和file2 当参数不为空时,使用file_get_contents()函数将文件内容读入字符串,判断是否为"hello ctf" 利用ph…

vue项目前端优化处理方案整理

vue项目前端优化处理 目录 vue项目前端优化处理 路由懒加载 按需引入模块 外部资源引入,cdn加载 移除项目中所有的console.log()控制台信息数据打印 是否在构建生产包时生成sourcdeMap 上传图片文件压缩 开启gizp压缩 前端页面代码优化 路由懒加载 路由懒…

【深度学习】特征图的上采样(nn.Upsample)和转置卷积(nn.ConvTranspose2d) | pytorch

文章目录前言一、nn.Upsample 上采样二、nn.ConvTranspose2d 转置卷积前言 这次就不废话了,我想赶在10点前回去洗头(现在9.17,还差一篇文章) 一、nn.Upsample 上采样 该函数有四个参数: 参数的介绍如下&#xff1a…

工厂模式(Factory Pattern) 与抽象工厂模式(Abstract Factory Pattern)

工厂模式(Factory Pattern) 与抽象工厂模式(Abstract Factory Pattern) 工厂模式属于构造型模式,是项目中最常用到的一种设计模式。它的主要作用是提供一种简单的创建对象的方式,使用者无需知道创建实例的细节以及需要…

重启虚拟机启动Docker常见问题

文章目录重启虚拟机启动Docker常见问题一、Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?二、admin is not in the sudoers file. This incident will be reported.(没有这个问题请自觉跳过)三、…

华清远见11.17

1.在用户空间中有个字符数组,要求在内核空间打印,用dmesg查看。(ioctl实现) zy.h,封装一个发送用的命令码 #ifndef __LED_H__ #define __LED_H__ #define UACCESS_BUF _IOW(a,1,char [128]) #endif zy.c 申请并自动创…

2022 开源之夏|EMQ 三大开源项目开发圆满收官

今年暑假,EMQ 携手开源之夏,与高校学生开展了一场精彩纷呈的开源之旅。开源之夏(OSPP)是由中科院软件所「开源软件供应链点亮计划」发起的、面向高校学生的暑期开源活动,旨在鼓励在校学生积极参与开源软件的开发维护&a…

CE-Net: Context Encoder Network for 2D MedicalImage Segmentation

Title:用于二维医学图像分割的上下文编码器网络 摘要:在医学图像分割领域中,基于UNet已经成为主流的应用框架。但是在UNet结构中连续的池化和跨步卷积操作会导致一些空间信息的丢失。在本文中提出了一个上下文编码器网络(简称为CE-Net&#…

数据分析师的Windows装机必备软件

文章目录1. Python安装包列表2. Office 3653. Visual Studio Code4. Git5. 向日葵6. 聊天软件7. OneDrive8. iCloud9. 网易邮箱大师10. 搜狗输入法11. 阿里云盘对于数据分析师,装机是再经常不过的一件事情,但是每次装机都要想装什么好,找来找去,故列出来供大家参考. 当然, 系统…

CentOS7自有服务和软件包

文章目录什么是服务管理服务的命令:systemctl列出服务服务启停开机自动启动服务服务状态软件包RPM查询安装了什么软件卸载某个软件安装某个软件查询文件所属的包名查询软件安装后,生成了哪些文件YUM命令epel-release什么是服务 什么是程序(C…

最优化——凸优化概述

引言 这是中科大最优化理论的笔记,中科大凌青老师的凸优化课程,详尽易懂,基础扎实。不论是初学者还是从业多年的人,都值得系统地好好学一遍。 本文主要介绍什么是凸优化,通过几个例子来阐述什么是凸优化问题。让大家…

3年测试经验,面试27k自动化测试岗被diss,想给进阶自动化的人提个醒...

毕业后一直从事功能测试的工作,时间久了就没有一点想法,天天都是点点点,也没有一点提升,看着身边一个个的人都忙得不可开交,打听之后知道他们都是在技术上忙,而不像我,在杂事上忙,特…

vue 使用screenfull 实现全屏展示,全局水印实现, 以及全屏放大后部分组件无法使用,水印无法全屏显示问题的解决

需求:1. web项目中看板页面需要单独全屏显示 2. 项目全局增加水印,水印文字为当前用户登录姓名,登录页不显示水印 出现问题描述 单页面进行全屏显示,下拉,时间选择器,抽屉等组件被 全屏覆盖到下一层&…

MyBatis入门基础

目录 1.什么是MyBatis 2.第一个MyBatis查询 2.1 准备工作 2.2 实际操作 2.2.1 定义接口 2.2.2 创建XML实现上述接口 2.3 单元测试 2.3.1 单元测试的优势 2.3.2 创建并使用单元测试 2.3.3 有关断言 3.增删改的基本操作 3.1 插入操作 特殊的添加:返…

【PyTorch】Torchvision

文章目录三、Torchvision1、Dataset2、DataLoader2.1 test_data2.2 test_loader2.3 drop_last2.4 shuffle三、Torchvision PyTorch官网:https://pytorch.org 1、Dataset 数据集描述:https://www.cs.toronto.edu/~kriz/cifar.html 数据集使用说明&#…

SpringCloud案例day05

SpringCloud Gateway网关 案例1&#xff1a;环境搭建 可以复制 Service-A9001 改成Gateway-C9009 》1&#xff1a;创建工程导入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artif…