• Jmeter工具二次开发


    一、JMeter 二次开发方向

    1、函数开发,主要为JMeter 函数库

    2、插件开发,一般主要做取样器开发

    3、基于执行引擎开发,有效解决单独开发的测试平台或工具中,底层执行引擎开发相对复杂、周期长的问题,利用 JMeter 执行引擎的 API 进行基础的调用、监听、提取等操作,加速底层执行引擎开发效率。

    二、环境准备

    JDK:Java 开发工具包,是所有 Java 开发或项目运行的基础。

    IntelliJ IDEA: Java 项目开发的集成开发工具,也可以用 Eclipse。

    JMeter:性能测试工具。

    三、Jmeter函数开发

    JMeter 自带函数库中,提供了丰富的函数,并被广泛使用,如__Random、__UUID 等

    可以通过菜单工具-> 函数助手对话框进行测试使用。

    但是JMeter 自带的函数并一定能满足所有业务需要,因此需要基于 JMeter 进行二次开发新还是。

    3.1、自定义函数基础

    自定义函数必须继承 AbstractFunction 类,并重写父类的 4 个方法

    (1)getArgumentDesc,函数参数描述,如果自定义函数有参数,用于返回函数参数说明

    (2)execute,函数执行逻辑,必需,自定义函数的核心逻辑,并返回经过处理后的内容

    (3)getReferenceKey,函数名,必需,返回一个字符串,表示在 JMeter 中自定义函数的函数名,一般以双下划线开头,如__Operate

    (4)setParameters,设置函数接收参数值,如果自定义函数有参数,用于接收调用时传递过来的参数,注意使用时,字符串参数不要加双引号

    在这里插入图片描述

    编码格式如下

    package com.functions;   #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;
    
    
    #test为新见的类名,继承AbstractFunction的方法
    
    public class test extends AbstractFunction {
    
     
        @Override
        public List<String> getArgumentDesc() {
            //自定义函数参数列表
            return null;
        }
    	
    	@Override
        public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
            //用来接收、处理用户调用函数时所输入的参数值
        }
    	
        @Override
        public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
            //函数的执行主体,函数逻辑处理,最终的处理返回结果
            return null;
        }
     
        @Override
        public String getReferenceKey() {
            //函数的名称,及引用时调用的函数名
            return null;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    3.2、IDEA 新建project

    3.3、添加依赖包

    两个jar包在JMeter安装目录下的\lib\ext 文件夹,在工程里创建一个lib目录,把jar粘贴到里面,然后再按下图顺序添加依赖

    ApacheJMeter_components.jar

    ApacheJMeter_core.jar

    在这里插入图片描述

    3.4、在src文件下新建一个包package,创建的包命名以functions结尾,如命名为“org.apache.jmeter.functions”,该创建的类继承AbstractFunction类的方法

    3.5、在创建的package “org.apache.jmeter.functions”下面新增class 如命名为“IsJoinFunction”,并继承jmeter自带的AbstractFunction。

    在这里插入图片描述

    3.6、按照模版格式:

    a.添加导入模块

    b.让新增的类继承AbstractFunction

    c.添加4种方法,并且实现具体的业务逻辑

    3.7、代码编写完成之后,编译、导出jar包

    a.配置Artifacts

    在这里插入图片描述

    在这里插入图片描述

    b.编译Artifacts,生成jar包

    上一步只是设置了生成jar包的环境,接下来还需要编译代码,生成jar包

    生成的jar默认放在工程目录的out/artifacts下,可直接复制~

    另:若更新了代码,也只需直接“编译Artifacts”就行了,但若更新jar包,则需要重新配置环境!!

    在这里插入图片描述

    3.8、把jar包放在JMeter的lib\ext目录下,然后重启JMeter即OK。

    四、自定义函数demo

    功能:通过输入3个数字,拼接为一个三位数

    package org.apache.jmeter.functions;
    
    
    import org.apache.jmeter.engine.util.CompoundVariable;
    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 IsJoinFunction extends AbstractFunction {
        public String numberOne = "";
        public String numbertwo = "";
        public String numberThree = "";
    
        //定义函数参数列表
        @Override
        public List<String> getArgumentDesc() {
            List<String> parms = new LinkedList<String>();
            parms.add("请输入数字(示例:1)");
            parms.add("请输入数字(示例:2)");
            parms.add("请输入数字(示例:3)");
    
            return parms;
        }
    
        //用来接收、处理用户调用函数时所传入的参数值
        @Override
        public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
            //collection为getArgumentDesc函数接收到的用户输入的值
            //检查用户输入的参数值是否等于3个
            checkParameterCount(collection,3);
            //把Collection转换为数组,固定写法
            Object[] parmsData = collection.toArray();
    
            //把data对象取值做CompoundVariable类型的强制转换,再用execute把值转为String类型
            numberOne = ((CompoundVariable)parmsData[0]).execute();
            numbertwo = ((CompoundVariable)parmsData[1]).execute();
            numberThree = ((CompoundVariable)parmsData[2]).execute();
        }
    
        //函数的执行主体,执行具体的业务逻辑、功能
        @Override
        public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
            String isJoin = numberOne + numbertwo + numberThree;
            return isJoin; //把执行结构返回给用户
        }
    
        //要调用的函数名称
        @Override
        public String getReferenceKey() {
            String key = "__isJoin";
            return key ;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    继承AbstractFunction 类的四个方法分别如下:

    4.1、getArgumentDesc函数:参数描述

        public List<String> getArgumentDesc() {
            List<String> parms = new LinkedList<String>();
            parms.add("请输入数字(示例:1)");
            parms.add("请输入数字(示例:2)");
            parms.add("请输入数字(示例:3)");
    
            return parms;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    4.2、setParameters:把用户输入的参数值进行处理

     public void setParameters(Collection<CompoundVariable> collection) throws InvalidVariableException {
            //collection为getArgumentDesc函数接收到的用户输入的值
            //检查用户输入的参数值是否等于3个
            checkParameterCount(collection,3);
            //把Collection转换为数组,固定写法
            Object[] parmsData = collection.toArray();
    
            //把data对象取值做CompoundVariable类型的强制转换,再用execute把值转为String类型
            numberOne = ((CompoundVariable)parmsData[0]).execute();
            numbertwo = ((CompoundVariable)parmsData[1]).execute();
            numberThree = ((CompoundVariable)parmsData[2]).execute();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    4.3、execute方法:具体的逻辑实现,结果通过return返回

    public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
            String isJoin = numberOne + numbertwo + numberThree;
            return isJoin; //把执行结果返回给用户
        }
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

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

    public String getReferenceKey() {
            String key = "__isJoin";
            return key ;
        }
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

  • 相关阅读:
    如何分析精准分析出问题件
    GBJ810-ASEMI大芯片整流桥GBJ810
    12 岁印度少年出手,Ubuntu Unity 桌面 6 年后起死回生
    ComPDFKit PDF SDK Crack
    VPX 插座(VITA46)介绍及应用 (简单介绍)
    【甄选靶场】Vulnhub百个项目渗透——项目二十六:Pinky‘s-Palace-1(代理访问,缓冲区溢出)
    为什么一般公司面试结束后会说「回去等消息」,而不是直接告诉面试者结果?
    A-Level物理例题解析及练习Projectile Motion
    FPGA project : IIC_wr_eeprom
    Python方法汇总:轻松实现功能!
  • 原文地址:https://blog.csdn.net/baidu_24752135/article/details/134265504