性能测试时,有一个登录接口, 登录成功后,会返回一个登录凭证token。但这个token不是在响应应答里面返回而是在响应头里面会返回一个set-cookie,如下:
HTTP/1.1 200 OK
Server: hsiar
Date: Fri, 30 Oct 2020 03:24:14 GMT
Content-Type: application/json;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: token=6e204d9b-103a-431e-b8de-ba97b2d1; path=/; HttpOnly
Access-Control-Allow-Origin: 192.168.xx.xxx
Access-Control-Allow-Methods: GET,POST
Access-Control-Allow-Headers: x-msg-timeout,X-Msg-Trace,csrfcheck,ShardingInfo,Partition,broker_key,X-Original-URI,X-Request-Method,Authorization,access_token,login_account,auth_password,user_type,tenant_id,auth_code,Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With
Allow: POST,GET,OPTIONS
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: x-msg-timeout,X-Msg-Trace,csrfcheck,ShardingInfo,Partition,Date,Server
一看, 这个也很easy,通过python+requests库,获取到响应头,直接解析出来即可;这样能快速获取到大量的登录凭证;所以产生了如下代码:
# -*- coding: utf-8 -*-
import json
import requests
__author__ = "chenk"
class Interfaces:
"""接口请求类"""
ANALYSIS_FC_PREFIX = "http://10.20.xx.xxx:xx/f"
SERVICE_MALL_PREFIX = "http://10.20.xx.xxx:xx/"
HEADERS = {"Content-Type": "application/json",
"Accept": "application/json"}
def __init__(self):
pass
def request(self, url, data, is_get_method=True, verify=False, headers={}):
# print("Will Reuqeuest Interface: {}".format(url))
# print("Augues as follows: \n{}".format(data))
if not headers:
headers = Interfaces.HEADERS
if is_get_method:
r = requests.get(url=url, headers=headers, verify=verify, params=data)
else:
r = requests.post(url=url, headers=headers, verify=verify, params=data, data=data)
result = r.headers
# print("Response: \n{}".format(result))
return result
import time
interfaces = Interfaces()
if __name__ == "__main__":
url = "http://10.20.xx.xx:xxx/g/cultivate-user-service/v/appauth/login"
data = {"mobile": "18255000000",
"fund_account": "55000000",
"cid": "55000000",
"client_id": "55000000",
}
count = 1
# count = 2
start = 1
run_time = 0
# f = open(file=r"D:\jmeter\apache-jmeter-5.0\bin\token.txt", mode="w")
while count:
# data.update({"code": str(start+run_time)})
result = interfaces.request(url=url, data=data, is_get_method=True)
for k, v in result.items():
print(k, v)
# print(requests.utils.dict_from_cookiejar(result))
count -= 1
# run_time += 1
# try:
# token = result.get("data").get("token")
# f.write(token + "\n")
# except Exception as e:
# print(str(e))
# print("data:", data)
# print("result: ", result)
# continue
# time.sleep(0.01)
# f.close()
print("done!")
执行结果中,发现所有响应头都返回了, 就是没有set-cookie这玩意,通过jmeter调用的时候,发现能够获取到, 故先不纠结python里面为啥获取不到,先保证手头工作要紧,毕竟打工人;
jmeter里面就两个地方需要注意:
1.响应头中的token获取
我这边用了一个后置处理器——正则提取器,提取设置如下:
提取完毕后, 如何保存token值到一个文件里面?
2.保存提取的token数据
使用BeanShell Sampler, 编写一个简单类,代码如下:
FileWriter fstream = new FileWriter("E://token.csv", true);
BufferedWriter out = new BufferedWriter(fstream);
out.write( vars.get("get_token"));
out.write(System.getProperty("line.separator"));
out.close();
fstream.close();
FileWriter 创建了一个对象, 并指定文件存储路径为:E://token.csv;
jmeter中的变量可通过 vars.get(“变量名”)获取变量值;
System.getProperty(“line.separator”) 会在token写入后,换行,根据实际调整;
注意:上述代码会默认在尾部追加的形式写入文件;若不需要,可以直接删除文件直接生成,也可以更改代码中文件对象的写入方式;
最终程序执行完毕, 快速生成了一个存储了2万个token的文件,大工告成: