java开发jmeter采样器

devtools/2024/9/25 9:33:39/

目录

1.前言

2.新建一个springboot工程

2.1 引入相关依赖

2.2 编写核心代码

2.2.1 取样器代码

2.2.2 取样器界面

2.2.3 sdk接口封装

3.源码打包

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

3.2 拷贝引用包

jmeter%E8%84%9A%E6%9C%AC-toc" style="margin-left:0px;">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 取样器代码

java">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 取样器界面

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

java">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接口封装

java">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不能正常启动

jmeter%E8%84%9A%E6%9C%AC">4.配置jmeter脚本

4.1 选择自定义采样器

 4.2 界面里面配置参数


http://www.ppmy.cn/devtools/116902.html

相关文章

宝塔部署vue项目出现的各种问题

使用宝塔面板&#xff0c;网站页面&#xff0c;构建php静态网页 问题一&#xff1a;图片等静态资源无法加载 找到真正请求的url&#xff0c; 然后在项目目录下面创建对应的目录&#xff0c;将资源放入 问题二&#xff1a;刷新出现404 在这里任意位置添加 ## 添加上这个配…

MODIS/Landsat/Sentinel下载教程详解【常用网站及方法枚举】

⛄前言 在当今快速发展的地球观测时代&#xff0c;遥感技术作为获取地球表面及其环境信息的重要手段&#xff0c;正以前所未有的广度和深度改变着我们对自然界的认知与管理方式。MODIS&#xff08;Moderate-resolution Imaging Spectroradiometer&#xff0c;中分辨率成像光谱…

滚雪球学SpringCloud[6.3讲]: 分布式日志管理与分析

全文目录&#xff1a; 前言1. 分布式日志管理的核心挑战2. ELK Stack&#xff08;Elasticsearch、Logstash、Kibana&#xff09;的使用2.1 什么是ELK Stack&#xff1f;2.2 安装与配置ELK Stack2.3 配置Logstash2.4 使用Kibana进行日志可视化 3. Spring Boot与ELK的集成3.1 配置…

SpringAop

SprinAOP的底层实现基于动态代理&#xff08;JDK CGLIB&#xff09;。 AOP主要应⽤于⽇志记录&#xff0c;性能统计&#xff0c;安全控制&#xff0c;事务处理等⽅⾯&#xff0c;实现公共功能性的重复使⽤。 JDK动态代理 注&#xff1a;要求目标对象有接口实现 通过Proxy类…

React组件如何暴露自身的方法

一、研究背景 最近遇到一个如何暴露React组件自身方法的问题。在某些时候&#xff0c;我们需要调用某个组件内部的方法以实现某个功能&#xff0c;因此我们需要了解如何暴露组件内部API的方法。 二、实践过程 本文主要介绍React组件暴露子组件API的方法&#xff0c;以下是实…

关于前端vue3+element-plus项目正常安装运行时未报错,但是前端界面老是空白问题及解决方案(其他使用nodejs的框架同理)

框架介绍 整个项目使用了gin-vue-amdin前端是vue3element-plus 问题 前端npm install 安装成功后&#xff0c;并且npm run serve也成功运行&#xff08;控制台安装及运行没有任何报错信息&#xff09;。但是前端运行后&#xff0c;启动访问前端界面一直空白&#xff0c;但是…

Java List初始化的六种方式

在日常的开发中,List作为我们常用的一种数据结构,那么有谁了解过在Java中如何对一个List进行初始化操作。在这些初始化操作中又有哪些遇到的坑呢? 1、常规方式 List<String> languageList = new ArrayList<>(); languageList.add("Java"); language…

《数据压缩入门》笔记-Part 2

一篇文章显得略长&#xff0c;本文对应原书6-10章。序言、前言、第1-5章&#xff0c;请参考Part 1&#xff0c;第11-15章&#xff0c;请参考Part 3。 自适应统计编码 位置对熵的重要性 统计编码有一个问题&#xff1a;在编码开始之前都需要遍历一次数据&#xff0c;以计算出…