Jmeter踩坑:导入源码二次开发,函数助手添加自定义函数-SHA256加密

最近测试的注册、登录接口,密码通过SHA256加密,诸如以前的MD5加密可以直接使用Jmeter函数助手进行加密,SHA256加密没有现成的函数。

在网上搜索了大半天,基本两个路线,一个是通过Beanshell脚本,一个是对Jmeter进行二次开发,自行添加函数,之后使用函数助手进行调用。

效果:

觉得写进函数助手是个一劳永逸的办法,于是开始根据网上搜寻的教程实践。然而,还是遇到了很多坑!!!!毕竟自己是个渣,别人过程一没写全,我就短路了。

实践完了之后发现,也不算难嘛。
很多事情都是这样,你做的时候觉得难度挺大,回头来看, 也就这点破事。

一、源码下载
Jmeter官网是提供源码下载的:http://jmeter.apache.org/download_jmeter.cgi
页面提供当前最新版本下载,历史版本点击下面:

选择source:

下载对应版本的源码的压缩包,然后解压。

二、IDE的选择
IDE,也就是集成开发环境,常见的就是myEclipse、eclipse、IDEA等。eclipse和IDEA的社区版都是免费的。
因为需要用到导出部分文件夹为jar包的格式,我在IDEA上找了好久都没找到这个功能,所以踩了一下午坑之后决定转用eclipse了。如果你们谁发现IDEA上的这个功能怎么操作的分享一下。
无脑走教程的就选eclipse

下载:https://www.eclipse.org/downloads/
默认进去是win版的,需要mac或linux版的点”Download Packages”进入

三、导入源码
1.打开eclipse,这里是eclipse的workspace,简单说就是在eclipse中新建项目会默认存放在这个文件夹下

2.新建一个java project

写工程名:

勾选允许导出

3.导入源码
右键项目名-Import(忽略上面那个Jmeter,是自己练手做的)



选择你解压了Jmeter的目录:


导入后可以看到:

你导入之后应该会看到src的文件夹下有红色的小叉,是因为缺少依赖的jar包。(我是因为之前练手时已经添加了依赖包)

4.导入依赖包

一种方式是,把你可执行版(Binaries版)Jmeter里lib目录下的jar包都复制到源码的lib目录下。
另一种使用ant框架导入依赖包:



双击:download_jars

可以从控制台看到下载包的情况

下载jar结束后,项目右键-properties



把这两个文件改为.classpath和.project
image.png

可通过终端命令

1
mv eclipse.classpath .classpath

重启eclipse之后就不会再有红色叉了。

四、二次开发
在该目录下,新建一个class文件,SHA256.java

复制以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package org.apache.jmeter.functions;


import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;
import org.apache.jmeter.threads.JMeterVariables;
import org.apache.jmeter.util.JMeterUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/*
* 对字符串进行SHA256加密
*/
public class SHA256 extends AbstractFunction {
private static final Logger log = LoggerFactory.getLogger(SHA256.class);

private static final List<String> desc = new LinkedList<>();
private static final String KEY = "__SHA256"; // Function name

static {
desc.add(JMeterUtils.getResString("String to encrypt")); // 函数助手中显示的参数说明,对应到参数
desc.add(JMeterUtils.getResString("function_name_paropt"));// 保存函数返回结果的变量,用于引用
}
private CompoundVariable strText, varName;

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

public SHA256() {
}

@Override
public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException {
MessageDigest md;
String strTmp = strText.execute().trim();
String encodeStr = "";
try {
md = MessageDigest.getInstance("SHA-256");
md.update(strTmp.getBytes("UTF-8"));
encodeStr = byte2Hex(md.digest());
} catch (NoSuchAlgorithmException ex) {
log.error("String encryption exception",ex);
} catch (UnsupportedEncodingException ex) {
log.error("String encryption exception",ex);
}
if (varName != null) {
JMeterVariables vars = getVariables();
final String varTrim = varName.execute().trim();
if (vars != null && varTrim.length() > 0) {
vars.put(varTrim, encodeStr);
}
}
return encodeStr;
}

/**
* 将byte转为16进制
*
* @param bytes
* @return
*/
private String byte2Hex(byte[] bytes) {
StringBuffer stringBuffer = new StringBuffer();
String temp = null;
for (int i = 0; i < bytes.length; i++) {
temp = Integer.toHexString(bytes[i] & 0xFF);
if (temp.length() == 1) {
// 1得到一位的进行补0操作
stringBuffer.append("0");
}
stringBuffer.append(temp);
}
return stringBuffer.toString();
}

@Override
public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
// 检查参数数量
checkParameterCount(parameters, 1, 2);
Object[] values = parameters.toArray();

strText = (CompoundVariable) values[0];
if (values.length > 1){
varName = (CompoundVariable) values[1];
} else {
varName = null;
}

}

@Override
public String getReferenceKey() {
return KEY;
}
}

作为一个代码渣,代码是在网上down的,参考:https://blog.csdn.net/y100100/article/details/80701049

五、导入Jmeter
右键-导出


导出的jar包更名为ApacheJMeter_functions.jar,同时覆盖掉Jmeter\lib\ext(不是源码版,是Binaries版)下的ApacheJMeter_functions.jar,重启jmeter,函数助手里就可以看到SHA256函数了。