本文为博主原创,未经许可严禁转载。
本文链接:https://blog.csdn.net/zyooooxie/article/details/108628094
之前分享过一期模拟登录 Requests.Session() 会话维持 ,最近组里要做接口自动化,那我想用Python直接搞起来;后面大佬说要统一使用JMeter;
学着跑通了登录+某些要鉴权的请求,就来分享下 我是如何使用的。
个人博客:https://blog.csdn.net/zyooooxie
登录请求
可以看到 请求时 用Cookie里的 SESSION字段值 来鉴权;
【实际鉴权方式: 利用服务器端的session(会话)和浏览器端的cookie来实现前后端的认证(我这的SESSION 即SessionId),但是本篇分享讲的是 headers的cookie】
requests
我尝试了2种方式:
A. 实例化RequestCookieJar,传到cookies + 将cookie建字典,传到cookies
B.cookie放在请求头参数 headers
cookies参数
第一种
rcj = RequestsCookieJar()
rcj.set(‘SESSION’, use_cookie)
r4 = requests.post(url_logout, cookies=rcj)
第二种
r31 = requests.post(test, json=test_dict, cookies={‘SESSION’: use_cookie})
headers参数
use_header = {‘Cookie’: ‘SESSION={}’.format(use_cookie)}
r32 = requests.post(test, json=test_dict, headers=use_header)
代码
某些信息被删除了,见谅!
import requests
from requests.cookies import RequestsCookieJar
url_key = 'http://api/auth/get/key'
url_login = 'http://api/auth/login'
url_logout = 'http://api/auth/logout'
test = 'http:///bill-list-query'
r1 = requests.get(url_key)
print('获取key', r1.json())
key = r1.json()['data']
test_dict = {'code': '123', 'key': key, 'password': '', 'phone': ''}
r2 = requests.get(url_login, params=test_dict)
assert r2.json()['msg'] == 'success'
print('登录', r2.json())
print(r2.cookies)
use_cookie = r2.cookies['SESSION']
test_dict = {'': 1, '': '10', '': 10, '': 11, '': 10}
r3 = requests.post(test, json=test_dict)
print(r3.json(), '这是第一')
r31 = requests.post(test, json=test_dict, cookies={'SESSION': use_cookie})
print('这是第二', r31.json())
use_header = {'Cookie': 'SESSION={}'.format(use_cookie)}
r32 = requests.post(test, json=test_dict, headers=use_header)
print('第三次', r32.json())
rcj = RequestsCookieJar()
rcj.set('SESSION', use_cookie)
r4 = requests.post(url_logout, cookies=rcj)
assert r4.json()['msg'] == 'success'
print(r4.json())
实际用python来做接口自动化时,我的脚本是用实例化RequestCookieJar来实现的。
方案:第一步 登录,拿到cookie值,存到yaml文件 【setUpClass】;第二步 其他接口要请求时,先读取yaml的cookie值【第一行】,实际请求要附带cookie【test1】;第三步 对请求返回值 断言【最后两行】;最后 退出系统【tearDownClass】。
JMeter
所有请求放在同一线程组(共享cookie)
1.自动管理cookie
加一个空的HTTP Cookie Manager,即可自动保存cookie,并且能够在同一个线程组之间传递cookie;
如果我 非得想用 做变量,咋办?
这是 因为jmeter默认不保存cookie,需要设置 jmeter .properties文件
CookieManager.save.cookies=true
重启jmeter,重新跑,看看。
(当执行脚本后,HTTP Cookie Manager获取到的cookie 被自动保存在变量里(具体的变量名格式为"COOKIE_xxxx","COOKIE_"为前缀),其中xxxx为具体的实际cookie名。)
线程组内新增cookie 【手动增加】
利用HTTP Cookie Manager 来add某可用的cookie
当然 也可以使用 HTTP Header Manager 来add
线程组内关联cookie
跨线程组传递 cookie 【设置全局变量】
第一步 先设置 CookieManager.save.cookies=true
第二步 线程组A 请求登录接口后,设置全局变量
第三步 线程组B 使用全局变量
第四步 保证线程组顺序执行
请求登录接口后,设置全局变量
有2个方法:
- 登录请求 为其新增一个后置BeanShell PostProcessor
通过查看Debug Sampler1,已经得知cookie的名称: COOKIE_SESSION; 使用__setProperty函数,
- 登录请求,后续一个BeanShell Sampler
使用__setProperty函数
其他线程组的请求 使用此全局变量
先在其他线程组 确定下,能不能查到此变量
使用HTTP Cookie Manager,新增cookie (使用__P函数调用 此变量)
当然可用 HTTP Header Manager,设置cookie
第四步 按顺序执行 说的是
Postman
手动新创建cookie
1.直接请求,接口返回401,同时响应头 Set-Cookie: SESSION=xxx; Path=/; HttpOnly
2.手动修改其为某个已经登录后的字段值;
3.再次请求
实际手动新增:
设置变量 共享cookie
交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie