JMeter 源码二次开发函数示例

一、JMeter 5.0 版本


实际测试中,依靠jmeter自带的函数已经无法满足我们需求,这个时候就需要二次开发。本次导入的是jmeter 5.0的源码进行实际的函数开发。

二、开发函数

在src/functions新建class-IntThreeSum(函数求和)

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 org.apache.jmeter.threads.JMeterVariables;
import org.apache.jmeter.util.JMeterUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

/**
 * @ClassName IntThreeSum三个参数求和
 * @Description TODO
 * @Author Hardy.Feng
 * @Date 2018/12/20 14:00
 * @Version 1.0
 **/

public class IntThreeSum extends AbstractFunction { //继承AbstractFunction类,必须对父类的代码重写
    
    private static final Logger log = LoggerFactory.getLogger(IntThreeSum.class);

    private static final List<String> desc = new LinkedList<>();    //描述
    private static final String KEY = "__IntThreeSum";  //方法描述,必须双下划线

    static {
        
        desc.add(JMeterUtils.getResString("first_param")); 
        desc.add(JMeterUtils.getResString("secone_param")); 
        desc.add(JMeterUtils.getResString("third_param")); 
    }

    private Object[] values;

    public IntThreeSum() {
    }

    @Override
    public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException {

        JMeterVariables vars = getVariables();

        int sum = 0;
        String varName = ((CompoundVariable) values[values.length - 1]).execute().trim();
        log.info("varName==>:{}", varName);

        //遍历获取3个数之和
        for (int i = 0; i < values.length - 1; i++) {
            sum += Integer.parseInt(((CompoundVariable) values[i]).execute());
        }

        try {
            sum += Integer.parseInt(varName);
            varName = null;
        } catch (NumberFormatException ignored) {

        }

        String totalString = Integer.toString(sum);
        if (vars != null && varName != null) {
            vars.put(varName.trim(), totalString);
            log.info("varName:", vars.get(varName.trim()));
        }
        return totalString;
    }

    @Override
    public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
        //对入参进行检查,最小3个参数
        checkMinParameterCount(parameters,3);
        values = parameters.toArray();

    }

    @Override
    public String getReferenceKey() {
        return KEY;
    }

    @Override
    public List<String> getArgumentDesc() {
        return desc;
    }
}

三、测试类Test

在test/src新建测试类IntThreeSumTest

package org.apache.jmeter.functions;

import org.apache.jmeter.JMeter;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.junit.JMeterTestCase;
import org.apache.jmeter.threads.JMeterContext;
import org.apache.jmeter.threads.JMeterContextService;
import org.apache.jmeter.threads.JMeterVariables;
import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.LoggerFactory;

import static org.apache.jmeter.functions.FunctionTestHelper.makeParams;

import java.util.Collection;

/**
 * @ClassName IntThreeSumTest
 * @Description TODO
 * @Author hardy.Feng
 * @Date 2018/12/20 14:30
 * @Version 1.0
 **/

public class IntThreeSumTest extends JMeterTestCase {

    @Test
    public void sumTest() throws Exception {
        IntThreeSum intThreeSum = new IntThreeSum();
        checkInvalidParameterCounts(intThreeSum,3); //检查一下参数最小入参3位
        Collection<CompoundVariable> params = makeParams("1","2","3");
        intThreeSum.setParameters(params);
        String totalString = intThreeSum.execute();
        System.out.println("total:" + totalString);

    }
}

四、导出jar文件

如果测试类测试没有问题,就可以导出class为jar文件。放到lib/ext目录下面,如下图所示

五、启动jmeter

函数已经生效。欢迎留言讨论。

公众号:大家可以关注:

