java开发jmeter采样器

目录

1.前言

2.新建一个springboot工程

2.1 引入相关依赖

2.2 编写核心代码

2.2.1 取样器代码

2.2.2 取样器界面

2.2.3 sdk接口封装

3.源码打包

3.1 将sdk源码和采样器源码打成jar包

3.2 拷贝引用包

4.配置jmeter脚本

4.1 选择自定义采样器

 4.2 界面里面配置参数


1.前言

当测试的接口响应时间很短时,例如1ms以下,测试如果直接压测spring工程代码,那么spring框架的耗时占比较高,导致实际测试结果的tps误差较大,此时需要自己开发采样器插件,尽可能减少框架对测试结果的影响

2.新建一个springboot工程

2.1 引入相关依赖

<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>es.jma</groupId><artifactId>jmeter-sampler-test</artifactId><version>1.0.0</version><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>17</source><target>17</target></configuration></plugin></plugins></build><packaging>jar</packaging><name>jmeterSamplerTest</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--jmeter核心包--><dependency><groupId>org.apache.jmeter</groupId><artifactId>ApacheJMeter_core</artifactId><version>4.0</version></dependency><!--需要测试的sdk--><dependency><groupId>org.example</groupId><artifactId>dap-paas-spring-seq-client</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>

2.2 编写核心代码

主要有3个类:取样器,取样器界面,sdk接口封装类

2.2.1 取样器代码

package jmeter.sampler;import org.apache.jmeter.samplers.AbstractSampler;
import org.apache.jmeter.samplers.Entry;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.testelement.TestStateListener;/*** @author jy* MySampler MySampler*/
public class MySampler extends AbstractSampler implements TestStateListener {//自定义一个标识private static final String SEQ_CODE = "sequence.seqCode";private static final String DATE = "sequence.date";private static final String HTTPS_REQUEST = "sequence.requests";@Overridepublic SampleResult sample(Entry entry) {SampleResult result = new SampleResult();result.setSampleLabel("测试采样器");result.sampleStart();try {StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < 10000000; i++) {stringBuilder.append(i);}SequenceGeneratorClientApi sequenceGeneratorClientApi = new SequenceGeneratorClientApi();String snowFlake = sequenceGeneratorClientApi.getSnowFlake();result.setResponseCode("200");result.setResponseMessage(snowFlake);result.setSuccessful(true);} catch (Exception e) {result.setResponseCode("500");result.setResponseMessage(e.toString());} finally {result.sampleEnd();}return result;}public void setSeqCode(String seqCode) {setProperty(SEQ_CODE, seqCode);}public String getSeqCode() {return getPropertyAsString(SEQ_CODE);}public void setDate(String date) {setProperty(DATE, date);}public String getDate() {return getPropertyAsString(DATE);}public void setHttpsRequest(String requestsString){setProperty(HTTPS_REQUEST, requestsString);}public String getHttpsRequest(){return getPropertyAsString(HTTPS_REQUEST);}@Overridepublic void testStarted() {}@Overridepublic void testStarted(String s) {}@Overridepublic void testEnded() {}@Overridepublic void testEnded(String s) {}
}

2.2.2 取样器界面

核心逻辑是配置界面,绑定界面与取样器的参数

package jmeter.sampler;import org.apache.jmeter.gui.util.JSyntaxTextArea;
import org.apache.jmeter.gui.util.JTextScrollPane;
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 java.awt.*;//这个注解必须要有
@SuppressWarnings("deprecation")
public class MySamplerUI extends AbstractSamplerGui {private final JLabeledTextField seqCode = new JLabeledTextField("序列编码");private final JLabeledTextField date = new JLabeledTextField("会计日期");private final JLabeledTextField requestsStringField = new JLabeledTextField("替换符");private final JSyntaxTextArea textMessage = new JSyntaxTextArea(10, 50);private final JTextScrollPane textPanel = new JTextScrollPane(textMessage);public MySamplerUI() {super();this.init();}private void init() {setLayout(new BorderLayout());setBorder(makeBorder());add(makeTitlePanel(), BorderLayout.NORTH);JPanel mainPanel = new VerticalPanel();add(mainPanel, BorderLayout.CENTER);JPanel panel = new JPanel();panel.setLayout(new GridLayout(4, 2));panel.add(seqCode);panel.add(date);panel.add(requestsStringField);JPanel controlPanel = new VerticalPanel();controlPanel.add(panel);controlPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.gray), "参数"));mainPanel.add(controlPanel);//这是是输出JPanel contentPanel = new VerticalPanel();JPanel messageContentPanel = new JPanel(new BorderLayout());messageContentPanel.add(this.textPanel, BorderLayout.CENTER);contentPanel.add(messageContentPanel);contentPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.gray), "内容"));mainPanel.add(contentPanel);}/*** 该方法创建一个新的Sampler,然后将界面中的数据设置到这个新的Sampler实例中。**/@Overridepublic TestElement createTestElement() {MySampler sampler = new MySampler();this.setupSamplerProperties(sampler);return sampler;}/*** 该方法会在reset新界面的时候调用,这里可以填入界面控件中需要显示的一些缺省的值。**/@Overridepublic void clearGui() {super.clearGui();this.seqCode.setText("seq");this.date.setText("2024-09-24");this.requestsStringField.setText("123456");}/*** 界面与Sampler之间的数据交换* 该方法用于把Sampler中的数据加载到界面中。* 在实现自己的逻辑之前,先调用一下父类的方法super.configure(el),这样可以确保框架自动为你加载一些缺省数据,比如Sampler的名字。**/@Overridepublic void configure(TestElement el) {super.configure(el);MySampler sampler = (MySampler) el;this.seqCode.setText(sampler.getSeqCode());this.date.setText(sampler.getDate());this.requestsStringField.setText(sampler.getHttpsRequest());}private void setupSamplerProperties(MySampler sampler) {this.configureTestElement(sampler);sampler.setSeqCode(this.seqCode.getText());sampler.setDate(this.date.getText());sampler.setHttpsRequest(this.requestsStringField.getText());}/*** gui显示sample的名称**/@Overridepublic String getStaticLabel() {return "MySampler";}@Overridepublic String getLabelResource() {throw new IllegalStateException("This shouldn't be called");}/*** 这个方法用于把界面的数据移到Sampler中,刚好与上面的方法相反。* 在调用自己的实现方法之前,请先调用一下super.configureTestElement(e),这个会帮助移到一些缺省的数据。**/@Overridepublic void modifyTestElement(TestElement testElement) {MySampler sampler = (MySampler) testElement;this.setupSamplerProperties(sampler);}}

