java开发jmeter采样器

news2024/9/24 17:54:45

目录

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";

    @Override
    public 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);
    }

    @Override
    public void testStarted() {

    }

    @Override
    public void testStarted(String s) {

    }

    @Override
    public void testEnded() {

    }

    @Override
    public 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实例中。
     **/
    @Override
    public TestElement createTestElement() {
        MySampler sampler = new MySampler();
        this.setupSamplerProperties(sampler);
        return sampler;
    }

    /**
     * 该方法会在reset新界面的时候调用,这里可以填入界面控件中需要显示的一些缺省的值。
     **/
    @Override
    public void clearGui() {
        super.clearGui();
        this.seqCode.setText("seq");
        this.date.setText("2024-09-24");
        this.requestsStringField.setText("123456");

    }

    /**
     * 界面与Sampler之间的数据交换
     * 该方法用于把Sampler中的数据加载到界面中。
     * 在实现自己的逻辑之前,先调用一下父类的方法super.configure(el),这样可以确保框架自动为你加载一些缺省数据,比如Sampler的名字。
     **/
    @Override
    public 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的名称
     **/
    @Override
    public String getStaticLabel() {
        return "MySampler";
    }

    @Override
    public String getLabelResource() {
        throw new IllegalStateException("This shouldn't be called");
    }

    /**
     * 这个方法用于把界面的数据移到Sampler中,刚好与上面的方法相反。
     * 在调用自己的实现方法之前,请先调用一下super.configureTestElement(e),这个会帮助移到一些缺省的数据。
     **/
    @Override
    public 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.coloradmin.cn/o/2161011.html

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

相关文章

“一屏显江山”,激光显示重构「屏中世界」

【潮汐商业评论/原创】 2024年国庆期间&#xff0c;曾感动过无数国人的舞蹈诗剧《只此青绿》改编的同名电影即将上映&#xff0c;而这一次观众们不必走进电影院&#xff0c;在家里打开官方合作的海信激光电视也能享受到同等的视听效果&#xff0c;这是激光电视在观影场景领域的…

【卡片 / A】

题目 代码 #include <bits/stdc.h> using namespace std; int cnt[10]; bool consume(int x) {int need[10] {0};while (x){int k x % 10;need[k];x / 10;}for (int i 0; i < 10; i){if (cnt[i] < need[i])return false;}for (int i 0; i < 10; i){cnt[i] …

基于 RealSense D435i相机实现手部姿态检测

基于 RealSense D435i相机进行手部姿态检测&#xff0c;其中采用 Mediapipe 进行手部检测&#xff0c;以下是详细步骤&#xff1a; Mediapipe 是一个由 Google开发的开源框架&#xff0c;专门用于构建多媒体处理管道&#xff0c;特别是计算机视觉和机器学习任务。它提供了一系列…

OLED(2)驱动篇

文章目录 1 概述2 代码简述2.1 OLED 对象2.2 OLEDProtocol 对象2.3 OLEDFont 对象 3 成果展示 1 概述 1&#xff09;代码仓库&#xff1a;这里尝试了两种面向对象的方式&#xff0c;不足之处敬请指正。 OOP 方式&#xff1a;https://gitee.com/luyaocf/demo-jlc_stm32f407_oop.…

【逐行注释】扩展卡尔曼滤波EKF和粒子滤波PF的效果对比,MATLAB源代码(无需下载,可直接复制)

文章目录 总述源代码运行结果改进方向总述 本代码使用 M A T L A B MATLAB MATL</

2024最新金九银十必问面试题大全

我花了三天时间&#xff0c;整理了100道最经典的常见测试面试题&#xff08;附答案&#xff09;&#xff01;完整版文档见文末&#xff01; 1、所做项目的情况&#xff0c;主要做什么类型的测试&#xff1f; 2、你在测试中发现了一个bug&#xff0c;但是开发经理认为这不是一…

基于yolov5的中国交通标志TT100K检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv5的中国交通标志TT100K检测系统是一种利用深度学习技术实现高效、准确交通标志识别的系统。该系统采用YOLOv5作为核心检测算法&#xff0c;凭借其速度快、准确性高的特点&#xff0c;在实时交通标志识别领域展现出显著优势。 TT100K数据集作为该系统的…

【学术会议征稿】2024年先进控制系统与自动化技术国际学术会议(ACSAT 2024)

2024年先进控制系统与自动化技术国际学术会议&#xff08;ACSAT 2024&#xff09; 2024 International Conference on Advanced Control Systems and Automation Technologies 2024年先进控制系统与自动化技术国际学术会议&#xff08;ACSAT 2024&#xff09;将于2024年11月15…

