Administrator
发布于 2025-04-12 / 31 阅读
0
4

Jmeter二次开发--自定义函数

引言

jmeter本身的函数助手,已经满足大多数使用场景了,但是某些特殊的场景还是无法满足,比如报文加解密转换、生成特定算法的key等等等等,与你的业务强关联的功能,这些场景无法用jmeter的原生函数满足,那就需要单独开发自定义函数实现这些特定功能。

当然,实现这些功能的方式不止函数一种,还可以用beanshell、groove等,也可以自己开发一个mock服务通过http方式实现,本文仅使用jmeter工具,深入理解jmeter的高扩展性特性、以及其对java的高兼容特性。

本文使用以Jmeter工具函数助手的源码为示例,基于源码,使用java代码进行二次开发,仅需一次开发,后续所有项目都可直接通过函数助手使用。

1.目标功能

需求场景

目标

某业务采用TCP协议进行报文交互,而TCP报文采用特定格式,以J开头,J以后的部分,1-8位,不足8位左边补0;9-20位,不足12位右补x;21-32位,不足12位右边补EF

例:

J00001234xxxxyyyy0000ABCDABCDEFEF

jmeter二次开发一个函数,名为contactStrings,输入原字符串、方向、补位字符串,输出结果字符串

例:${__contactStrings(,,,)}

需要输入4个参数,第一个是原始字符串,第二是位数,第三是补位字符串,第四是左边或者右边

输入1234、8、0、left;输出00001234

输入ABCD、12、EF、right;输出ABCDABCDEFEF

2.准备工作

1、环境:Java1.8、Maven 3.以上x、jmeter 5.x以上。

2、开发工具:Windows IDEA。

本人的环境如下图:

函数助手的jmeter核心依赖包有3个,如下:

ApacheJMeter_core
ApacheJMeter_java
ApacehJMeter_functions

这3个依赖包在jmeter的lib/ext目录下,如果你的网络环境是内网无法访问Maven官网下载依赖包,那么可通过idea手动引入这3个包。

3.新建项目并配置依赖

3.1.IDEA新增项目

如下图

创建好以后如下

点击pom.xml,新增版本配置和jmeter依赖

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <jmeter-version>5.6.3</jmeter-version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_core</artifactId>
            <version>${jmeter-version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_java</artifactId>
            <version>${jmeter-version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_functions</artifactId>
            <version>${jmeter-version}</version>
        </dependency>
    </dependencies>

3.2.引入依赖

点击刷新按钮,加载依赖包

等待加载完成

4.代码实现

我们需要重写以下4个方法,

package org.example.functions;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.functions.AbstractFunction;
import org.apache.jmeter.functions.InvalidVariableException;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;

import java.util.Collection;
import java.util.List;

public class JmeterFunctions extends AbstractFunction {
    @Override
    public String execute(SampleResult sampleResult,Sampler sampler) throws InvalidVariableException {
        return null;
    }

    @Override
    public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
    }
    @Override
    public String getReferenceKey() {
        return null;
    }
    @Override
    public List<String> getArgumentDesc() {
        return null;
    }
}

具体代码如下:

package org.example.functions;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.functions.AbstractFunction;
import org.apache.jmeter.functions.InvalidVariableException;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;
import org.apache.commons.lang3.StringUtils;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

public class JmeterFunctions extends AbstractFunction {
    //自定义函数名称,也就是函数助手下显示的函数名称
    private static final String KEY = "__contactStrings";
    //自定义输入参数列表及参数说明
    private static List<String> desc = new LinkedList<String>();
    static {
        //${__contactStrings(,,,)} 需要输入4个参数,第一个是原始字符串,第二是位数,第三是补位字符串,第四是左边或者右边
        desc.add("Please input source Strings");//第一个参数描述:原始字符串
        desc.add("Please input digit");//第2个参数描述:位数
        desc.add("Please input addStrings");//第3个参数描述:补位字符串,需要用什么字符串来补位
        desc.add("Please input direction");//第4个参数描述:左补还是右补,只有left和right两个值
    }

    //使用数组保存输入的所有参数
    private Object[] inputValues;
    //保存获取到的每个参数的值
    String parameter1,parameter3,parameter4,response;
    int parameter2;//位数是int类型

    @Override
    public String execute(SampleResult sampleResult,Sampler sampler) throws InvalidVariableException {
        parameter1 = ((CompoundVariable) inputValues[0]).execute().trim();//分别拿到每个参数,进行处理
        parameter2 = Integer.parseInt(((CompoundVariable) inputValues[1]).execute().trim());
        parameter3 = ((CompoundVariable) inputValues[2]).execute().trim();
        parameter4 = ((CompoundVariable) inputValues[3]).execute().trim();
        if (parameter4.equals("left")){
            response = StringUtils.leftPad(parameter1,parameter2,parameter3);
        }else if (parameter4.equals("right")){
            response = StringUtils.rightPad(parameter1,parameter2,parameter3);
        }else {
            response = "Input error!";
        }
        return response;
    }

    @Override
    public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
        checkParameterCount(collection,4);//检查参数数量
        inputValues = collection.toArray();//将输入的变量存入数组
    }
    /**返回函数名称**/
    @Override
    public String getReferenceKey() {
        return "__contactStrings";
    }
    /**函数功能描述**/
    @Override
    public List<String> getArgumentDesc() {
        return desc;
    }
}

5.打包部署

将编译打包生成的Jar包放置jmeter的lib/ext目录下,并且重启jmeter

6.成果检验

重启jmeter后,打开函数助手,找到我们自定义的函数

填入参数,验证函数是否正确


评论