2.2.3 sdk接口封装

package jmeter.sampler;import org.example.service.impl.SequenceGeneratorClientImpl;/*** @author jy* SequenceGeneratorClientApi SequenceGeneratorClientApi*/
public class SequenceGeneratorClientApi {public static SequenceGeneratorClientImpl sequenceGeneratorClientImpl;public SequenceGeneratorClientApi() {sequenceGeneratorClientImpl = new SequenceGeneratorClientImpl();}public String getSnowFlake() {return sequenceGeneratorClientImpl.getSnowFlake();}}

3.源码打包

3.1 将sdk源码和采样器源码打成jar包

3.2 拷贝引用包

使用命令“mvn dependency:copy-dependencies -DoutputDirectory=lib”将所有引用的包拷贝到lib目录下

 将上面所有的jar包全部拷贝到jmeter的lib\ext文件夹目录下,注意不要覆盖jmeter原有的包,否则jmeter不能正常启动

4.配置jmeter脚本

4.1 选择自定义采样器

 4.2 界面里面配置参数

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

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

相关文章

小柴冲刺软考中级嵌入式系统设计师系列二、嵌入式系统硬件基础知识(3)嵌入式系统的存储体系

目录 感悟 一、存储系统的层次结构 存储器系统 二、内存管理单元 三、RAM和ROM的种类与选型 1、RAM RAM分类 2、ROM ROM分类 四、高速缓存Cache 五、其他存储设备 flechazohttps://www.zhihu.com/people/jiu_sheng 小柴冲刺软考中级嵌入式系统设计师系列总目录https…

CTF-SSH私钥泄露

