目录
前言:
1、实现function的类的package声明必须包含".functions"
2、需要继承org.apache.jmeter.functions.AbstractFunction,并且实现相应的方法。
第一步:eclipse 导入jmeter目录:apache-jmeter-2.13libext下的 ApacheJMeter_core.jar(怎么导入jar包,不会就百度吧)
第二步:这里编写一个“获取当前时间前后的指定格式日期时间数据”的函数(__TimeConvert),自带的函数(__Time)不能满足要求。具体的编码为:
第三步:把该自定义函数导出为一个jar包(TimeConvertFunction.jar):
第四步:把导出的jar文件放到jmeter的 lib/ext目录,重启Jmeter,在函数助手框可以看到我们新加的自定义函数:__TimeConvert
前言:
在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包,不会就百度吧)
第二步:这里编写一个“获取当前时间前后的指定格式日期时间数据”的函数(__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请求中使用:
2)执行并查看结果
作为一位过来人也是希望大家少走一些弯路
在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。
(WEB自动化测试、app自动化测试、接口自动化测试、持续集成、自动化测试开发、大厂面试真题、简历模板等等)
相信能使你更好的进步!
点击下方小卡片