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组件的更多相关文章

  1. SSIS自定义数据流组件开发(血路)

    由于特殊的原因(怎么特殊不解释),需要开发自定义数据流组件处理. 查了很多资料,用了不同的版本,发现各种各样的问题没有找到最终的解决方案. 遇到的问题如下: 用VS2015编译出来的插件,在SSDTB ...

  2. Android Studio开发基础之自定义View组件

    一般情况下,不直接使用View和ViewGroup类,而是使用使用其子类.例如要显示一张图片可以用View类的子类ImageView,开发自定义View组件可分为两个主要步骤: 一.创建一个继承自an ...

  3. [UE4]自定义MovementComponent组件

    自定义Movement组件 目的:实现自定义轨迹如抛物线,线性,定点等运动方式,作为组件控制绑定对象的运动. 基类:UMovementComponent 过程: 1.创建UCustomMovement ...

  4. 【转】Android学习基础自定义Checkbox组件

    原文网址:http://forum.maiziedu.com/thread-515-1-1.html heckbox组件是一种可同时选中多项的基础控件,即复选框,在android学习中,Checkbo ...

  5. Swift - 继承UIView实现自定义可视化组件(附记分牌样例)

    在iOS开发中,如果创建一个自定义的组件通常可以通过继承UIView来实现.下面以一个记分牌组件为例,演示了组件的创建和使用,以及枚举.协议等相关知识的学习. 效果图如下:    组件代码:Score ...

  6. vue2入坑随记(二) -- 自定义动态组件

    学习了Vue全家桶和一些UI基本够用了,但是用元素的方式使用组件还是不够灵活,比如我们需要通过js代码直接调用组件,而不是每次在页面上通过属性去控制组件的表现.下面讲一下如何定义动态组件. Vue.e ...

  7. 仿照wtform自定义Form组件

    仿照wtforms自定义Form组件 1.wtforms 点击查看源码分析及使用方法 2.自定义Form组件 #!usr/bin/env python # -*- coding:utf-8 -*- f ...

  8. Python自定义分页组件

    为了防止XSS即跨站脚本攻击,需要加上 safe # 路由 from django.conf.urls import url from django.contrib import admin from ...

  9. 自定义Form组件

    一.wtforms源码流程 1.实例化流程分析 # 源码流程 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._ ...

随机推荐

  1. javaweb-thymeleaf,加载jar包---视图基础

    1.加载完thymeleaf的jar包 将thymeleaf的jar包复制到项目下lib文件夹中 右击lib文件夹,点击Add as librarb... 打开Project Structure,找到 ...

  2. KingbaseES 如何实现Oracle pipelined 功能

    管道函数即是可以返回行集合(可以使嵌套表nested table 或数组 varray)的函数,我们可以像查询物理表一样查询它或者将其赋值给集合变量.KingbaseES 数据库可以用 setof 实 ...

  3. KingbaseES如何更改现有表的主键

    更改主键 假设您必须更改现有表的主键.您可以通过执行以下语句来实现此目的: ALTER TABLE tablename DROP CONSTRAINT tablename_pkey , ADD PRI ...

  4. 小结event.target与this

    <!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <t ...

  5. Grafana Loki 学习之踩坑记

    转发自:https://mp.weixin.qq.com/s/zfXNEkdDC9Vqd9lh1ptC1g Grafana 出品的 loki 日志框架完美地与 kubernetes 的 label 理 ...

  6. 4.Ceph 基础篇 - 对象存储使用

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247485256&idx=1&sn=39e07215 ...

  7. centos7安装sonarqube-9.2.4

    官方文档地址:https://docs.sonarqube.org/latest/requirements/requirements/ 使用 sonarqube 对 java 项目代码进行扫描的时候, ...

  8. logstash中关于Jdbc输入配置选项详解

    Setting Input type Required clean_run boolean No columns_charset hash No connection_retry_attempts n ...

  9. ELK 性能优化实践

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzI5MTU1MzM3MQ==&mid=2247489814&idx=1&sn=6916f8b7 ...

  10. 【博学谷学习记录】超强总结,用心分享|Linux修改文件权限方法总结

    一.介绍 linux中"一切皆文件".每个文件都设定了针对不同用户的访问权限. 文件权限主要针对以下三种对象: 属主:拥有者 属组:所属的组 其他人:不属于上述两类 二.文件权限 ...