Jmeter自定义Java请求

一、需求背景

在日常压测过程中,有些请求逻辑比较复杂的时候,Jmeter 中自带的sample取样器不够灵活,或者性能就会比较低了,这个时候就可以自己写java代码实现自己的请求。

二、准备工作

1、创建Maven工程

在这里插入图片描述

2、引入Jmeter相关Jar包

在这里插入图片描述
其中ApacheJMeter_core和ApacheJMeter_java2个jar是自定义Jmeter请求的核心开发包,两个jar包的版本需要和你本地jmeter版本保持一致,防止因为版本不一致出现问题,unirest-java该jar包主要用于发送get、post请求

相关jar可以去 https://mvnrepository.com/ 查询引用

3、配置maven打包插件

 <build>

        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>

                <artifactId>maven-compiler-plugin</artifactId>

                <version>3.8.1</version>

                <configuration>

                    <source>1.8</source>

                    <target>1.8</target>

                </configuration>

            </plugin>


            <plugin>
                <groupId>org.apache.maven.plugins</groupId>

                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>

                <configuration>

                    <descriptorRefs>

                        <descriptorRef>jar-with-dependencies</descriptorRef>

                    </descriptorRefs>

                </configuration>

                <executions>

                    <execution>

                        <id>make-assembly</id>

                        <phase>package</phase>

                        <goals>

                            <goal>single</goal>

                        </goals>

                    </execution>

                </executions>

            </plugin>

        </plugins>

    </build>

三、开始

1、创建Java测试类

新建一个类,类名为任意取,遵循Java命名规范即可,该类继承AbstractJavaSamplerClient类,AbstractJavaSamplerClient存在于ApacheJMeter_java.jar这个JAR包中,引用即可调用。

常用的4个方法如下:
setupTest(): 初始化方法,用于初始化性能测试时的每个线程;

getDefaultParameters(): 主要用于设置传入的参数;

runTest(): 为性能测试时的线程运行体;该方法在测试类继承AbstractJavaSamplerClient类时,必须实现的方法

teardownTest(): 测试结束方法,用于结束性能测试中的每个线程。

package com.apache.jmeter.functions;

import kong.unirest.HttpResponse;
import kong.unirest.JsonNode;
import kong.unirest.Unirest;
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 java.io.Serializable;
import java.util.HashMap;

/**
 * Created by YangWeiMin on 2021/12/6
 */
public class PageQuery extends AbstractJavaSamplerClient implements Serializable {

    // 该部分主要设置一些静态变量,可以是接口请求参数或者其他变量
    private static final String env = "xxxxx";
    private static final String creatorUserCode = "xxxxxx";
    private static final Integer offset = xxxxx;
    private static final String releaseTimeFrom = "xxxxxxx";
    private static final String releaseTimeTo = "xxxxxx";
    private static final Integer size = xxxxxx;
    private static final String dynamicInfoCode = null;
    private static final String url = env + "/api/xxxxx/query";
    private static final String token = null;


    // 该部分代码主要设置Unirest连接池配置
    static {
        Unirest.config().concurrency(1000, 100);
    }

    
    // 该部分代码主要是用于设置参数显示,此处设置的参数可以在jmeter中展示
    @Override
    public Arguments getDefaultParameters() {
        Arguments arguments = new Arguments();
        arguments.addArgument("env", env);
        arguments.addArgument("creatorUserCode", creatorUserCode);
        arguments.addArgument("offset", String.valueOf(offset));
        arguments.addArgument("releaseTimeFrom", releaseTimeFrom);
        arguments.addArgument("releaseTimeTo", releaseTimeTo);
        arguments.addArgument("size", String.valueOf(size));
        arguments.addArgument("dynamicInfoCode", dynamicInfoCode);
        arguments.addArgument("token", token);
        return arguments;
    }

    /**
     * 执行测试,测试的逻辑写在此处
     *
     * @param context 请求参数
     * @return 请求结果
     */
    @Override
    public SampleResult runTest(JavaSamplerContext context) {
        SampleResult sampleResult = new SampleResult();
        sampleResult.sampleStart();  // 开启计时
        HashMap<String, Object> data = new HashMap<>();
        HashMap<String, String> headers = new HashMap<>();
        try {
            data.put("creatorUserCode", context.getParameter("creatorUserCode")); // context.getParameter功能是获取jmeter中填写的参数
            data.put("dynamicInfoCode", context.getParameter("dynamicInfoCode"));
            data.put("offset", context.getParameter("offset"));
            data.put("releaseTimeFrom", context.getParameter("releaseTimeFrom"));
            data.put("releaseTimeTo", context.getParameter("releaseTimeTo"));
            data.put("size", size);
            headers.put("Content-Type", "application/json");
            headers.put("Authorization", context.getParameter("token"));
            HttpResponse<JsonNode> response = Unirest.post(url)
                    .headers(headers)
                    .body(data)
                    .asJson();
            if (response.getStatus() != 200) {
                sampleResult.setSuccessful(false);
            }
            sampleResult.setResponseData(response.getBody().toPrettyString(), "utf-8");
            sampleResult.setResponseCodeOK();
            System.out.println("Response data==> " + response.getBody().toPrettyString());
            sampleResult.setSuccessful(true);

        } catch (Exception e) {
            System.out.println("请求失败:" + e.getMessage());
            sampleResult.setSuccessful(false);
        } finally {
            sampleResult.sampleEnd();  // 结束计时
        }
        return sampleResult;

    }
}

四、Jmeter运行

1、编译打包

相关代码编写完成后,使用Idea工具自带的Maven工具进行打包
在这里插入图片描述
打包成功后在相关jar在target目录下,将打好的jar包放到jmeter安装目录lib/ext目录下
在这里插入图片描述

2、Jmeter如何使用

在这里插入图片描述
此时,按照正常Jmeter使用流程,点击运行按钮,即可正常进行压测

五、小结

Jmeter是用java语言开发的,所以我们可以用java开发出代码,可以直接使用,希望大家可以学习到知识。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您想了解如何使用Jmeter自定义Java请求,并继承AbstractJavaSamplerClient类。下面是一个简单的示例: 1. 创建一个Java类并继承AbstractJavaSamplerClient类,例如: ``` public class MyJavaSampler extends AbstractJavaSamplerClient { // 实现必要的方法 } ``` 2. 实现runTest方法,这个方法会被Jmeter调用执行,例如: ``` public void runTest(JavaSamplerContext context) { // 获取参数 String arg1 = context.getParameter("arg1"); String arg2 = context.getParameter("arg2"); // 执行业务逻辑 // ... // 设置响应结果 SampleResult result = new SampleResult(); result.setSuccessful(true); result.setResponseCodeOK(); result.setResponseMessage("Success"); result.setResponseData("Response Data".getBytes()); // 设置响应时间 result.sampleEnd(); // 返回响应结果 return result; } ``` 3. 实现getDefaultParameters方法,这个方法会返回默认的参数列表,例如: ``` public Arguments getDefaultParameters() { Arguments args = new Arguments(); args.addArgument("arg1", "default value"); args.addArgument("arg2", "default value"); return args; } ``` 4. 将编译好的Java类打包成jar文件,放到Jmeter的lib/ext目录下。 5. 在Jmeter中添加测试计划,并添加一个Java请求,选择刚才打包好的jar文件和类名。 6. 配置Java请求的参数,例如: ``` arg1=value1 arg2=value2 ``` 7. 运行测试计划,查看响应结果。 以上就是使用Jmeter自定义Java请求的简单示例,希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值