JMeter 二次开发【一】函数开发

本贴最后更新于 723 天前,其中的信息可能已经事过景迁

JMeter简介

概述

使用前准备

函数开发

概述

image.png

自定义函数

核心API

开发步骤

  1. 创建Maven项目:使用IDEA创建一个Maven项目
  2. 添加依赖:在项目的pom.xml中依赖ApacheJMeter_java、ApacheJMeter_core,注意与使用的JMeter版本保持一致,依赖见附件
  3. 自定义函数:
    添加自定义函数,继承AbstractFunction类,并覆写其4个方法
    execute方法:添加插件逻辑
    getReferenceKey方法:返回自定义名称函数,用于在JMeter中调用
    setParameters方法:获取传递的参数
    getArgumentDesc:返回参数描述
    注意,自定义函数必须在*.functions包下
  4. 打包:使用Maven工具将插件打包成.jar文件,在项目下的target目录中
  5. 发布:将打包的.jar文件拷贝到JMeter安装目录的lib/ext目录中
  6. 重启JMeter:重新启动JMeter,此时就可以JMeter中使用.jar包中自定义的函数

示例一:开发一个简单的算术运算函数

package com.lemon.demo.jmeter.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.jmeter.util.JMeterUtils;

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

/**
 * @Project: jmeter-functional
 * @Site: http://www.lemonban.com
 * @Forum: http://testingpai.com
 * @Copyright: ©2022 版权所有 湖南省零檬信息技术有限公司
 * @Author: sanbao
 * @Create: 2022-04-11 17:52
 * @Desc: 算术运算函数
 **/
public class Operate extends AbstractFunction {
    //操作符
    private String operate;
    //操作数1
    private Double first;
    //操作数2
    private Double second;


    /**
     * 函数执行逻辑,自定义函数的核心逻辑,并返回经过处理后的内容
     * @param previousResult
     * @param currentSampler
     * @return
     * @throws InvalidVariableException
     */
    @Override
    public String execute(SampleResult previousResult, Sampler currentSampler) {
        Double result = 0d;
        //算术运算
        if ("+".equals(this.operate)) {
            result = this.first + this.second;
        }else if ("-".equals(this.operate)) {
            result = this.first - this.second;
        }else if ("*".equals(this.operate)) {
            result = this.first * this.second;
        }else if ("/".equals(this.operate)) {
            result = this.first / this.second;
        }

        return result.toString();
    }

    /**
     * 设置函数接收参数值,接收JMeter界面用户传递过来的参数
     * @param parameters
     * @throws InvalidVariableException
     */
    @Override
    public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
        //检查参数个数
        checkParameterCount(parameters,3,3);
        //获取参数
        Object[] params = parameters.toArray();
        //获取运算符
        CompoundVariable cvOperate = (CompoundVariable) params[0];
        this.operate = cvOperate.execute();
        //获取操作数1
        CompoundVariable cvFirst = (CompoundVariable) params[1];
        this.first = Double.parseDouble(cvFirst.execute());
        //获取操作数2
        CompoundVariable cvSecond = (CompoundVariable) params[2];
        this.second = Double.parseDouble(cvSecond.execute());
    }

    /**
     * 函数名称
     * @return
     */
    @Override
    public String getReferenceKey() {
        return "__Operate";
    }

    /**
     * 函数参数描述,JMeter界面显示的参数说明
     * @return
     */
    @Override
    public List<String> getArgumentDesc() {
        List<String> desc = new LinkedList<String>();
        desc.add("运算符");
        desc.add("操作数1");
        desc.add("操作数2");
        return desc;
    }
}

示例二:动态生成身份证号码函数

需求:需要一个根据区域动态生成合格的身份证号码的公共函数
函数名:__IDNumber(区域名称),如__IDNumber(长沙市),将返回一个长沙的随机身份证号码
参数:区域
代码:

package com.lemon.demo.jmeter.functions;

import com.lemon.demo.util.IdNumberGenerateUtil;
import lombok.extern.slf4j.Slf4j;
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.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

/**
 * @Project: jmeter-plugin
 * @Site: http://www.lemonban.com
 * @Forum: http://testingpai.com
 * @Copyright: ©2022 版权所有 湖南省零檬信息技术有限公司
 * @Author: sanbao
 * @Create: 2022-04-06 16:35
 * @Desc: 身份证号生成函数
 **/
@Slf4j
public class IDNumber extends AbstractFunction {
    //参数
    private String area;

    /**
     * 函数执行逻辑,自定义函数的核心逻辑,并返回经过处理后的内容
     * @param sampleResult
     * @param sampler
     * @return
     * @throws InvalidVariableException
     */
    public String execute(SampleResult sampleResult, Sampler sampler) {
        //调用身份证生成逻辑
        String idNumber = IdNumberGenerateUtil.generate(area);

        return idNumber;
    }

    /**
     * 设置函数接收参数值,接收JMeter界面用户传递过来的参数
     * @param parameters
     * @throws InvalidVariableException
     */
    public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
        //检查参数个数
        checkParameterCount(parameters,0,1);
        //获取参数
        Object[] params = parameters.toArray();
        //获取区域
        if(params.length>0) {
            CompoundVariable cvArea = (CompoundVariable) params[0];
            this.area = cvArea.execute();
        }
    }

    /**
     * 函数名称,JMeter界面函数的名称
     * @return
     */
    public String getReferenceKey() {
        return "__IDNumber";
    }

    /**
     * 函数参数描述,JMeter界面显示的参数说明
     * @return
     */
    public List<String> getArgumentDesc() {
        List<String> desc = new ArrayList<String>();

        desc.add("Area");

        return desc;
    }
}

JMeter二次开发方向

上述二次开发内容将是柠檬班《Java高级测试开发》的课程内容

1 回帖
请输入回帖内容 ...
  • xp

    能否分享一下这个jar