进行性能测试时,有可能遇到一种场景:接口请求由于安全问题,需要进行加密发送。
这种场景下,使用Jmeter实现性能测试,则也需要使用同样的加密规则发送请求报文。
要实现此类性能测试有几种策略:
- 直接去除密文规则 - 由于报文加密并非性能关键,那么简单起见,直接测试明文请求一定程度上是可以接受的。
- 使用同样的加密规则加密报文发送 - 这样处理显然更接近实际场景,所以是一般比较推荐的做法。
本文讨论使用Jmeter发送加密请求实现性能测试。
打包加密方法Jar包,导入Jmeter
首先,确认被测产品的加密策略。
这个过程应该通过阅读接口定义文档,询问开发人员,辅以抓包解析。
比如说,对于创建订单接口的抓包结果:
请求报文:
POST https://ops.********.cn/***-api/member/system/login HTTP/1.1
Accept-Language: zh-CN,zh;q=0.8
User-Agent: Mozilla/5.0 (Linux; U; Android 6.0.1; zh-cn; Redmi 4A Build/MMB29M) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
token: 90e76710e105b217d185832057220cdd
appCode: ******
compCode: ****
Content-Type: application/x-www-form-urlencoded
Content-Length: 99
Host: ops.********.cn
Connection: Keep-Alive
Accept-Encoding: gzip
account=*********&password=2ac9cb7dc02b3c0083eb70898e549b63&sign=4b9932154067b4a35bd4c2e9eba8036f
以上的请求可以分析得出,加密的部分主要是password参数以及验签码sign(本例中是对请求参数部分加密,实际上整体报文加密可能更常见)。
然后,我们需要准备相应的加密方法。
这里推荐让开发人员直接给出产品原始的加密方法,予以导出形成jar包,以保证性能测试的加密方法与产品原始加密规则一致。
或者如果明确加密方式,也可以使用第三方加密jar包,或者自己编写。这里更推荐第一种,与开发协调取得。
最后,将准备好的jar包,导入Jmeter测试计划当中。
加密参数
使用BeanShellPreProcessor,实现对请求的加密。
思路是:
- 导入使用第一步中的jar包作为加密工具库
- 使用特定密钥,对需要加密的字段进行加密处理
- 将加密后的字段存储为变量,供接口调用使用。
BeanShell代码如下:
import cn.hutool.json.JSONUtil;
import com.***.controller.HttpClientUtil;
import com.***.encrypt.EncryptUtil;
import com.***.encrypt.gmhelper.MD5Util;
import java.util.HashMap;//设置密钥
String signKey = "47fbbbd********0b8d7378";
//读取用户账户变量
String useraccount = vars.get("user");
String pass = vars.get("pass");
//加密处理
paramMap = new HashMap();
String password = MD5Util.encrypt(pass);
paramMap.put("account", useraccount);
paramMap.put("password", password);
String sign = EncryptUtil.md5sign1(paramMap, signKey).toLowerCase();
//将加密后的参数存储为变量
vars.put("password",password);
vars.put("sign",sign)
随后,只要在接口请求当中,使用变量的形式传参,即可实现请求报文部分加密传送。
调用接口发送请求,验证得知报文加密已实现:
同理可以实现多个不同接口的请求加密过程,整体Jmeter项目构成如下:
点赞关注!!了解更多,加入我们。642830685。群内免费领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!技术大牛解惑答疑,同行一起交流。