1. 起因
最近测试的同事需要用jmeter
工具压测一下我们项目的接口,因为接口中有token或者加密登录密码等逻辑,有的地方需要从上一步接口中拿到结果作为下一步的参数,进行传递。因为涉及的有点麻烦,就帮测试看了下这个工具。顺便记录一下,帮助需要的人。
以下是我配置好的一个jmeter
文件截图及参考地址,百度网盘地址 ,提取码 pwcg
。
2. 需要了解的知识点
2.1 jmeter工具使用方法
因为需要用到jmeter
工具,所以简单的用法必须要会,首先从官网上下载一个jmeter
工具,jmeter下载地址,然后下载下图的文件即可。当前我用的是5.3版本。
至于使用方法,全面的还是搜专业的人介绍吧,我主要说接口的参数配置那块。
2.2 接口请求头
这块知识点,如果要调试接口,那必须要了解整个接口的请求头,看下图,下图就是我在用chrome浏览器访问项目时,点开F12
,调试的一个登录接口情况,我把其中一些没用的东西都去掉了,留下了一些主要用到的。
General
Request URL: http://127.0.0.1:15830/api/security/loginNew
Request Method: POST
Status Code: 200
Response Headers
Connection: keep-alive
Content-Type: application/json;charset=UTF-8
Request Headers
Accept: application/json, text/plain
Content-Type: application/json;charset=UTF-8
Cookie: ynzl_jessionid=9550a16f-019e-4f86-b78d-65bf019e9e92;
Request Payload
{username: "znxd",…}
username: "znxd"
password: "aZNekASIbrGBVJDNgQE5Yb+GjNZd4anGJvpVMg8sYBurHVyTgY2e90MW4UkZORlwccpBSuhhV32/nc6+g+a3KyBT9XMSnR9YDylZUd9zdXKec2sz00BmcJP3Th2l8Z9JhJDXcYnSwY311RmuTOuUrxWNHd3B4FnLgsLRHwiPuV4="
captcha: "n86fy"
其中General
部分大家都清楚,请求地址和请求方式。
往往大家容易忽略的就是Request Headers
,即请求接口的消息请求头配置,这块Content-Type
和Cookie
忘记传,基本都会导致接口请求错误。
Content-Type
表示接口的请求参数格式,比如是json
格式,那就必须设置为application/json
,如果没有设置这个,那最下边的Request Payload
里参数格式一定不是json
,也会导致请求失败。如果是其他格式,那就要设置其他的。
因为测试接口的时候,大家也要先用浏览器访问下项目,即F12
里参考,那就也从下图里去参考复制即可。
另外,对于cookie
,这个要看项目框架怎么设计,像我们的项目简单,基本就依据cookie
跟后台交互,作为特定身份。但是有的人设计的项目,可能会自定义其他请求头,所以如果有这种情况,也要在jmeter
接口请求时,设置一下!!!,比如有的人可能多加了一个context-token
的请求头也是有可能的。
对于这种情况,就是一定要跟项目后端开发人问清楚,到底他们是怎么传递的身份验证令牌。了解了这个就好弄了。
3. 配置流程
我们项目里涉及到登录密码加密处理、登录成功后cookie里需要设置上固定的令牌,有了令牌才能进行后续的接口调用。
3.1 基础配置介绍
涉及到jmeter
里创建的元素有如下几个,它们的关系如下:
jmeter
里配置主要是基于线程组
进行设置,压测应该都是基于这个来的,因此线程组需要先创建,如下图所示,右击面板,找到添加,按照下图来。
线程组
之后,就可以按照项目接口的请求逻辑添加http请求
。
而http请求
下,可以添加前置处理器
、后置处理器
、配置元件
、监听器
等。
前置处理器
可以用来处理请求之前对参数的编辑等,比如我这里会引用前端加密js文件,使用前端js的方法,对密码进行加密后,再传输。
后置处理器
可以用来处理请求之后,对结果集的处理,比如我这里是登录之后拿到token
,并通过正则截取,将token
值添加到全局值里边,之后会在每个请求头里添加cookie
的设置。
配置元件
里有http信息头管理器
,我这里主要也是用的它,即编辑cookie
值。
监听器
里有察看结果树
,我这里主要用它看,整个线程组下接口调用的情况。
当配置了监听器
后,才有必要执行线程组
,如果没有输出,那就没有必要执行,要想运行可以执行下图的地方。
如上图,配置完了之后,可以按照上边的步骤执行,执行完之后,点击察看结果树
,查看运行结果即可。
3.2 cookie获取
基础配置完了,就说一下配置流程。首先,为什么要先设置cookie
?因为当你第一次访问一个项目,比如初次打开一个项目,第一次调用后台接口时,都会在请求头里看到cookie
值的。cookie
值与后台的session
一一对应,也是大部分项目身份的信息,你只有拿着服务端承认的cookie
,才能找到服务端对应的session
,让服务端承认你。
如果是首次访问项目,那就先找到第一个调用后台服务的接口,一般情况下,这时候cookie
值基本都会在response headers
的set-cookie
里,之后再访问都是request headers
的Cookie
里。所以jmeter
里进行截取的时候,表达式的写法也需要注意,不要写死为set-cookie
,因为之后可能不叫这个名字了。
如下图,因为验证码接口是我的项目首次加载,第一次调用的后台接口,也就是说在这个接口上,初次获取到cookie
,因此我这里要,先调用验证码的接口,拿到cookie
值,并存储下来,因此这个http请求
下,还有一个后置处理器
,用来从消息头里提取cookie
值。
通过浏览器里访问项目F12
可以看到,该接口首次set-cookies
,需要正则截取出sso_jessionid=
对应后边的值。
set-cookie: sso_jessionid=faa43735-d212-4e80-b1be-ae22b85798cb; Path=/api; HttpOnly; SameSite=lax
下图是对应当前请求下后置处理器
,通过正则提取cookie
,截取的表达式为sso_jessionid=(.{1,36})
,表示的意思是从sso_jessionid=
后开始,第1
个字符开始,往后获取到第36
个字符,.
的意思表示任意字符。$1$
表示正则之后结果取第1个匹配内容。将获取到的数据,赋值给jemeter
全局参数的sso_jessionid
值。这样在其后任意地方都可以通过${sso_jessionid}
取值。
3.3 获取公钥值
由于我们项目登录采用RSA
非对称加密,并且加密的公钥私钥,由后台生成,并传给前端,后端又将私钥存储在对应的session
里,这样的话,需要调用公钥获取接口。
对于获取公钥接口设置上,就要注意两点。一个就是公钥获取后需要对返回值截取获取公钥;另一个就是必须使用前一步设置的cookie
值。因为后台私钥存储在对应的session
里,就必须从这一步开始由前端使用cookie
值与后端交互,否则就会导致身份不一致,后端找不到对应的私钥。
设置cookie
值,如下,因为前一步已经获取了sso_jessionid
,在这里通过${sso_jessionid}
进行设置。注意这里的请求头的Cookie
为首字母大写。
获取公钥之后,进行正则提取返回结果,当前接口返回结果的data
里有对应的公钥。因为是从返回值里截取,因此这里选择主体
,而不再是信息头
。
3.4 登录逻辑
当获取到公钥之后,就需要jmeter
引用前端js
文件,对密码进行加密处理,并且再传给登录接口。
因为这相当于是登录接口之前的处理,所以,需要在该接口上建一个前置处理器
,如下图所示:
因为是js
逻辑,因此这里选语言为javascript
,对应的脚本逻辑如下:
var navigator = this;
var window = this;
load("jsencrypt.js");
var publickey = vars.get("publicKey");
function RSA()
{
var encrypt = new JSEncrypt();
encrypt.setPublicKey(publickey);
log.info("获取到的公钥是:"+publickey);
var password = encrypt.encrypt("znxd2018");
vars.put("password",password);
log.info("加密后的密码为:"+password);
}
RSA();
注意load("jsencrypt.js");
这句,因为相当于jmeter
要引用第三方的js
文件,这里既然加载,那必须需要我们提前将这个jsencrypt.js
文件放到约定好的位置,才能load
。jmeter
对于引用的东西,可以放到bin
目录里,如下图:
当放好这个js
文件之后,才可以引用使用,否则会报前端的undefined
错误。其他的可以参照上边的脚本写,因为每个项目的逻辑不同,就不多解释了,就是语言写法别写错了,当时有的同事,上边选的js
,下边写的是java
,挺尴尬的。
另外注意vars.put("password",password);
这句话,表示密码处理好之后,也添加到jmeter
全局变量里边,这个是js的一种写法,设置好之后,也是可以在任意地方通过${password}
引用。
最后,因为登录接口我们要求的是json
格式请求(参照上边2.2的参数体),因此对于这个登录接口的请求设置消息头里,要添加application/json
才可以,并且请求参数要写为json
格式。如下图:
登录其实是有验证码的,即上图的captcha
,因为接口测试没法拿到这个,因此我后端暂时把验证码校验关闭,这里就随便传了个1
。
对于我们的项目,请求头里必须要有下边两个消息头才行。
4. 总结
针对于接口这块,因为涉及到身份验证及请求头信息的问题,有的仅仅测试人员是没法进行的,也是需要跟后端开发沟通清楚一些登录、接口调用逻辑。
如果对http请求
比较了解的话,其实就根据浏览器F12
调试器里,也能排查出来,这里跟大家推荐一本http协议
学习的书,可以提高对请求头
的认识。《图解HTTP》 (日)上野宣著,这本书写的比较简单,而且还有图,看起来也比较轻松的。
因为我是临时帮忙设置,也第一次用jmeter
,如果有对应的问题,我也不懂,写的比较简单,大家仅供参考。