目录
前言:
开发步骤:
JMeter自定义函数是一种使用Java编写的函数,它可以与JMeter脚本一起使用。如果JMeter原始函数不满足您的需求,您可以使用Java编写自定义函数来扩展其功能。
需求:读取本地存放图片的地址,实现随机选取图片转化为base64图片流
问题出现的环境背景:工作中模型接口的传入为图片base64,在使用jmeter进行相关接口测试时需要有该功能函数。
1、创建java项目,新建的包名称必须时org.apache.jmeter.functions,在该包下创建名为ImageToBase64的class
2、导入jmeter安装目录下的lib\ext下的ApacheJMeter_functions.jar包
3、继承AbstractFunction类,并重写其中的方法
package org.apache.jmeter.functions;
import java.util.Collection;
import java.util.List;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;
public class ImageToBase64 extends AbstractFunction{
@Override
public List getArgumentDesc() {
// TODO Auto-generated method stub
return null;
}
@Override
public String execute(SampleResult arg0, Sampler arg1) throws InvalidVariableException {
// TODO Auto-generated method stub
return null;
}
@Override
public String getReferenceKey() {
// TODO Auto-generated method stub
return null;
}
@Override
public void setParameters(Collection arg0) throws InvalidVariableException {
// TODO Auto-generated method stub
}
}
可以看到的是,我们需要重写的方法有四个:
1、getArgumentDesc():函数参数描述,如果自定义函数有参数,用于返回函数参数说明
2、execute():函数的主要执行逻辑,返回经过处理后的内容,此次返回的就是图片的base64
3、getReferenceKey():返回自定义的函数名称。如:"__ImageToBase64"。一般的我们在创建自定义函数名称的时候以双下划线开头
4、setParameters():设置函数接收参数值,如果自定义函数有参数,用于接收调用时传递过来的参数,注意使用时,字符串参数不要加双引号
4、开发过程
1、首先第一步是确定在Jmeter函数助手中显示的名字以及所需要的参数。
public class ImageToBase64 extends AbstractFunction {
private static final List dese = new LinkedList<>();
private static final String KET = "__ImageToBase64"; // 函数界面显示
static {
dese.add("文件路径:"); // jmeter界面参数说明
}
private CompoundVariable File_path;
public ImageToBase64(){
}
private Object[] values;
///
...
///
@Override
public String getReferenceKey() {
return KET;
}
@Override
public List getArgumentDesc() {
return dese;
}
2、添加图片转base64方法
public static String imageToBase64Str(String imgFile) {
InputStream inputStream = null;
byte[] data = null;
try {
inputStream = new FileInputStream(imgFile);
data = new byte[inputStream.available()];
inputStream.read(data);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
// 加密
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
}
3、重写execute,实现执行逻辑
@Override
public String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {
File_path = (CompoundVariable) values[0];
String filepath = File_path.execute().trim();
File dir = new File(filepath);
String[] fileList = dir.list(); // 获取指定文件夹下文件的名字
List base64List = new ArrayList(); // 可能存在bug,目前以列表存放图片地址然后随机选取列表,如果图片数量过多可能导致list过长
for (int i = 0; i < fileList.length; i++) {
String pic1 = filepath + "\\" + fileList[i];
base64List.add(pic1);
}
int index = (int)(Math.random()*base64List.size());
String img_path = base64List.get(index);
System.out.println(img_path);
String base64Str = imageToBase64Str(img_path);
return base64Str;
}
4、设置函数接收参数值,接收JMeter界面用户传递过来的参数
@Override
public void setParameters(Collection parameters) throws InvalidVariableException {
checkParameterCount(parameters,1); // 检查参数个数。因为本次传入参数就一个(文件地址)
values = parameters.toArray(); // 获取参数
}
5、打包成jar后放入jmeter安装目录下的lib\ext下,重启jmete后就能在函数助手中看到了。
6、基本思路就是这样,主要就是重写execute()这个方法。
作为一位过来人也是希望大家少走一些弯路,希望能对你带来帮助。(WEB自动化测试、app自动化测试、接口自动化测试、持续集成、自动化测试开发、大厂面试真题、简历模板等等),相信能使你更好的进步!
留【自动化测试】即可【自动化测试交流】:574737577(备注ccc)http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Yg3Y37fdTkAHAEyqD-gLuGbCI8UEiRA1&authKey=wJQ7hIhE9p%2FQDdwXXPjwolJnDMyBoIU%2FtVbTLbNFIvzIWoA7LZfVmSNccWx15jwG&noverify=0&group_code=574737577