Jmeter自定义Java请求

一、需求背景

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

二、准备工作

1、创建Maven工程

Jmeter自定义Java请求

 

2、引入Jmeter相关Jar包

Jmeter自定义Java请求

其中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():测试结束方法,用于结束性能测试中的每个线程。

2、Demo实例

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/dynamic-info/released/page-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工具进行打包

Jmeter自定义Java请求

打包成功后在相关jar在target目录下,将打好的jar包放到jmeter安装目录lib/ext目录下

Jmeter自定义Java请求

2、Jmeter如何使用

Jmeter自定义Java请求

此时,按照正常Jmeter使用流程,点击运行按钮,即可正常进行压测

五、小结

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

上一篇:Jmeter 接口调试方案


下一篇:如何实现Jmeter录制脚本