JMeter 源码二次开发函数示例的更多相关文章

  1. Jmeter - 源码开发环境配置

    step1: 创建一个JavaProject , 我们命名为 JmeterSrcDev,点击Next.

  2. JMeter源码集成到Eclipse

    由于JMeter纯Java开发,界面也是基于Swing或AWT搞出来的,所以想更深层次的去了解这款工具或对于想了解JMeter插件开发或二次开发的童鞋们来说,读读JMeter的源码估计是必不可少的,所 ...

  3. [转载]JMeter源码导入Eclipse

    转载自:http://www.cnblogs.com/taoSir/p/5144274.html 由于JMeter纯Java开发,界面也是基于Swing或AWT搞出来的,所以想更深层次的去了解这款工具 ...

  4. jmeter源码导入eclipse并执行

    由于JMeter纯Java开发,界面也是基于Swing或AWT搞出来的,所以想更深层次的去了解这款工具或对于想了解JMeter插件开发或二次开发的童鞋们来说,读读JMeter的源码估计是必不可少的,所 ...

  5. [Jmeter系列]Jmeter源码编译步骤(转)

    官网:http://jmeter.apache.org/building.html   1,在apach官网download源码: http://jmeter.apache.org/download_ ...

  6. windows下在idea用maven导入spark2.3.1源码并编译并运行示例

    一.前提 1.配置好maven:intellij idea maven配置及maven项目创建 2.下载好spark源码: 二.导入源码: 1.将下载的源码包spark-2.3.1.tgz解压(E:\ ...

  7. RocketMQ源码分析之从官方示例窥探:RocketMQ事务消息实现基本思想

    摘要: RocketMQ源码分析之从官方示例窥探RocketMQ事务消息实现基本思想. 在阅读本文前,若您对RocketMQ技术感兴趣,请加入RocketMQ技术交流群 RocketMQ4.3.0版本 ...

  8. 从比心APP源码的成功,分析陪玩系统源码应该如何开发

    提起游戏陪玩系统,相信大家都不陌生.作为一名骨灰级的手游玩家,小编对于陪玩系统源码也有些了解.在互联网络发展愈发迅速的今天,游戏产业在一中领域中脱颖而出,据统计,手机游戏用户已经达到5.29亿,较20 ...

  9. JMeter源码导入到Intellij IDEA (八)

    亲测:jmeter源码导入Intellij IDEA,导入,编译,运行! 一.环境:windows10操作系统,jdk1.8,Intellij IDEA 2018.3,jmeter5.0 下载jmet ...

随机推荐

  1. Django基础学习五_引入静态文件

    今天继续学习Django,今天主要掌握两个小点 一.如果为Django项目中引入静态文件 1.先要在project目录下创建static的目录,然后将jquery文件拷贝这个目录下就可以了 2.在pr ...

  2. loadrunner--vugen录制脚本提示“无Internet访问。您可能无法录制并执行业务进程”

    1.vugen录制脚本提示如下,为什么会提示这个呢?这个提示忽略会对录制脚本有影响吗?最好应该怎么操作? 惠普技术支持回复: 您可以试试,若点击“Yes”,是否可以继续录制网站?若可以的话,您也确定网 ...

  3. 洛谷 P3660 [USACO17FEB]Why Did the Cow Cross the Road III G(树状数组)

    题目背景 给定长度为2N的序列,1~N各处现过2次,i第一次出现位置记为ai,第二次记为bi,求满足ai<aj<bi<bj的对数 题目描述 The layout of Farmer ...

  4. [OS] 远程启动计划任务时以管理员身份运行

    在Jenkins建了一个task自动启动Selenium的Grid,命令行是这样写的: schtasks /end /tn RestartGrid /s SZTEST201606 /u szdomai ...

  5. IRC聊天指南

    参考https://www.cnblogs.com/fzzl/archive/2011/12/26/2302637.html

  6. JavaScript 对象属性作实参以及实参对象的callee属性

    参考自<<JavaScript权威指南 第6版>> /* * 将对象属性用作实参, 从而不必记住参数的顺序. */ function arraycopy(from,from_s ...

  7. 整理Javascript基础数据和引用数据复制值的问题

    Javascript数据分为两大类:1.基础类型(原始类型数据) 2.引用类型.他们的存储方式是不同的 基础类型的数据存储是保存在栈内存中的: 例如: var a=1; var b=a; var a= ...

  8. UVaLive 4128 Steam Roller (多决策最短路)

    题意:给定一个图,r 根横线, c 根竖线.告诉你起点和终点,然后从起点走,每条边有权值,如果是0,就表示无法通行.走的规则是:如果你在下个路要转弯,会使这段路的时间加倍,但是如果一条路同时是这样,那 ...

  9. mysql 更新替换字符串

    update zxg set newlevel = REPLACE(newlevel,'b','') 把表zxg中的newlevel字段中的b删除

  10. handsontable-常用配置

    冻结单元格 var //自动创建数据 myData = Handsontable.helper.createSpreadsheetData(100, 50), container = document ...