首页 > 其他分享 >JMeter自定义HTTP组件

JMeter自定义HTTP组件

时间:2022-11-14 11:37:29浏览次数:78  
标签:JMeter HTTP 请求 自定义 签名 组件 http jmeter

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

因工作需要,最近做了一个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)

标签:JMeter,HTTP,请求,自定义,签名,组件,http,jmeter
From: https://www.cnblogs.com/melonHJY/p/16888284.html

相关文章

  • office2010添加宏到自定义快速访问工具栏
    1.建立相应的宏,名称分别:查找填充默认  2.点击“文件”菜单,“选项”卡  3.选择“快速访问工具栏”4.从“从下列位置选择命令”,选择“宏”5.则刚才的宏名自动出......
  • 第四十六章 开发自定义标签 - 标签匹配 操作中的运行时表达式
    第四十六章开发自定义标签-标签匹配操作中的运行时表达式指定标签的属性值,方法是将属性值放在方括号内,标签名称后是[]。<csr:rule>标记的match属性定义了CSP编译器......
  • 响应的HTTP协议
    1.响应行  (1)响应的协议和版本号  (2)响应状态码  (3)响应状态述符2.响应头   key:value 不同的响应头有不同的含义 空行3.响应体  回传给客户......
  • 自定义的Qt统计折线图控件
    本控件用来显示一组统计数据,数据必须全为正,以折线图形式显示。可以添加折线颜色样式说明(即下图图表上方的甲公司、乙公司和丙公司的标识),参见文章“自定义的Qt给统计图添加......
  • 请求的HTTP协议
    请求分为GET请求,POST请求GET请求  1.请求行  请求方式 GET  请求的资源路径  请求的协议版本号 HTTP/1.12.请求头  key:value 组成  不......
  • Jmeter使用指定的jdk版本运行
    1、将jmeter.bat文件改为jmeter.txt文件,打开后找到图示处的内容2、添加jdk路径3、将jmeter.txt文件改回jmeter.bat即可......
  • 自定义字符串排序 缀点成线 玩筹码 一周中的第几天 公交站间的距离
    791.自定义字符串排序StringBuilderans=newStringBuilder();int[]pre=newint[26];把目标字符串做成数组for(charch:s.toCharArray()){pre[ch-'a']++;}......
  • 案例体验HTTP2.0多路复用
    大家好,我是[小鑫同学]。一位长期从事前端开发的编程爱好者,我信奉编程最重要的是分享。请跟随小鑫同学的步伐,一起带你畅游不一样的前端世界~HTTP协议经历了20多年的演进在......
  • 791. 自定义字符串排序
    791.自定义字符串排序classSolution{int[]w=newint[30];publicStringcustomSortString(Stringorder,Strings){for(inti=0;i<26;i......
  • 【ASP.NET Core】MVC控制器的各种自定义:应用程序约定的接口与模型
    从本篇起,老周会连发N篇水文,总结一下在MVC项目中控制器的各种自定义配置。本文内容相对轻松,重点讨论一下MVC项目中的各种约定接口。毕竟你要对控制器做各种自定义时,多......