JMeter之函数二次开发/插件开发(附代码)

JMeter中函数二次开发?思路是什么?

1、JMeter提供了接口给用户进行二次开发,其中接口可通过引入ApacheJMeter_components.jar、ApacheJMeter_core.jar两个包获取。(或许你看到别人介绍所要用的jar包会更多,其实正常开发就这两个,所以至少保证有这两个包即可)

2、开发的代码需要符合JMeter的规范:第一,新建的包名称必须是以 functions 结尾;第二,方法类需要继承AbstractFunction类,而AbstractFunction类中有四个要实现的函数,其中我们要实现的功能需要结合这四个函数实现。

接下来我们就开始吧 ~

环境准备

第一、添加依赖包:

两个jar包在JMeter安装目录下的\lib\ext 文件夹,在工程里新建一个lib目录,把jar包放进去,然后添加到项目工程里(IDEA中给项目添加依赖的jar包-CSDN博客):

  • ApacheJMeter_components.jar

  • ApacheJMeter_core.jar

第二,创建的包以functions结尾,同时创建的类继承AbstractFunction类,当我们继承时,发现会报错,根据提示,导入方法:

JMeter之函数二次开发/插件开发(附代码)_第1张图片

AbstractFunction类四个方法的简单介绍

 函数概要说明:JMeter之函数二次开发/插件开发(附代码)_第2张图片

package com.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 test extends AbstractFunction {
    @Override
    public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
        //函数的执行主体,函数逻辑处理,最终的处理返回结果
        return null;
    }

    @Override
    public void setParameters(Collection collection) throws InvalidVariableException {
        //用来接收、处理用户调用函数时所输入的参数值
    }

    @Override
    public String getReferenceKey() {
        //函数的名称,及引用时调用的函数名
        return null;
    }

    @Override
    public List getArgumentDesc() {
        //自定义函数参数列表
        return null;
    }
}

实际案例

功能:通过输入 地区码、出生日期、性别,生成一个虚拟身份号

结果展示: 

JMeter之函数二次开发/插件开发(附代码)_第3张图片

整体代码示例

package com.functions;

import com.IdNumTool;
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.LinkedList;
import java.util.List;

public class CardToolFunctions extends AbstractFunction {
    public String card_code = "";
    public String card_birthday = "";
    public String card_sex = "";

    //定义函数参数列表
    @Override
    public List getArgumentDesc() {
        List parms = new LinkedList();
        parms.add("请输入地区码(示例:430922)");
        parms.add("请输入生日(格式:xxxx-xx-xx)");
        parms.add("请输入性别(男:1,女:2)");

        return parms;
    }

    //用来接收、处理用户调用函数时所传入的参数值
    @Override
    public void setParameters(Collection collection) throws InvalidVariableException {
        //collection为getArgumentDesc函数接收到的用户输入的值
        //检查用户输入的参数值是否等于3个
        checkParameterCount(collection,3);
        //把Collection转换为数组,固定写法
        Object[] parmsData = collection.toArray();

        //把data对象取值做CompoundVariable类型的强制转换,再用execute把值转为String类型
        card_code = ((CompoundVariable)parmsData[0]).execute();
        card_birthday = ((CompoundVariable)parmsData[1]).execute();
        card_sex = ((CompoundVariable)parmsData[2]).execute();
    }

    //函数的执行主体,执行具体的业务逻辑、功能
    @Override
    public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
        //初始化idNumTool类
        IdNumTool idNumTool  = new IdNumTool();
        String idcard = idNumTool.getidcard(card_code,card_birthday,card_sex);

        return idcard; //把身份号返回给用户
    }

    //要调用的函数名称
    @Override
    public String getReferenceKey() {
        String key = "__idCard";
        return key ;
    }
}

四个每个函数

getReferenceKey函数

比较简单,就是定义函数的名称,主要注意的是需要是两个下划线开头,这是JMmter规范要求的。

public String getReferenceKey() {
        String key = "__idCard";
        return key ;
}

JMeter之函数二次开发/插件开发(附代码)_第4张图片

getArgumentDesc函数

参数描述

public List getArgumentDesc() {
    List parms = new LinkedList();
    parms.add("请输入地区码(示例:430922)");
    parms.add("请输入生日(格式:xxxx-xx-xx)");
    parms.add("请输入性别(男:1,女:2)");

    return parms;
}

JMeter之函数二次开发/插件开发(附代码)_第5张图片

setParameters

把用户输入的参数值进行处理

public void setParameters(Collection collection) throws InvalidVariableException {
	//collection为getArgumentDesc函数接收到的用户输入的值
	//检查用户输入的参数值是否等于3个
	checkParameterCount(collection,3);
	//把Collection转换为数组,固定写法
	Object[] parmsData = collection.toArray();

	//把data对象取值做CompoundVariable类型的强制转换,再用execute把值转为String类型
	card_code = ((CompoundVariable)parmsData[0]).execute();
	card_birthday = ((CompoundVariable)parmsData[1]).execute();
	card_sex = ((CompoundVariable)parmsData[2]).execute();
}

JMeter之函数二次开发/插件开发(附代码)_第6张图片

execute方法

具体的逻辑实现,结果通过return返回,这里具体实现通过IdNumTool类实现,这已经封装好了,这里只是调用即可;

public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
        //初始化idNumTool类
        IdNumTool idNumTool  = new IdNumTool();
        String idcard = idNumTool.getidcard(card_code,card_birthday,card_sex);

        return idcard;
    }

导出jar包

代码编写完成之后,导出jar包,方法JMeter的lib\ext目录下,然后重启JMeter就可以啦~

导出jar的方法之前有写过,具体见:IDEA导出jar包到JMeter-CSDN博客

结果展示: 

JMeter之函数二次开发/插件开发(附代码)_第7张图片

结语

学习参考(不熟悉的话推荐看下):Jmeter二次开发之自定义函数详解_哔哩哔哩_bilibili

对Java以及JMeter底层运行不熟悉的人来说,没人指导这东西不是很好理解,比如我自己,上方的B站链接就挺好的,看一半,基本就清楚怎么搞了~

后续

后续也在学习过程中添加了小功能,不太敏感,想想自己学习的曲折过程。。。,这里共享给大家吧,附代码跟jar包,都在网盘里了 ~  百度网盘 提取码:t2n4 

gitee:https://gitee.com/kevin0502/tools.git 

这么走心的博主,此处应该值得一个赞吧?

功能函数1:JMeter中读取yaml文件

使用场景:读取配置文件的数据进行接口测试

JMeter之函数二次开发/插件开发(附代码)_第8张图片

yaml文件位置及支持格式:

JMeter之函数二次开发/插件开发(附代码)_第9张图片

默认取值路径:自己新建的一个文件夹,用于放自己的测试文件 

JMeter之函数二次开发/插件开发(附代码)_第10张图片

功能函数2:生成指定个数的汉字

第一个是百家姓喔,所以做姓名也比合适

JMeter之函数二次开发/插件开发(附代码)_第11张图片

你可能感兴趣的:(#,JMeter,java,开发语言)