大模型推理革新:探索思维图(DoT)框架的逻辑与应用

姚期智院士领衔推出了大模型新推理框架&#xff0c;CoT的“王冠”已难以承载。 提出了思维图&#xff08;Diagram of Thought&#xff0c;DoT&#xff09;&#xff0c;使大模型的思考方式更接近人类。 团队为这一推理过程提供了数学基础&#xff0c;通过拓扑斯理论&#xff0…

【Finetune】(六)、transformers之IA-3微调

文章目录 0、IA-3基本原理1、IA-3微调实战1.1、导包1.2、加载数据集1.3、数据预处理1.4、创建模型1.5、LORA微调1.5.1、配置文件1.5.2、创建模型 1.6、配置训练参数1.7、创建训练器1.8、模型训练1.9、模型推理 0、IA-3基本原理 IA3的基本思想就是抑制和放大内部激活&#xff0c…

外包功能测试干了4年,技术退步太明显了。。。。。

先说一下自己的情况&#xff0c;本科生生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了差不多4年的功能测试&#xff0c;今年中秋&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能…

详细七种msvcr71.dll丢失的解决方法,快速修复错误的msvcr71.dll问题

今天&#xff0c;我打算跟大家分享一个有关电脑提示“msvcr71.dll丢失”的问题&#xff0c;并且会给出7种msvcr71.dll丢失的解决方法。但愿在大家工作期间遇到类似问题的时候&#xff0c;这些方法能够起到一定的帮助作用。同时在帮助大家了解msvcr71.dll文件。 如果遇到“msvcr…

面试知识点总结篇二

一、makefile链接库参数 LIBS -L/path/to/lib -lmylib//&#xff0c;-lmylib会链接名为libmylib.so或libmylib.a的库。all: myprogrammyprogram: myprogram.ogcc -o myprogram myprogram.o $(LIBS)//此处使用myprogram.o: myprogram.cgcc -c myprogram.c二、shell指令 Shell…

JAVA开源项目 影城管理系统 计算机毕业设计

本文项目编号 T 045 &#xff0c;文末自助获取源码 \color{red}{T045&#xff0c;文末自助获取源码} T045&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 用…

无人机视角下的车辆数据集

车辆数据集 无人机视角下的车辆数据集。数据集为无人机俯拍的真实场景下的车辆机动车数据集。数据集已经标注好&#xff0c;yolo格式&#xff0c;txt标签。数据集已经划分好训练集&#xff08;20970张图片&#xff09;验证集&#xff08;5242张图片&#xff09;测试集&#xff…

企业级Windows server服务器技术(1)

windows server服务器安装 准备工作&#xff1a; 1.准备安装的镜像 2.安装好虚拟机VMware或者virtual box 3.准备安装的位置&#xff08;选择你的电脑的磁盘上比较空闲的位置&#xff0c;新建一个文件夹并命名&#xff09; 4.开始安装&#xff08;按步骤&#xff09;----…

Threejs绘制圆锥体

上一章节实现了胶囊体的绘制&#xff0c;这节来绘制圆锥体&#xff0c;圆锥体就是三角形旋转获得的&#xff0c;如上文一样&#xff0c;先要创建出基础的组件&#xff0c;包括场景&#xff0c;相机&#xff0c;灯光&#xff0c;渲染器。代码如下&#xff1a; initScene() {this…

电力系统中有哪些好的运维的平台?

摘要&#xff1a;介绍台商大厦&#xff0c;采用综合保护装置、多功能仪表、变压器温控仪、直流屏、烟雾传感器、门磁开关、网络摄像头等设备&#xff0c;采集配电现场的各种电参量和状态信号。系统采用现场就地组网的方式&#xff0c;组网后通过现场网关远传至阿里云平台&#…

【模板进阶】std::enable_if

一、 SFINAE 在介绍 s t d : : e n a b l e _ i f std::enable\_if std::enable_if之前&#xff0c;先介绍一个概念&#xff1a; S F I N A E SFINAE SFINAE&#xff0c;全称是&#xff1a; S u b s t i t u t i o n F a i l u r e i s n o t a n E r r o r Substitution\ Fai…

【java21】java21新特性之JavaDoc中支持代码片段

在Java18之前&#xff0c;已经支持在JavaDoc中引入代码片段&#xff0c;这样可以在某些场景下更好的展示描述信息&#xff0c;但是之前的支持功能有限&#xff0c;比如我想高亮代码片段中的某一段代码是无能为力的。现在Java18优化了这个问题&#xff0c;增加了snippet来引入更…