Jmeter扩展---自定义取样器

简介

Jmeter已经内置了各种协议的取样器,已经能满足常用的性能压测需求。且在前面一章Jmeter扩展开发--自定义java取样器-CSDN博客中也有关于Java取样器的扩展开发,不过有时候我们期望能定制自己的取样器和界面。为此,需要对Jmeter做扩展,自定义取样器开发

依赖&打包

基本的依赖和打包可以查看前一章Jmeter扩展开发--自定义java取样器-CSDN博客

效果

自定义取样器的使用效果如下图所示:

如上图,成功编写自定义取样器之后,打包,将相关jar包放置在:Jmeter安装目录/lib/ext目录,重启Jmeter即可,当选择某个自定义插件之后,实例界面如下:

核心代码简介

在自定义取样器开发中有两个类需要重点介绍

org.apache.jmeter.samplers.gui.AbstractSamplerGui  

该类是自定义Jmeter取样器的ui显示类,可以直接像操作Swing一样编辑Jmeter取样器的ui界面,如上图2所示。该类包含如下重要方法介绍如下:

getStaticLabel

自定义取样器在Jmeter界面上显示的名字如下图:

示例代码如下:

public String getStaticLabel() {return "YC http请求";}
getLabelResource

同上,取样器名称的本地化方法,返回一样即可(其实上层组件调用的是getStaticLabel方法获取取样器名称,如果没有国际化的处理,直接放回相同即可)

public String getLabelResource() {return "YC http请求";}
createTestElement

该方法会创建一个AbstractSampler对象返回即可,必须对该对象中的字段做赋值的动作一般的即是一个ui字段对应一个AbstractSampler字段即可,示例代码如下:

public TestElement createTestElement() {YcSample ycSample = new YcSample();ycSample.setUserName(this.userNameField.getText());ycSample.setAddress(this.addressField.getText());ycSample.setAge(this.ageField.getText());ycSample.setScore(this.scoreField.getText());return ycSample;}
modifyTestElement

该方法是将UI界面上配置的信息,传递给执行测试Samper对象完成测试,其实就是将界面上传递的参数传递给sampler,完成数据传递的过程,一般的,通过ui界面的字段取值,然后设置到sampler对应的字段值上去即可,实例代码如下:

public void modifyTestElement(TestElement element) {YcSample ycSample = (YcSample)element;ycSample.setUserName(this.userNameField.getText());ycSample.setAddress(this.addressField.getText());ycSample.setAge(this.ageField.getText());ycSample.setScore(this.scoreField.getText());}
构造器

ui的核心方法是构造器的,在构造器中可以直接使用Swing的方法构建ui界面即可,示例方法如下:

