使用Java开发Jmeter自定义取样器(Sampler)插件

文章目录

    • 1、Jmeter自定义取样器扩展类
    • 2、SpringBoot服务器端http测试例子
    • 3、自定义取样器实现
      • 3.1、默认界面的AbstractJavaSamplerClient扩展实现
      • 3.2、自定义界面的AbstractSamplerGui扩展实现
    • 3、自定义取样器运行效果
      • 3.1、AbstractJavaSamplerClient运行效果
      • 3.2、AbstractSamplerGui运行效果
      • 3.3、监听器-查看结果树
      • 3.4、监听器-聚合报告

1、Jmeter自定义取样器扩展类

Jmeter提供默认界面(AbstractJavaSamplerClient)和自定义界面的(AbstractSamplerGui)两种自定义取样器的插件开发方式,对于复杂的压测任务,可以通过自定义取样器的方式来实现。
本文通过压测SpringBoot的http接口演示两个自定义扩展类的实现方式:

2、SpringBoot服务器端http测试例子

maven项目工程,pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.penngo.example</groupId><artifactId>gateway-service</artifactId><version>1.0.0-SNAPSHOT</version><name>gateway-service</name><description>https://blog.csdn.net/penngo</description><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><java.version>11</java.version><spring-boot.version>2.7.2</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><mainClass>com.penngo.example.service.Service2App</mainClass></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>
</project>

http接口示例代码,Service2App.java

package com.penngo.example.service;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;@SpringBootApplication
public class Service2App {public static void main(String[] args) {SpringApplication.run(Service2App.class, args);}@RestControllerpublic class HelloController {@GetMapping("/test")public Map test(HttpServletRequest request){String page = request.getParameter("page");String keyword = request.getParameter("keyword");String userid = "";Cookie[] cookies = request.getCookies();if (cookies != null) {for(Cookie cookie:cookies){if(cookie.getName().equals("userid")){userid = cookie.getValue();break;}}}Map<String, String> data = new HashMap<>();data.put("page", page);data.put("keyword", keyword);data.put("userid", userid);return data;}}
}

3、自定义取样器实现

两种扩展的实现代码都在同一个maven工程里面,pom.xml代码:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.test.jmeter</groupId><version>1.0.0</version><artifactId>jmter_test</artifactId><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target></properties><dependencies><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.15.2</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.5</version></dependency><!-- 注意与Jmeter的版本一致 --><dependency><groupId>org.apache.jmeter</groupId><artifactId>ApacheJMeter_core</artifactId><version>5.4.3</version></dependency><dependency><groupId>org.apache.jmeter</groupId><artifactId>ApacheJMeter_java</artifactId><version>5.4.3</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.17.2</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.17.2</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.36</version></dependency></dependencies>
</project>

3.1、默认界面的AbstractJavaSamplerClient扩展实现

可通过getDefaultParameters()接口,实现在默认界面上配置参数,SampleResult负责记录样本结果,TestHttpSampler.java代码:

package com.test.jmeter;import cn.hutool.json.JSONUtil;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;public class TestHttpSampler extends AbstractJavaSamplerClient {private static final Logger log = LoggerFactory.getLogger(TestHttpSampler.class);@Overridepublic SampleResult runTest(JavaSamplerContext javaSamplerContext) {String url = javaSamplerContext.getParameter("url");String userid = javaSamplerContext.getParameter("userid");Map<String, String> cookieMap = new HashMap();cookieMap.put("userid", userid);SampleResult sampleResult = new SampleResult();sampleResult.setSampleLabel("JavaSamplerClient请求查询");sampleResult.sampleStart();try {Map<String, String> data = data();sampleResult.setRequestHeaders(JSONUtil.toJsonStr(data));var res = Jsoup.connect(url).header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8").ignoreContentType(true).cookies(cookieMap).data(data).method(Connection.Method.GET).execute();String body = res.body();log.info(body);sampleResult.setSuccessful(true);sampleResult.setResponseCode("200");sampleResult.setResponseData(body, "UTF-8");sampleResult.setResponseCodeOK();}catch(Exception e){log.error("runTest error:",e);sampleResult.setResponseCode("500");sampleResult.setSuccessful(false);sampleResult.setResponseData("exception," + e.getMessage(), "UTF-8");}sampleResult.sampleEnd();return sampleResult;}private Map<String, String> data(){Random r = new Random();String page = String.valueOf((r.nextInt(5) + 1));StringBuffer keyword = new StringBuffer();String str = "abcdefghijklmnopqrstuvwxyz";for(int i = 0; i < 7; i++){keyword.append(str.toCharArray()[r.nextInt(str.length())]);}Map<String, String> data = new HashMap<>();data.put("page",page);data.put("keyword",keyword.toString());return data;}public Arguments getDefaultParameters() {Arguments arguments = new Arguments();arguments.addArgument("url", "");arguments.addArgument("userid", "");return arguments;}
}

3.2、自定义界面的AbstractSamplerGui扩展实现

自定义界面的UI库是基于swing,可以使用所有的swing组件

package com.test.jmeter;import org.apache.jmeter.samplers.gui.AbstractSamplerGui;
import org.apache.jmeter.testelement.TestElement;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.swing.*;
import java.awt.*;public class TestGuiHttpSampler extends AbstractSamplerGui {private static final Logger log = LoggerFactory.getLogger(TestGuiHttpSampler.class);private JTextField urlField = null;private JTextField useridField = null;public TestGuiHttpSampler(){urlField = new JTextField();useridField = new JTextField();initUI();}private void initUI(){JPanel topPanel = new JPanel(new GridBagLayout());topPanel.add(new JLabel("http参数"), new GB(0,0,1,1).setInsets(5));topPanel.add(new JLabel("访问地址:"), new GB(0,1,1,1).setInsets(5));topPanel.add(urlField, new GB(1,1,1,1).setInsets(5).setFill(GB.BOTH).setWeight(100,0));topPanel.add(new JPanel(), new GB(0,2,2,1).setInsets(5).setFill(GB.BOTH).setWeight(100,100));JPanel bottomPanel = new JPanel(new GridBagLayout());bottomPanel.add(new JLabel("Cookie参数"), new GB(0,0,1,1).setInsets(5));bottomPanel.add(new JLabel("用户id:"), new GB(0,1,1,1).setInsets(5));bottomPanel.add(useridField, new GB(1,1,1,1).setInsets(5).setFill(GB.BOTH).setWeight(100,0));bottomPanel.add(new JPanel(), new GB(0,2,2,1).setInsets(5).setFill(GB.BOTH).setWeight(100,100));JSplitPane splitPane = new JSplitPane();splitPane.setOneTouchExpandable(true);splitPane.setContinuousLayout(true);log.info("====TestGuiHttpSampler size:" + this.getSize());splitPane.setDividerLocation(50);splitPane.setPreferredSize(this.getSize());splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);splitPane.setTopComponent(topPanel);splitPane.setBottomComponent(bottomPanel);setLayout(new BorderLayout());add(splitPane, BorderLayout.CENTER);}@Overridepublic String getLabelResource() {return null;}@Overridepublic TestElement createTestElement() {TestGuiSampler sample = new TestGuiSampler();return sample;}@Overridepublic void modifyTestElement(TestElement testElement) {testElement.clear();configureTestElement(testElement);testElement.setProperty(TestGuiSampler.URL, urlField.getText());testElement.setProperty(TestGuiSampler.USERID, useridField.getText());}@Overridepublic boolean canBeAdded() {return super.canBeAdded();}@Overridepublic String getStaticLabel() {return "TestGuiHttpSampler测试";}@Overridepublic void clearGui() {super.clearGui();urlField.setText("");useridField.setText("");}
}

3、自定义取样器运行效果

工程项目打包,把jmter_test-1.0.0.jar、jsoup-1.15.2.jar、hutool-all-5.8.5.jar三个包扔到apache-jmeter-5.4.3\lib\ext目录中,重新启动Jmeter。

3.1、AbstractJavaSamplerClient运行效果

在线程组上鼠标右键,弹出菜单中选择“取样器->Java请求中”,在面板的下拉框中可以看到实现的扩展类名并选择。
在这里插入图片描述

在这里插入图片描述

3.2、AbstractSamplerGui运行效果

在线程组上右键,在取样器的子菜单中,能看到实现的扩展类"TestGuiHttpSampler测试",选择即可
在这里插入图片描述

在这里插入图片描述

3.3、监听器-查看结果树

在这里插入图片描述

3.4、监听器-聚合报告

在这里插入图片描述
源码下载

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工厂生产作业流程合规检测

工厂生产作业流程合规检测系统通过yolov7网络模型算法&#xff0c;工厂生产作业流程合规检测对作业人员的操作行为进行全面监测&#xff0c;通过图像识别算法和数据分析&#xff0c;对人员的操作动作、工具使用、安全防护等方面进行检测和评估&#xff0c;能够实时监测工人的操…

9.2 互补功率放大电路

目前使用最广泛的是无输出变压器的功率放大电路&#xff08;OTL 电路&#xff09;和无输出电容的功率放大电路&#xff08;OCL 电路&#xff09;。 一、OCL 电路的组成及工作原理 为了消除图9.1.5所示的基本 OCL 电路所产生的交越失真&#xff0c;应当设置合适的静态工作点&a…

YOLOv5算法改进(7)— 添加SimAM注意力机制

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。SimAM&#xff08;Similarity-based Attention Mechanism&#xff09;是一种基于相似度的注意力机制&#xff0c;它的原理是通过计算查询向量与每个键向量之间的相似度&#xff0c;从而确定每个键向量对于查询向量的重要性…

开始MySQL之路——MySQL约束概述详解

MySQL约束 create table [if not exists] 表名(字段名1 类型[(宽度)] [约束条件] [comment 字段说明],字段名2 类型[(宽度)] [约束条件] [comment 字段说明],字段名3 类型[(宽度)] [约束条件] [comment 字段说明] )[表的一些设置]; 概念 约束英文&#xff1a;constraint 约束实…

vscode | 开发神器vscode自定义用户代码片段

目录 一、增加二、删除三、语法四、变量 一、增加 点击&#xff1a;左下角设置齿轮按钮——>用户代码片段 点击&#xff1a;新建全局代码片段文件 输入文件名 会出现如下界面 配置以下语句 "cls": {"scope": "javascript,typescript",…

Linux学习之Ubuntu 20.04在github下载源码安装Openresty 1.19.3.1

参考的博文&#xff1a;《在 Ubuntu 上使用源码安装 OpenResty》 《OpenResty 安装安装详解-Ubuntu》 《Linux学习之CentOS 7源码安装openresty》 https://openresty.org/en/download.html是官网下载网址&#xff0c;页面往下拉有下载的链接。 https://github.com/openresty…

研磨设计模式day09原型模式

目录 场景 代码实现 有何问题 解决方案 代码改造 模式讲解 原型与new 原型实例与克隆出来的实例 浅度克隆和深度克隆 原型模式的优缺点 思考 何时选用&#xff1f; 相关模式 场景 代码实现 定义订单接口 package com.zsp.bike.day08原型模式;/*** 订单的接口*…

06-Numpy基础-线性代数

线性代数&#xff08;如矩阵乘法、矩阵分解、行列式以及其他方阵数学等&#xff09;是任何数组库的重要组成部分。 NumPy提供了一个用于矩阵乘法的dot函数&#xff08;既是一个数组方法也是numpy命名空间中的一个函数&#xff09; x.dot(y)等价于np.dot(x, y) 符&#xff08;…

【C++设计模式】用简单工厂模式实现按汽车重量输出汽车类型

2023年8月24日&#xff0c;周四凌晨 #include<iostream>class CarType{ public:virtual std::string getType()0; };class MiniCar:public CarType{ public:std::string getType() override{return "小型车";}; };class MidSizeCar:public CarType{ public:std…

管家婆往来分析功能介绍

往来分析是企业管理的重要工具之一&#xff0c;主要用于监控和查询与往来单位的业务往来情况&#xff0c;包括进货金额、付款金额、销售金额、回款情况、此前应收应付、应收应付余额、应收应付限额及其超限余额等。通过往来分析&#xff0c;企业可以更好地了解和控制与往来单位…

mysql 默认的4个数据库 介绍

mysql 存储MySQL的用户账号和权限信息&#xff0c;一些存储过程、事件的定义信息 一些运行过程中产生的日志信息&#xff0c;一些帮助信息以及时区信息等 information_schema 存储Mysql服务器 维护的所有其它数据库的信息&#xff0c;比如有哪些表、哪些视图、哪些触发器、哪…

Spring 更简单的读取和存储对象

前言&#xff1a; &#x1f4d5;作者简介&#xff1a;热爱编程的小七&#xff0c;致力于C、Java、Python等多编程语言&#xff0c;热爱编程和长板的运动少年&#xff01; &#x1f4d8;相关专栏Java基础语法&#xff0c;JavaEE初阶&#xff0c;数据库&#xff0c;数据结构和算法…

诚迈科技子公司智达诚远与Unity中国达成合作,打造智能座舱新时代

2023 年 8 月 23 日&#xff0c;全球领先的实时 3D 引擎 Unity 在华合资公司 Unity 中国举办发布会&#xff0c;正式对外发布 Unity 引擎中国版——团结引擎&#xff0c;并带来专为次世代汽车智能座舱打造的团结引擎车机版。发布会上&#xff0c;诚迈科技副总裁、诚迈科技子公司…

行业追踪,2023-08-24

自动复盘 2023-08-24 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

研磨设计模式day12迭代器模式

目录 场景 解决方案 解决思路 代码示例 代码改造 Java实现迭代器 迭代器模式的优点 思考 何时选用 场景 大公司收购了一个小公司&#xff0c;大公司的工资系统采用List来记录工资列表&#xff0c;而小公司是采用数组&#xff0c;老板希望通过决策辅助系统来统一查看…

opencv案例03 -基于OpenCV实现二维码生成,发现,定位,识别

1.二维码的生成 废话不多说&#xff0c;直接上代码 # 生成二维码 import qrcode# 二维码包含的示例数据 data "B0018" # 生成的二维码图片名称 filename "qrcode.png" # 生成二维码 img qrcode.make(data) # 保存成图片输出 img.save(filename)img.sh…

C#矩阵XY排序

矩阵XY快速排序 using MyVision.Script.Method;public class MyScript : ScriptMethods {//struct MOTIONPOSXY_S{public double Pos_x;public double Pos_y;};//脚本执行该方法public bool Process(){//try{//脚本代码写在下方 List<double> PointX GetDoubleList(&qu…

搭建开发环境-Mac

概述 上一篇搭建开发环境-WSLUbuntu 记录了WSL 和Ubuntu 下开发环境的搭建。这一篇就说下Mac开发环境的搭建。 就像很多人误以为Mini 是专为女孩子设计的高颜值车&#xff0c;其实是一辆极其hardcore 的拉力车一样。 很多人都被Mac 那高颜值蒙蔽了&#xff0c;其实这是一台生产…

构造函数内的方法 直接写在构造函数内部 与 写在prototype上 的区别

文章目录 前言区别总结 前言 以前没注意过, 去创建一个构造函数的时候, 方法都是直接写在函数内的. 在构造函数需要多次实例化的情况下有缺点, 不过幸好以前项目里的构造函数也不需要多次实例化, 缺点没有生效. 区别 为了比较, 先在构造函数内部直接书写方法, 查看实例化结果…

Kubernetes 使用 Rancher 管理

K8S集群管理工具 只能管理单个K8S集群 kubectl命令行管理工具 dashboard&#xff08;K8S官方的UI界面图形化管理工具&#xff09; &#xff08;管理多集群很麻烦&#xff0c;切换不同集群每次需要更改kube-config文件[kubectl配置文件]&#xff0c;如果kubeadm部署每次都需…