需求:读取本地存放图片的地址,实现随机选取图片转化为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<String> 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<CompoundVariable> 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<String> 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<String> 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<String> base64List = new ArrayList<String>(); // 可能存在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<CompoundVariable> parameters) throws InvalidVariableException { checkParameterCount(parameters,1); // 检查参数个数。因为本次传入参数就一个(文件地址) values = parameters.toArray(); // 获取参数 }
5、打包成jar后放入jmeter安装目录下的lib\ext下,重启jmete后就能在函数助手中看到了。
6、基本思路就是这样,主要就是重写execute()这个方法。加油~