jmeter二次开发 -- 自定义函数 -- Base64加密
一、需求
jmeter请求接口,接口入参需要图片的 base64 编码。手动对图片 base64 编码,然后放到接口入参中,太麻烦,需要自动的编码。
二、解决思路
写一个 jmeter 的自定义函数,使得 jmeter 请求接口时,可以调用函数自动完成 图片 base64 编码。
三、核心步骤
1、新建实现 function 类的 package (名字必须包含“.functions”)
2、function 类继承自 org.apache.jmeter.functions.AbstractFunction,并且 重写相关的方法:
// 1. 功能描述:描述这个方法是干什么的 public List<String> getArgumentDesc() // 2. 需要实现的功能 public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException // 3. 返回 function 的名称 public String getReferenceKey() // 4. 接收用户传递的参数、设置参数 public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException
四、详细步骤
4.1、工具
jmeter5.4.1
jdk1.8
ide
4.2、具体步骤
4.2.1、新建 maven 工程
4.2.2、修改 pom.xml 文件
修改完 pom.xml 文件后,等一会儿(正在下载 jmeter 的相关东西)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>JmeterBase64</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<packaging>jar</packaging>
<name>JmeterBase64</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.2</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_core -->
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>5.4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_functions -->
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_functions</artifactId>
<version>5.4.1</version>
</dependency>
</dependencies>
</project>
4.2.3、新建 com.mytest.functions 包(包名必须包含“.functions”,jmeter需要用这个来识别)
4.2.4、新建 MyBase64 类
package com.mytest.functions; import java.io.FileInputStream; import java.io.InputStream; import java.util.Collection; 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; import org.apache.jmeter.threads.JMeterVariables; // 使用 Java 的 Base64,其他的不推荐使用 import java.util.Base64; public class MyBase64 extends AbstractFunction{ // 自定义 function 的描述 private static final List<String> desc = new LinkedList<String>(); static { desc.add("图片路径"); } static { desc.add("图片base64编码后,存放的变量名"); } private static final String KEY = "__Base64Img"; // 存放传入参数的值的变量 private Object[] values; // 描述参数 public List<String> getArgumentDesc() { return desc; } // 提供jmeter函数助手显示的名称 @Override public String getReferenceKey() { return KEY; } // 接收用户参数、设置参数,让函数的具体实现可以调用该参数 @Override public synchronized void setParameters(Collection<CompoundVariable> arg0) throws InvalidVariableException { // 检查参数的个数 checkParameterCount(arg0, 1, 2); // 将参数值存入变量中 this.values = arg0.toArray(); } // Base64加密函数的具体实现 public String getImgBase64(String filePath) { InputStream in = null; byte[] data = null; String result = null; try { in = new FileInputStream(filePath); data = new byte[in.available()]; in.read(data); in.close(); // BASE64Encoder encoder = new BASE64Encoder(); // result = encoder.encode(data); result = Base64.getEncoder().encodeToString(data); } catch (Exception e) { e.printStackTrace(); } return result; } // 函数的执行 @Override public synchronized String execute(SampleResult arg0, Sampler arg1) throws InvalidVariableException { JMeterVariables localJMeterVariables = getVariables(); String str1 = ((CompoundVariable)this.values[0]).execute(); String str2 = getImgBase64(str1); if ((localJMeterVariables != null) && (this.values.length > 1)) { String str3 = ((CompoundVariable)this.values[1]).execute().trim(); localJMeterVariables.put(str3, str2); } return str2; } }
4.2.5、把 MyBase64 类导出为 jar 包至 apache-jmeter-5.4.1\lib\ext 目录下
五、试用
六、注意事项
有些接口可能需要 “data:img/jpg;base64,” 这种前缀部分添加上去才能正确读取 Base64 编码
那就在 jmeter 参数填写的时候添加上 “data:img/jpg;base64, ” 这种前缀
当然,也可以在 函数的具体实现中,完成这个步骤,这个就看自己怎么编写了
好,完成。
致谢参考博客:
https://www.cnblogs.com/qiaoyeye/p/7218770.html
https://www.cnblogs.com/lasdaybg/p/9803988.html
https://www.cnblogs.com/jyiqing/p/10256178.html
http://www.manongjc.com/article/59838.html