Jmeter使用之:怎么编写扩展函数(二)

前面,我已经在文章《Jmeter使用之:怎么编写扩展函数(一)》分享了怎么编写使用外部函数,但使用起来并不方便。我们要怎么像使用内置函数一样使用自定义函数呢?可以通过扩展JMeter函数来实现,在扩展JMeter函数之前主要有两点需要注意:
1、实现function的类的package声明必须包含".functions"
说明:JMeter设计让一些核心的类(非UI相关的,比如ApacheJMeter_core等)可以在非UI的方式下运行的时候能被加载进来,这些类会被优先加载。加载这些类的时候是通过命名规则来实现的。所有实现function的类必需包含".functions.",所以我们自定义实现的类里必须包含".functions",比如 "com.xmeter.customized.functions"。
2、需要继承org.apache.jmeter.functions.AbstractFunction,并且实现相应的方法。
下面来一个扩展函数的编写实例:
第一步:eclipse 导入jmeter目录:apache-jmeter-2.13libext下的 ApacheJMeter_core.jar(怎么导入jar包,不会就百度吧)

导入jar包

第二步:这里编写一个“获取当前时间前后的指定格式日期时间数据”的函数(__TimeConvert),自带的函数(__Time)不能满足要求。具体的编码为:
/**
 * 获取当前日期时间前后的指定格式日期时间数据
 */

package com.ste.ruink.time.functions;

import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

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;
/**
 * @author Ruink
 */

public class TimeConvertFunction extends AbstractFunction {
    //自定义function的描述
    private static final List desc = new LinkedList();
    static {
        desc.add("获取当前时间往前(后)多少秒的时间,使用格式${__TimeConvert(flag,sec,format)},flag为前后标识符(pre-前,later-后,其他值时默认为当前),"
                + "seconds为间隔时间多少秒,format为日期格式,默认为yyyy-MM-dd HH:mm:ss");
    }
    //确定function名称
    private static final String KEY = "__TimeConvert";
    //最多传入的参数个数
    private static final int MAX_PARA_COUNT = 3;
    //最少传入的参数个数
    private static final int MIN_PARA_COUNT = 3;
    //用于存入传入参数的值
    private Object[] values;
    /* 
     * 告诉JMeter关于你实现的function的描述
     */

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

    /* 
     *JMeter会将上次运行的SampleResult和当前的Sampler作为参数传入到该方法里,
     *返回值就是在运行该function后得到的值,以String类型返回。该方法如果操作了非线程安全的对象(比如文件),
     *则需要将对该方法进行线程同步保护。
     */

    @Override
    public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException {
        String flag = ((CompoundVariable) values[0]).execute().trim();
        long sec = new Integer(((CompoundVariable) values[1]).execute().trim());
        String format = ((CompoundVariable) values[2]).execute().trim();
        // 这里就是jmeter中执行函数后的返回结果
        return getTime(flag,sec,format);
    }

    /* 
     * 这个就是function的名字。JMeter的命名规则是在方法名前面加入双下划线"__"。比如"__GetEven",
     * function的名字跟实现该类的类名应该一致,而且该名字应该以static final的方式在实现类中定义好,
     * 避免在运行的时候更改它。
     */

    @Override
    public String getReferenceKey() {
        // 返回函数名称
        return KEY;
    }

    /* 
     * 这个方法在用于传递用户在执行过程当中传入的实际参数值。该方法在function没有参数情况下也会被调用。
     * 一般该方法传入的参数会被保存在类内全局变量里,并被后面调用的execute方法中使用到。
     */

    @Override
    public void setParameters(Collection args) throws InvalidVariableException {
    // 检查并获取传入变量值
        checkParameterCount(args, MIN_PARA_COUNT, MAX_PARA_COUNT); //检查传入的参数的个数是否正确
        values = args.toArray(); //将值存入类变量values中
    }
    
    /* 
     * 自定义函数。获取时间,当前时间往前(后)多少秒,flag为前后标识符(pre-前,later-后,其他值时默认为当前),
     * seconds为间隔时间多少秒,format为日期格式,默认为yyyy-MM-dd HH:mm:ss
     */  

    public static String getTime(String flag,long sec,String format){
        //获取当前时间戳
        long timestamp = System.currentTimeMillis();
        long finaltime;
        if(flag.equals("pre")){
            finaltime = timestamp - sec*1000;
        }else if(flag.equals("later")){
            finaltime = timestamp + sec*1000;
        }else{
            finaltime = timestamp;
        }
        //判断format是否有值
        if(format.equals(null)||format.equals("")){
            format="yyyy-MM-dd HH:mm:ss";
        }
        String timestr = String.valueOf(finaltime);
        String getdate = stampToDate(timestr,format);
        return getdate;
    }
    
    /* 
     * 自定义函数。将时间戳转换为时间
     */

    public static String stampToDate(String s,String format){
        String res;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        long lt = new Long(s);
        Date date = new Date(lt);
        res = simpleDateFormat.format(date);
        return res;
    }
}
第三步:把该自定义函数导出为一个jar包(TimeConvertFunction.jar):

导出为嘉宝

第四步:把导出的jar文件放到jmeter的 lib/ext目录,重启Jmeter,在函数助手框可以看到我们新加的自定义函数:__TimeConvert

查看函数

1)最后,使用该函数,如在一个GET请求中使用:

HTTP中使用函数

2)执行并查看结果

查看执行结果



留言