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

这篇具有很好参考价值的文章主要介绍了使用Java开发Jmeter自定义取样器(Sampler)插件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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);
    }

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

    @Override
    public String getLabelResource() {
        return null;
    }

    @Override
    public TestElement createTestElement() {
        TestGuiSampler sample = new TestGuiSampler();
        return sample;
    }

    @Override
    public void modifyTestElement(TestElement testElement) {
        testElement.clear();
        configureTestElement(testElement);
        testElement.setProperty(TestGuiSampler.URL, urlField.getText());
        testElement.setProperty(TestGuiSampler.USERID, useridField.getText());
    }

    @Override
    public boolean canBeAdded() {
        return super.canBeAdded();
    }
    @Override
    public String getStaticLabel() {
        return "TestGuiHttpSampler测试";
    }
    @Override
    public 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请求中”,在面板的下拉框中可以看到实现的扩展类名并选择。
使用Java开发Jmeter自定义取样器(Sampler)插件,持续交付,java,java,jmeter,开发语言

使用Java开发Jmeter自定义取样器(Sampler)插件,持续交付,java,java,jmeter,开发语言

3.2、AbstractSamplerGui运行效果

在线程组上右键,在取样器的子菜单中,能看到实现的扩展类"TestGuiHttpSampler测试",选择即可
使用Java开发Jmeter自定义取样器(Sampler)插件,持续交付,java,java,jmeter,开发语言

使用Java开发Jmeter自定义取样器(Sampler)插件,持续交付,java,java,jmeter,开发语言

3.3、监听器-查看结果树

使用Java开发Jmeter自定义取样器(Sampler)插件,持续交付,java,java,jmeter,开发语言

3.4、监听器-聚合报告

使用Java开发Jmeter自定义取样器(Sampler)插件,持续交付,java,java,jmeter,开发语言
源码下载文章来源地址https://www.toymoban.com/news/detail-674504.html

到了这里,关于使用Java开发Jmeter自定义取样器(Sampler)插件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用WebDriver采样器将JMeter与Selenium集成

    第一步: 在JMeter中添加Selenium / WebDriver插件 第二步: 创建一条测试计划–添加线程组 添加配置元素 - jp@gc - WebDriver Sampler 添加配置元素 - jp@gc - Chrome Driver Config 并且添加监听器查看结果树 第三步: 下载 chromedriver.exe 如上图所示在 Chrome Driver Config 中Path to Chrome Driver 位置填写

    2024年02月11日
    浏览(19)
  • 【P26】JMeter WebSocket Sampler

    下载路径:https://jmeter-plugins.org/install/Install/ (1)、打开网页,点击 plugins-manager.jar 进行下载 (2)、下载成功后,会得到一个 jmeter-plugins-manager-1.8.jar 的包 (3)、复制或剪切下载的 jmeter-plugins-manager-1.8.jar 包,放到 JMeter 安装路径 …/lib/ext 下 (4)、启动 Jmeter,点击选项,

    2024年02月09日
    浏览(20)
  • JMeter扩展开发:自定义函数

    强大的扩展性是压力测试工具 JMeter 的一个重要特点。虽然本身内置的函数、协议支持有限,但是 JMeter 提供了良好的扩展框架,允许使用者对其进行扩展。 本文将介绍如何利用 JMeter 的扩展性来实现自定义的函数,用户可以通过此方式扩展出性能测试过程中所需要的函数功能

    2024年02月10日
    浏览(26)
  • Jmeter 压测实战:Jmeter 二次开发之自定义函数

    目录 1 前言 2 开发准备 3 自定义函数核心实现 3.1 新建项目 3.2 继承实现 AbstractFunction 类 3.3 最终项目结构 4 Jmeter 加载扩展包 4.1 maven 构建配置 4.2 项目打包 4.3 Jmeter 加载扩展包 5 自定义函数调用调试 5.1 打开 Jmeter 函数助手,选择自定义函数 5.2 京东宙斯接口验证 JMeter 是一个开

    2024年02月16日
    浏览(32)
  • Jmeter压测实战:Jmeter二次开发之自定义函数

    Jmeter是Apache基金会下的一款应用场景非常广的压力测试工具,具备轻量、高扩展性、分布式等特性。Jmeter已支持实现随机数、计数器、时间戳、大小写转换、属性校验等多种函数,方便使用人员使用。如果在使用过程中存在和业务强耦合的常用功能函数,在Jmeter不支持的情况

    2024年02月11日
    浏览(24)
  • Idea Maven 构建,运行Java程序,二次开发Jmeter

    【官网】https://maven.apache.org/download.cgi 【其他版本】https://dlcdn.apache.org/maven/maven-3/ 在Idea界面上关闭所有项目,全局配置: Ctrl + Alt + S 打开设置,搜索maven,配置如下 2. 配置运行程序Runner 【阿里云效】https://developer.aliyun.com/mvn/guide 右击Java - New - Package 输入package名称 - 新建Ja

    2024年02月11日
    浏览(33)
  • 【Java基础】压测工具JMeter使用简介

    Apache JMeter是一个基于Java开发的开源性能测试工具,由Apache软件基金会维护 JMeter最初设计用于Web应用测试,但它的功能已经扩展到其他测试领域。JMeter可以用于测试静态和动态资源,如静态文件、Java小服务程序、CGI脚本、Java对象、数据库和FTP服务器等。它能够对服务器、网

    2024年04月27日
    浏览(28)
  • HarmonyOS鸿蒙基于Java开发: Java UI 自定义布局

    当Java UI框架提供的布局无法满足需求时,可以创建自定义布局,根据需求自定义布局规则。 Component类相关接口  表1  Component类相关接口 接口名称 作用 setEstimateSizeListener 设置测量组件的侦听器 setEstimatedSize 设置测量的宽度和高度 onEstimateSize 测量组件的大小以确定宽度和高度

    2024年02月19日
    浏览(42)
  • 使用jmeter做性能测试时遇到java.lang.OutOfMemoryError: Java heap space. 提示怎么办

    使用jmeter做性能测试遇到java.lang.OutOfMemoryError: Java heap space.时是jvm的问题,需要调大jvm的内存,windows压力机通过编辑bin文件下的jmeter.bat文件来修改jvm的内存大小。在jmeter.bat文件的编辑状态下查询if not defined HEAP可快速查找到需要修改的位置。 修改前为默认大小: 修改后(根

    2024年02月16日
    浏览(46)
  • stable diffusion webui中的sampler

    Stable Diffusion-采样器篇 - 知乎 采样器:Stable Diffusion的webUI中,提供了大量的采样器供我们选择,例如Eular a, Heum,DDIM等,不同的采样器之间究竟有什么区别,在操作时又该如何进行选择,本文将会详细讲解采样器是如何工作的,以及各种采… https://zhuanlan.zhihu.com/p/621083328 h

    2024年02月09日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包