CTF-SSH私钥泄露 一.信息探测--查看开放的服务--分析探测结果-- 探测大端口的信息 深入挖掘ssh信息![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6baf0b5de72d537c7093d3e2394d93cd.png#pic_center)解密ssh秘钥信息 工具&#xff1a;kali Linux 一.信息探测…

17.第二阶段x86游戏实战2-线程发包和明文包

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

Feign:服务挂了也不会走fallback

Feign 本质上是一个 HTTP 客户端&#xff0c;用于简化微服务之间的 HTTP 通信。它允许开发者通过定义接口和注解来声明式地编写 HTTP 客户端&#xff0c;而无需手动编写 HTTP 请求和响应处理的代码。 今天在模拟微服务A feign调用微服务B的时候&#xff0c;把微服务B关了&#…

C高级(Day22)

一、学习内容 shell指令 文件相关的指令 重定向 > >> echo :打印字符串 cat: 在终端打印文件的内容 链接文件 硬链接文件&#xff1a;文件的inode号是一样的。 查看文件inode号&#xff1a; ls -i 格式&#xff1a;ln 被链接的文件 创建硬链接文件 1 硬链接的文件…

计算机毕业设计 基于Python的医疗预约与诊断系统 Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

通用型pdf合并工具,分享7款简单易学的pdf处理软件,日常电脑必备!

日常学习和工作中&#xff0c;我们难免会遇到需要编辑pdf文件的情况。熟悉pdf格式文档的小伙伴都知道&#xff0c;pdf不易于编辑&#xff0c;需要借助专业的pdf编辑软件才能实现。现在pdf编辑、pdf转word、pdf合并、pdf拆分等功能都可以轻松实现。尽管如此&#xff0c;也有不少…

《动手学深度学习》笔记2.1——神经网络从基础→进阶 (层和块 - 自定义块)

目录 0. 前言 原书正文&#xff08;第五章&#xff09; 第五章 - 第一节 - 层和块 - 自定义块 1. Sequential() PyTorch高级API 2. MLP() 无传入参数 3. MySequential() 传入任意层(块) 4. FixedHiddenMLP() 无传入参数-固定隐藏层 5. NestMLP() 传入嵌套块-多次嵌套 …

Vue之axios请求

Vue之axios请求 axios请求, 是Vue前端框架非常重要的一部分, 今天我们就讲解axios请求, 到底有什么作用, 以及会告诉大家axios的常见用法。 axios请求, 是网页向后端发起请求, 后端吧数据给我们网页, 这是一个前后端交互的过程。当我们学会了axios, 我们可以实现前端和后端练…

【算法篇】二叉树类(2)(笔记)

目录 一、Leetcode 题目 1. 左叶子之和 &#xff08;1&#xff09;迭代法 &#xff08;2&#xff09;递归法 2. 找树左下角的值 &#xff08;1&#xff09;广度优先算法 &#xff08;2&#xff09;递归法 3. 路径总和 &#xff08;1&#xff09;递归法 &#xff08;2…

H. Sakurako‘s Test

H. Sakurakos Test 原题 本题通过前缀和和二分可以解决, 原理并不是很困难, 但是比较难想到 我们只需要对每一个 x, 二分求出中位数, 预处理好即可, 二分的检查通过求k倍的x可以在调和级数的时间内实现 代码 #include <bits/stdc.h> #define int long longusing name…

mysql索引 -- 聚簇索引,非聚簇索引,如何查看linux下的数据库文件,普通/辅助索引(回表查询)

目录 聚簇索引和非聚簇索引 聚簇索引 介绍 示例 查看当前的数据库数据目录 表文件 非聚簇索引 介绍 myisam 示例 普通(辅助)索引 引入(回表查询) mysql索引结构详细介绍 -- mysql索引 -- 索引的硬件理解(磁盘,磁盘与系统),软件理解(mysql,与系统io,buffer pool),索…

基于SpringBoot的新冠检测信息管理系统的设计与实现

文未可获取一份本项目的java源码和数据库参考。 国内外在该方向的研究现状及分析 新型冠状病毒肺炎疫情发生以来&#xff0c;中国政府采取积极的防控策略和措施&#xff0c;经过两个多月的不懈努力&#xff0c;有效控制了新发病例的増长&#xff0c;本地传播已经趋于完全控制…

【Java】六大设计原则和23种设计模式

目录 一、JAVA六大设计原则 二、JAVA23种设计模式 1. 创建型模式 2. 结构型模式 3. 行为型模式 三、设计原则与设计模式 1. 设计原则 2. 设计模式 四、单例模式 1. 饿汉式 2. 懒汉式 四、代理模式 1. 什么是代理模式 2. 为什么要用代理模式 3. 有哪几种代理模式 …

并发面试合集

1.创建线程的方式 区分线程和线程体的概念&#xff0c;线程体通俗点说就是任务。创建线程体的方式&#xff1a;像实现Runnable、Callable接口、继承Thread类、创建线程池等等&#xff0c;这些方式并没有真正创建出线程&#xff0c;严格来说&#xff0c;Java就只有一种方式可以…

MySQl查询分析工具 EXPLAIN ANALYZE

文章目录 EXPLAIN ANALYZE是什么Iterator 输出内容解读EXPLAIN ANALYZE和EXPLAIN FORMATTREE的区别单个 Iterator 内容解读 案例分析案例1 文件排序案例2 简单的JOIN查询 参考资料&#xff1a;https://hackmysql.com/book-2/ EXPLAIN ANALYZE是什么 EXPLAIN ANALYZE是MySQL8.…

有问题未解决(9.28)

#include <stdio.h> int main() {int a 1;int b 2;int c 3;int arr[] { a,b,c };arr[0] 10;printf("%d\n", a);//打印结果为1&#xff1b;return 0; } 颠覆认知了&#xff0c;或许也没有颠覆 arr是一个int类型的数组&#xff0c;他存的就是一个数&…

Arch - 架构安全性_保密(Confidentiality)

文章目录 OverView导图保密保密强度与成本客户端加密密码存储与验证 Code总结 OverView 即使只限定在“软件架构设计”这个语境下&#xff0c;系统安全仍然是一个很大的话题。 接下来我们将对系统安全架构的各个方面进行详细分析&#xff0c;包括认证、授权、凭证、保密、传输…

JSP(Java Server Pages)基础使用二

简单练习在jsp页面上输出出乘法口诀表 既然大家都是来看这种代码的人了&#xff0c;那么这种输出乘法口诀表的这种简单算法肯定是难不住大家了&#xff0c;所以这次主要是来说jsp的使用格式问题。 <%--Created by IntelliJ IDEA.User: ***Date: 2024/7/18Time: 11:26To ch…

大厂AI必备数据结构与算法——链表(三)详细文档

冲冲冲&#xff01;开干 神马&#xff01;神马&#xff01;神马&#xff0c;一向让我们学习起来抓耳挠腮的数据结构课程竟然也有教程&#xff1f;还那么详细&#xff1f;&#xff1f;真的假的&#xff1f; 那么好&#xff0c;胡广告诉你是假的&#xff0c;哈哈哈哈哈哈哈哈哈…