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. Math_Music

    查看代码 #REmoo的优化任务 #1.公式写在<formula_set>类中,统一管理 --- Finished 2022.8.15 12:39 #2.建立<sample_set& ...

  2. LibreCAD常用命令

    目录 常见命令 常见命令 .text_center { text-align: center } \3cp>.text_left { } 动作命令 命令 绘制直线 相对坐标系 @长度<角度 ...

  3. php统计IP PV和今日访问量统计方法

    php引用,在wordpress主题中 $getroot=$_SERVER['DOCUMENT_ROOT']; require_once("$getroot/countstart.php&q ...

  4. Vite+React搭建开发构建环境实践

    前言 使用 Vite 已经有两年了,期间使用它开发过单页面应用,也开发过浏览器扩展插件,对比日常工作中用到的 webpack 构建速度大幅提升,开发体验也好很多. 虽然相比于 webpack 来说简单 ...

  5. 痞子衡嵌入式:理解i.MXRT中FlexSPI外设lookupTable里配置访问行列混合寻址Memory的参数值

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT中FlexSPI外设lookupTable里配置访问行列混合寻址Memory的参数值. 关于 FlexSPI 外设的 loo ...

  6. 1 Java内存区域管理

    目录 1 关于自动内存管理 2 运行时数据区域 2.1 程序计数器 2.2 虚拟机栈 2.2.1 局部变量表 2.2.2 操作数栈 2.3 本地方法栈 2.4 堆 2.5 方法区 2.5.1 运行时常 ...

  7. Python数据科学手册-机器学习:线性回归

    朴素贝叶斯是解决分类任务的好起点,线性回归是解决回归任务的好起点. 简单线性回归 将数据拟合成一条直线. y = ax + b , a 是斜率, b是直线截距 原始数据如下: 使用LinearRegr ...

  8. Django 使用cmd 创建工程

    一.Django 安装 1 通过pip安装 Django 如果你是通过升级的方式安装Django,那么你需要先卸载旧的版本. Django 提供3种发行版本,推荐使用官方的稳定版本: 你的操作系统提供 ...

  9. 通过vNode实现给列表字段打标签

    问题 如何给列表数据打标签?类似下面这种样子 思路 数模转化(对接口请求回来的数据进行过滤标记,返回新的数据) 渲染新的数据模型 实现 1.过滤数据,需要打标签的采用jsx写法 业务数据的处理我封装在 ...

  10. 使用kubeoperator安装的k8s 版本1.20.14 将节点上的容器运行时从 Docker Engine 改为 containerd

    官方文档:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/migrating-from-dockershim/change-runt ...