在使用jmeter做测试的过程中,经常需要对请求的入参进行加密,下面列举几种常用的方法,以登录请求密码需要MD5加密为例。
虽然可以先把参数化的明文密码都先md5加密,而不是在登录前先执行加密,但是实际情况是,登录后的请求也可能有需要加密的入参,且入参是动态获取的,所以最好是在脚本运行过程中加密,而不是提前加密好进行参数化。
如果用户的密码都不一样,就需要先对明文密码进行参数化。下面只演示单个用户请求。
注意:涉及路径的,路径最好参数化,不要写死
jmeter自带函数
自带md5函数
在函数助手中找到__MD5这个函数,第一个参数是要md5加密的值,第二个参数是保存加密后值的变量
![](https://img-blog.csdnimg.cn/img_convert/933bd503e3e32ffe245ba25fcdb8554e.png)
请求
![](https://img-blog.csdnimg.cn/img_convert/99a07c84fb39c47a6d536b2123be5558.png)
发送请求,可以看到密码加密了
![](https://img-blog.csdnimg.cn/img_convert/f9b0d6ad1750c0c6bdc1d2e99d359e60.png)
自带digest
新版本的jmeter中,已经没有md5函数了,官网:https://jmeter.apache.org/usermanual/functions.html
取而代之的是digest,digest函数返回指定哈希算法中的摘要值
![](https://img-blog.csdnimg.cn/img_convert/dd4f52dda1a0bf13c8499655e8989472.png)
![](https://img-blog.csdnimg.cn/img_convert/4a5a5cecffeb026c291855dcfffcb813.png)
参数含义:
算法摘要:MD2、MD5、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512
String to be hashed:要计算的字符串;
Salt to be used for hashing (optional):用于计算散列的盐(可选项);
Upper case result, defaults to false (optional):结果大写,默认为false(可选),即默认摘要值为小写
存储结果的变量名(可选)
实例:MD5加密123456
![](https://img-blog.csdnimg.cn/img_convert/477c4441bbb7752bc1be5fa131466533.png)
复制上面的结果
![](https://img-blog.csdnimg.cn/img_convert/8ab7516c02bd3c58d801fdf25d6ad6fa.png)
可以看到,请求的密码加密了,和上面的加密结果一致
![](https://img-blog.csdnimg.cn/img_convert/34fa05c7e62ad138d502837fc806e729.png)
自带函数生成uuid
可能有些场景需要一个UUID值,即通用唯一识别码 (Universally Unique Identifier)
${__UUID}
beanshell自定义脚本(*)
beanshell脚本md5加密
在jmeter的lib目录下,自带commons-codec-1.11.jar(如果没有,可以到maven库下一个,下载地址:https://mvnrepository.com/,然后放到jmeter的lib目录下),所以,可以借助apache工具类DigestUtils实现。
beanshell脚本
import org.apache.commons.codec.digest.DigestUtils;
String password_md5 = DigestUtils.md5Hex("123456");
vars.put("password_md5", password_md5);
解释:
第一行:导包
第二行:加密
第三行:将加密后的值放到变量中
也可以把密码全部转为大写或者小写:
password_md5.toUpperCase()password_md5.toLowerCase()
![](https://img-blog.csdnimg.cn/img_convert/dc34d9e0c5e8a20eee24340c5d7ed946.png)
引用变量
![](https://img-blog.csdnimg.cn/img_convert/2d8c2449fef3eca8a9b27913af4e7e70.png)
发送请求,可以看到密码加密了
![](https://img-blog.csdnimg.cn/img_convert/9e15c5c65265d161cdba372914fa8546.png)
也可以用beanshell前置处理器,结果是一样的
![](https://img-blog.csdnimg.cn/img_convert/72f5ec141d1c15e0a5d65e9b833b0590.png)
beanshell脚本生成uuid
![](https://img-blog.csdnimg.cn/img_convert/b61a5f3fbb2036ad6ebcd366a99c8d27.png)
3个线程,运行2次
![](https://img-blog.csdnimg.cn/img_convert/56a91065ac6bd654a8b217f235a8873e.png)
可以看到,生成的UUID都不一样
![](https://img-blog.csdnimg.cn/img_convert/80802d691ecd0e95d79091275a209892.png)
引用外部java文件
这里我们还是用上一种方法用到的jar包。
pom中添加依赖
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.12</version>
</dependency>
编写java代码
package com.uncleyong;
import org.apache.commons.codec.digest.DigestUtils;
/**
* @Time : 2019/9/1 10:52
* @description:
* @公众号 : 全栈测试笔记
* @Blog : http://www.cnblogs.com/uncleyong
* @Gitee : https://gitee.com/uncleyong
*/
public class MD5Util {
// 借助apache工具类DigestUtils实现
public static String encryptToMD5(String str){
return DigestUtils.md5Hex(str);
}
public static void main(String[] args) {
String res = encryptToMD5("123456");
System.out.println(res);
}
}
![](https://img-blog.csdnimg.cn/img_convert/a3766ecb165df23792696be9d6296893.png)
DigestUtils类
![](https://img-blog.csdnimg.cn/img_convert/ddb30e9093c5f0a3cd264763a987b38e.png)
![](https://img-blog.csdnimg.cn/img_convert/84b0fec9e9fcbe4fb5e6b24ad29758f8.png)
beanshell引入java文件、调用加密方法、把加密后的值放到变量中
source()读一个bsh脚本到当前解释器(interpreter)中,或者在新的解释器中运行这个脚本。注意:路径最好参数化,不要写死
source("E:\\uncleyong\\javatest\\src\\main\\java\\com\\uncleyong\\MD5Util.java");
String password_md5 = new MD5Util().encryptToMD5("123456");
vars.put("password_md5", password_md5);
![](https://img-blog.csdnimg.cn/img_convert/d3934b1c231aaa2d6bcbe14e5979b620.png)
引用变量
![](https://img-blog.csdnimg.cn/img_convert/e5c4c365fbc7c875fa56c1be99f47c14.png)
发送请求,可以看到密码加密了
![](https://img-blog.csdnimg.cn/img_convert/a9c8fb49c5c6191a648c5b9d16d79f04.png)
引用外部class文件
引用class文件的方式,和引用java文件类似,沿用上一方法创建的maven工程,项目运行后,在左侧会生成target目录,在这个目录下,可以看到我们的包名及生成的class文件,我们需要引用这个文件
![](https://img-blog.csdnimg.cn/img_convert/aac8694095a23a1d5b11145a439ea1eb.png)
beanshell中引入类文件
注意:类文件路径不能包含包名对应的目录路径,否则会报错。添加com的父级目录路径即可。如果直接放在E盘:addClassPath("E:\\");
注意:路径最好参数化,不要写死
addClassPath("E:\\uncleyong\\javatest\\target\\classes\\");
import com.uncleyong.MD5Util;
String password_md5 = new MD5Util().encryptToMD5("123456");
vars.put("password_md5", password_md5);
![](https://img-blog.csdnimg.cn/img_convert/0e21c9338a55cc98cc69fa5c2b6a52a6.png)
addClassPath("E:\\uncleyong\\javatest\\target\\classes\\");
import com.uncleyong.MD5Util;
public static void fun(){
String password_md5 = new MD5Util().encryptToMD5("123456");
vars.put("password_md5", password_md5);
}
fun();
![](https://img-blog.csdnimg.cn/img_convert/9ac827f3f7252642b568af319b012258.png)
引用变量
![](https://img-blog.csdnimg.cn/img_convert/58e85d2bead5051bf2d64a1699bf7d00.png)
发送请求,可以看到密码加密了
![](https://img-blog.csdnimg.cn/img_convert/6c6d846ed31f20490e0155faad59e97b.png)
引用外部jar文件(推荐)
如果在beanshell中写复杂的逻辑代码,出错了,定位很不方便,所以,如果代码逻辑复杂,建议在idea或者eclipse中写好,
然后mvn package打包,生成的target目录下,会有一个jar包,把生成的jar包复制到lib下ext中引入jar包(jmeter引入jar包的3种方式:https://www.cnblogs.com/uncleyong/p/11475577.html),重启jmeter
这样我们只需要在beanshell中写很少的脚本,这也是5种方式中我极力推荐使用的方式。
继续沿用之前创建的maven项目(我们可以在idea中写比较复杂的代码,这里只是演示,所以只是很简单的代码)
![](https://img-blog.csdnimg.cn/img_convert/8c1d0742da8e42d933cc58c4875d3a0e.png)
类名调用静态方法
import com.uncleyong.MD5Util;
String password_md5 = MD5Util.encryptToMD5("123456");
vars.put("password_md5", password_md5);
![](https://img-blog.csdnimg.cn/img_convert/ead171d32a9f0951a2e77236dea4e212.png)
实例调用静态方法
import com.uncleyong.MD5Util;
String password_md5 = new MD5Util().encryptToMD5("123456");
vars.put("password_md5", password_md5);
![](https://img-blog.csdnimg.cn/img_convert/6c9d0d4e3874ec1e476b4a299d1252a7.png)
引用变量
![](https://img-blog.csdnimg.cn/img_convert/fa331e5863f40cf47fa5a99d343b508f.png)
发送请求,可以看到密码加密了
![](https://img-blog.csdnimg.cn/img_convert/978ffb363286b2db0658dbfc11e4c5c6.png)
也可以用beanshell前置处理器
![](https://img-blog.csdnimg.cn/img_convert/f7b9aeece253f8275fcf3c823e5a86c0.png)