public YcHttpGui() {super(); // 此处一定要先调用父类构造器setLayout(new BorderLayout());setBorder(makeBorder());add(makeTitlePanel(), BorderLayout.NORTH);JPanel mainPanel = new VerticalPanel();add(mainPanel, BorderLayout.CENTER);JPanel jPanel = new JPanel();jPanel.setLayout(new GridLayout(2,3));jPanel.add(userNameField);jPanel.add(addressField);jPanel.add(ageField);jPanel.add(scoreField);VerticalPanel verticalPanel = new VerticalPanel();verticalPanel.add(jPanel);TitledBorder border = BorderFactory.createTitledBorder("用户信息");verticalPanel.setBorder(border);mainPanel.add(verticalPanel);}

以上基本是一些ui定式,如果还需要其他的ui元素,添加即可

org.apache.jmeter.samplers.AbstractSampler

该类是自定义Jmeter取样器的逻辑运行类,核心方法之后一个sample,说明如下
sample

该方法是自定义取样器的核心逻辑运行方法,只需要返回一个SampleResult对象即可(此处和扩展java取样器逻辑一样),示例代码如下:

public SampleResult sample(Entry e) {SampleResult result = new SampleResult();result.sampleStart();log.info("userName is:{}",this.userName);System.out.println("运行时名称是:" + this.userName);result.sampleEnd();result.setSuccessful(true);result.setSamplerData("this is test!");result.setResponseCode("200");return result;}

完整代码

自定义Jmeter取样器UI完整代码如下:

import org.apache.jmeter.gui.util.VerticalPanel;
import org.apache.jmeter.samplers.gui.AbstractSamplerGui;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jorphan.gui.JLabeledTextField;import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;public class YcHttpGui extends AbstractSamplerGui {private JLabeledTextField userNameField = new JLabeledTextField("用户名");private JLabeledTextField addressField = new JLabeledTextField("地址");private JLabeledTextField ageField = new JLabeledTextField("年龄");private JLabeledTextField scoreField = new JLabeledTextField("score");public YcHttpGui() {super(); // 此处一定要先调用父类构造器setLayout(new BorderLayout());setBorder(makeBorder());add(makeTitlePanel(), BorderLayout.NORTH);JPanel mainPanel = new VerticalPanel();add(mainPanel, BorderLayout.CENTER);JPanel jPanel = new JPanel();jPanel.setLayout(new GridLayout(2,3));jPanel.add(userNameField);jPanel.add(addressField);jPanel.add(ageField);jPanel.add(scoreField);VerticalPanel verticalPanel = new VerticalPanel();verticalPanel.add(jPanel);TitledBorder border = BorderFactory.createTitledBorder("用户信息");verticalPanel.setBorder(border);mainPanel.add(verticalPanel);}@Overridepublic String getStaticLabel() {return "YC http请求";}@Overridepublic String getLabelResource() {return "YC http请求";}@Overridepublic TestElement createTestElement() {YcSample ycSample = new YcSample();ycSample.setUserName(this.userNameField.getText());ycSample.setAddress(this.addressField.getText());ycSample.setAge(this.ageField.getText());ycSample.setScore(this.scoreField.getText());return ycSample;}@Overridepublic void modifyTestElement(TestElement element) {YcSample ycSample = (YcSample)element;ycSample.setUserName(this.userNameField.getText());ycSample.setAddress(this.addressField.getText());ycSample.setAge(this.ageField.getText());ycSample.setScore(this.scoreField.getText());}}

自定义Jmeter取样器sampler完整代码如下:

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.jmeter.samplers.AbstractSampler;
import org.apache.jmeter.samplers.Entry;
import org.apache.jmeter.samplers.SampleResult;@Data
@Slf4j
public class YcSample extends AbstractSampler {private String userName;private String address;private String age;private String score;@Overridepublic SampleResult sample(Entry e) {SampleResult result = new SampleResult();result.sampleStart();log.info("userName is:{}",this.userName);System.out.println("运行时名称是:" + this.userName);result.sampleEnd();result.setSuccessful(true);result.setSamplerData("this is test!");result.setResponseCode("200");return result;}
}

后续会继续分享关于Jmeter自定义取样器的源码分析,届时会把相关逻辑梳理清楚

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

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

相关文章

项目示例 - 4.配置中心 - 1.Nacos

项目示例 - 4.配置中心 - 1.Nacos 关联知识&#xff1a; 分布式微服务 - 4.配置中心 - 2.Nacos 内容提要&#xff1a; 基本使用 基本使用 建Module&#xff1a;微服务起名为nacos-config改pom&#xff1a;引入以下依赖 <dependencies><!--Nacos的配置管理-->…

界面控件DevExpress ASP.NET Scheduler - 助力快速交付个人信息管理系统(下)

DevExpress ASP. NET Scheduler组件能完全复制Microsoft Outlook Scheduler的样式和功能&#xff0c;具有日、周、月和时间轴视图&#xff0c;并包括内置的打印支持&#xff0c;因此用户可以在尽可能短的时间内交付全功能的个人信息管理系统。在上文中&#xff08;点击这里回顾…

Gemma中RoPE代码详细讲解

最近在看Gemma代码感觉比LLama的代码看的方便点&#xff0c; 看到RoPE代码跟常规的方式不太一样&#xff08;也不算常规&#xff0c;就是我理解的方式&#xff09;&#xff0c;特此记录一下。我的RoPE入门代码参考&#xff1a;Rotary Position Embedding (RoPE, 旋转式位置编码…

自然语言处理实验2 字符级RNN分类实验

实验2 字符级RNN分类实验 必做题&#xff1a; &#xff08;1&#xff09;数据准备&#xff1a;academy_titles.txt为“考硕考博”板块的帖子标题&#xff0c;job_titles.txt为“招聘信息”板块的帖子标题&#xff0c;将上述两个txt进行划分&#xff0c;其中训练集为70%&#xf…

服务器Debian 12.x中安装Jupyer并配置远程访问

服务器系统&#xff1a;Debian 12.x&#xff1b;IP地址&#xff1a;10.100.2.138 客户端&#xff1a;Windows 10;IP地址&#xff1a;10.100.2.38 利用ssh登录服务器&#xff1a; 1.安装python3 #apt install python3 2.安装pip #apt install python3-pip … 3.安装virtualen…

Unity Timeline学习笔记(3) - SignalTrack信号轨道和自定义带参数的Marker信号和轨道

信号轨道&#xff0c;顾名思义就是运行到某处发送一个信号。 普通用法 普通用法就是没有任何封装的&#xff0c;个人感觉特别难用&#xff0c;但是有必要理解一下工作原理。 添加信号 我们添加一个信号资源 生成后可以看到资源文件&#xff0c;这个是可以拖到SignalTrack上…

【Python数据结构与判断7/7】数据结构小结

目录 序言 整体回忆 定义方式 访问元素 访问单个元素 访问多个与元素 修改元素 添加元素 列表里添加元素 字典里添加元素 删除元素 in运算符 实战案例 总结 序言 今天将对前面学过的三种数据结构&#xff1a;元组&#xff08;tuple&#xff09;、列表&#xff08;…

微前端框架 qiankun 配置使用【基于 vue/react脚手架创建项目 】

qiankun官方文档&#xff1a;qiankun - qiankun 一、创建主应用&#xff1a; 这里以 vue 为主应用&#xff0c;vue版本&#xff1a;2.x // 全局安装vue脚手架 npm install -g vue/clivue create main-app 省略 vue 创建项目过程&#xff0c;若不会可以自行百度查阅教程 …

【Docker】常用命令 docker restart

文章目录 什么是docker restart命令基本用法常用选项-t&#xff1a;指定重新启动容器的超时时间-f&#xff1a;强制重新启动容器 实际示例重新启动一个正在运行的Nginx容器强制重新启动一个运行中的数据库容器 总结 在Docker中&#xff0c; docker restart命令用于重新启动正在…

java垃圾回收-三色标记法

三色标记法 引言什么是三色标记法白色灰色黑色 三色标记过程三色标记带来的问题多标问题漏标问题 如何弥补漏标问题增量更新原始快照总结 引言 在CMS,G1这种并发的垃圾收集器收集对象时&#xff0c;假如一个对象A被GC线程标记为不可达对象&#xff0c;但是用户线程又把A对象做…

MySQL 常见用法练习

LIMIT [参数1]--m,参数2--n; #表示从跳过m条数据开始取n行数据 #参数1为可选参数,表示跳过m条数据(默认为0) eg:1表示从第二行开始 #参数2为必选参数,表示取几行数据 SELECT *FROM employees ORDER BY hire_date DESC LIMIT 1; SELECT *FROM employees ORDER BY hire…

数字化经济的前沿:深入了解 Web3 的商业模式

随着区块链技术的迅速发展&#xff0c;Web3作为一种新型的互联网范式&#xff0c;正逐渐引起人们的关注。它不仅仅是一种技术革新&#xff0c;更是一种商业模式和价值观的转变。本文将深入探讨Web3的商业模式&#xff0c;以及它对数字化经济的影响。 1. 理解Web3的商业模式 We…

解决 Java 错误 Unreachable Statement

本篇文章介绍了 Java 中的 unreachable statement 错误。 Java中出现 unreachable statement 错误的原因 当我们尝试在分支控制流语句之后放置语句时&#xff0c;会发生不可到达语句错误。 分支语句包括 break、continue 和 return&#xff0c;它们用于跳转到代码的不同部分。…

go get x509:certificate signed by unknown authority

概述 在arm设备上构建golang 1.22的Docker镜像&#xff0c;用来做程序的编译镜像&#xff0c;直接安装用ubuntu作为基础镜像&#xff0c;构建好的镜像&#xff0c;在编译的时候执行go get的时候&#xff0c;会报下面错误 go: github.com/***: Get "https://goproxy.cn/g…

Qt教程3-Ubuntu(x86_64)上配置arm64(aarch64)交叉编译环境及QT编译arm64架构工程

详见&#xff1a; Qt教程3-Ubuntu(x86_64)上配置arm64(aarch64)交叉编译环境及QT编译arm64架构工程

算法---滑动窗口练习-4(无重复字符的最长子串)

无重复字符的最长子串 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 算法的主要思想是使用滑动窗口来维护一个不含重复字符的子串。定义两个指针 left 和 right 分别表示窗口的左边界和右边界。还定义了一个数组 hash 来记…

华为认证云计算专家(HCIE-Cloud Computing)–单选题

华为认证云计算专家&#xff08;HCIE-Cloud Computing&#xff09;–单选题 13.( 单选)WAF服务属于以下哪个安全子领域() A 应用安全 B 数据安全 C 主机安全 D 安全管理 E 网络安全 正确答案&#xff1a;A 24 (单选题)以下关于非容灾&#xff0c;Global与Region融合部署场景&…

redis配置文件详情

redis自带两个conf配置文件&#xff0c;redis.conf为redis配置文件&#xff0c;sentinel.conf为哨兵配置文件。 注意&#xff1a;修改配置文件需要重启生效。 一、redis.conf为redis的配置文件 # redis进程是否以守护进程的方式运行&#xff0c;yes为是&#xff0c;no为否(不…

Apache Paimon 的 CDC Ingestion 概述

CDC Ingestion 1&#xff09;概述 Paimon支持schema evolution将数据插入到Paimon表中&#xff0c;添加的列将实时同步到Paimon表&#xff0c;并且无需重启同步作业。 目前支持的同步方式如下&#xff1a; MySQL Synchronizing Table: 将MySQL中的一个或多个表同步到一个Pa…

【算法与数据结构】深入解析二叉树(一)

文章目录 &#x1f4dd;数概念及结构&#x1f320; 树的概念&#x1f309;树的表示&#x1f320; 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; &#x1f309;二叉树概念及结构&#x1f320;概念&#x1f309;数据结构中的二叉树&#x1f320;特殊的二叉…