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

  • Post author:
  • Post category:其他



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类,当我们继承时,发现会报错,根据提示,导入方法:

250223015da448f0ae1035d00c19acfc.png

AbstractFunction类四个方法的简单介绍

函数概要说明:
cd5f1d5935864492820244541d7426b9.png

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<CompoundVariable> collection) throws InvalidVariableException {
        //用来接收、处理用户调用函数时所输入的参数值
    }

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

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

实际案例

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

结果展示:

970eb9fc3d11476396ab02978fdf3f30.png

整体代码示例

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

        return parms;
    }

    //用来接收、处理用户调用函数时所传入的参数值
    @Override
    public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
        //collection为getArgumentDesc函数接收到的用户输入的值
        //检查用户输入的参数值是否等于3个
        checkParameterCount(collection,3);
        //把Collection<CompoundVariable>转换为数组,固定写法
        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 ;
}

75b3b90507b54a8381341e0aca8e89db.png

getArgumentDesc函数

参数描述

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

    return parms;
}

85c7915fdffb4c928fc8da9fd8816e9d.png

setParameters

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

public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
	//collection为getArgumentDesc函数接收到的用户输入的值
	//检查用户输入的参数值是否等于3个
	checkParameterCount(collection,3);
	//把Collection<CompoundVariable>转换为数组,固定写法
	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();
}

c68095cf8f6141509158666c786f8347.png

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博客

结果展示:

970eb9fc3d11476396ab02978fdf3f30.png

结语

学习参考(不熟悉的话推荐看下):

Jmeter二次开发之自定义函数详解_哔哩哔哩_bilibili

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

后续

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

百度网盘

提取码:t2n4

gitee:

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

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

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

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

744762fb67604dc8bb1d16f5acb3d34f.png

yaml文件位置及支持格式:

c967cd8fc4aa4f78b0a8974c2566b0cf.png

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

e600b58794b942ed918ad1cc8a5d53da.png

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

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

5c1bd2747665493b966580fe4637ae6c.png



版权声明:本文为u011072936原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。