python+pytest接口自动化(13)-token关联登录
在PC端登录公司的后台管理系统或在手机上登录某个APP时,经常会发现登录成功后,返回参数中会包含token,它的值为一段较长的字符串,而后续去请求的请求头中都需要带上这个token作为参数,否则就提示需要先登录。
这其实就是状态或会话保持的第三种方式token。
一. 什么是token
token 由服务端产生,是客户端用于请求的身份令牌。第一次登录成功时,服务端会生成一个包含用户信息的加密字符串token,返回给客户端并保存在本地,后续客户端只需要带上token进行请求即可,无需带上用户名密码。
token原理简单概括如下:
用户首次登录成功后,服务端会生成一个token值,服务端会将它保存保存在数据库中,同时也会将它返回给客户端;
客户端拿到token值后,保存在本地;
后续客户端再次发送除登录外的其他请求时,会把保存在本地的token值作为参数一起发送给服务端;
服务端收到客户端的请求后,会拿发送过来的token值与保存在数据库中的token值进行比较;
如果两个token值相同, 则说明当前用户处于登录状态;
如果数据库中没有这个token值或者token值已经生效,则需用户重新登录。
二. token场景处理
公司某管理后台系统,登录后返回token,接着去请求其他接口时请求头中都需要加上这个token,否则提示请先登录。
请求该系统的登录接口如下:
import requests
import json
headers = {"Content-Type": "application/json;charset=utf8"}
url = "http://127.0.0.1:5000/login"
_data = {
"username": "刘德华",
"password": "123456"
}
res = requests.post(url=url, headers=headers, json=_data).text
print(res)
结果如下:
{
"code": 1000,
"msg": "登录成功!",
"token": "sh34ljjl08s32730djsh34ljjl08s32730djsh34ljjl08s32730djsh34ljjl08s32730djsh34ljjl08s32730djsh34ljjl08s32730dj"
}
在对扎样的项目做接口自动化测试时,需要先请求登录接口拿到token,再去请求别的接口。每次请求其他接口时先请求一次登录接口,这样做虽然可行,但这样不仅会降低自动化的执行效率,而且每次都请求登录也会对服务器资源造成浪费。
这里介绍如下两种处理思路。
1. 思路一
在执行用例之前,先请求登录接口,并将返回的token值存储在文件中(如yaml文件),后续请求需要用到token值则从该文件。
python中yaml文件的读写请参考我之前的文章Python读写yaml文件(使用PyYAML库)。
1,运行接口自动化测试框架,初始化时先请求登录接口,获取token值,并写入指定的yaml文件中。
import requests
import json
import yaml
def get_token():
'''
请求登录接口,获取token
:return:
'''
headers = {"Content-Type": "application/json;charset=utf8"}
url = "http://127.0.0.1:5000/login"
_data = {
"username": "刘德华",
"password": "123456"
}
res = requests.post(url=url, headers=headers, json=_data).text
res = json.loads(res)
token = res["token"]
return token
def write_yaml(token):
'''
写入yaml文件
:return:
'''
t_data = {
"token": token
}
with open("yaml文件路径", "w", encoding="utf-8") as f:
yaml.dump(data=t_data, stream=f, allow_unicode=True)
if __name__ == '__main__':
token = get_token() # 获取token
write_yaml(token) # 将token值写入yaml文件
2,执行测试用例时先读取yaml文件中token值,并将token加入headers中(也有些是将token放在请求参数中,视被测试项目具体情况而定),再发送请求。
import requests
import yaml
import pytest
import json
def read_yaml():
'''
读yaml文件
:return:
'''
with open('yaml文件路径', 'r', encoding='utf-8') as f:
result = yaml.load(f.read(), Loader=yaml.FullLoader)
token = result["token"]
return token
def test_check_user():
'''
查询个人信息(需要先登录系统)
:return:
'''
# 先从yaml文件中读取token
token = read_yaml()
# 再将token添加到请求头中
headers = {
"Content-Type": "application/json;charset=utf8",
"token": token
}
url = "http://127.0.0.1:5000/users/3"
res = requests.get(url=url, headers=headers).text
# 返回结果为json格式,转换为字典
res = json.loads(res)
# 断言code是否为1000
assert res["code"] == 1000
if __name__ == '__main__':
pytest.main()
这里仅仅只是举例说明,而在实际的框架中,我们需要把这些诸如yaml文件的读写这样的函数单独封装在某个模块中,供其他模块调用,这样会代码会更加清晰简洁。
2. 思路二
利用pytest中的Fixture函数,作用域设置为session,并返回token值,后续测试方法/函数调用该Fixture函数。
pytest中Fixture的使用请参考我之前的文章pytest(6)-Fixture(固件)。
1,首先,在conftest中定义一个作用域为session的Fixture函数,用于请求登录接口返回token。
import pytest
import requests
import json
@pytest.fixture(scope="session")
def get_token_fixture():
'''
作用域为session的fixture函数,返回token
:return:
'''
headers = {"Content-Type": "application/json;charset=utf8"}
url = "http://127.0.0.1:5000/login"
_data = {
"username": "刘德华",
"password": "123456"
}
res = requests.post(url=url, headers=headers, json=_data).text
res = json.loads(res)
token = res["token"]
return token
2,接着,测试用例调用该Fixture。
def test_check_user(get_token_fixture):
'''
查询个人信息(需要先登录系统)
:return:
'''
# 通过Fixture函数g获取et_token_fixture值,即token,再将token添加到请求头中
headers = {
"Content-Type": "application/json;charset=utf8",
"token": get_token_fixture
}
url = "http://127.0.0.1:5000/users/3"
res = requests.get(url=url, headers=headers).text
res = json.loads(res)
print(res)
print(headers)
assert res["code"] == 1000
if __name__ == '__main__':
pytest.main()
执行测试用例结果如下:

说明思路二也是可行的,当然这里只执行了一条测试用例,如果执行很多的用例,效果会是怎样还没去验证,大家可以试试看。
三. 总结
- 相对于Session/Cookies来说,请求量较大或者涉及第三方接口的系统,使用token更适合。
- 有些项目token是放在请求头中发送的,而有一些项目则是放在请求参数里发送的,做接口自动化时要明确是哪种方式。
- 接口自动化处理token时这两种思路可任选一种,如果使用pytest框架的话建议尝试思路二。
python+pytest接口自动化(13)-token关联登录的更多相关文章
- python+pytest接口自动化(9)-cookie绕过登录(保持登录状态)
在编写接口自动化测试用例或其他脚本的过程中,经常会遇到需要绕过用户名/密码或验证码登录,去请求接口的情况,一是因为有时验证码会比较复杂,比如有些图形验证码,难以通过接口的方式去处理:再者,每次请求接口 ...
- python+pytest接口自动化(11)-测试函数、测试类/测试方法的封装
前言 在python+pytest 接口自动化系列中,我们之前的文章基本都没有将代码进行封装,但实际编写自动化测试脚本中,我们都需要将测试代码进行封装,才能被测试框架识别执行. 例如单个接口的请求代码 ...
- python接口自动化23-token参数关联登录(登录拉勾网)
前言 登录网站的时候,经常会遇到传token参数,token关联并不难,难的是找出服务器第一次返回token的值所在的位置,取出来后就可以动态关联了 登录拉勾网 1.先找到登录首页https://pa ...
- python+pytest接口自动化(16)-接口自动化项目中日志的使用 (使用loguru模块)
通过上篇文章日志管理模块loguru简介,我们已经知道了loguru日志记录模块的简单使用.在自动化测试项目中,一般都需要通过记录日志的方式来确定项目运行的状态及结果,以方便定位问题. 这篇文章我们使 ...
- python+pytest接口自动化(6)-请求参数格式的确定
我们在做接口测试之前,先需要根据接口文档或抓包接口数据,搞清楚被测接口的详细内容,其中就包含请求参数的编码格式,从而使用对应的参数格式发送请求.例如某个接口规定的请求主体的编码方式为 applicat ...
- python+pytest接口自动化(10)-session会话保持
在接口测试的过程中,经常会遇到有些接口需要在登录的状态下才能请求,否则会提示请登录,那么怎样解决呢? 上一篇文章我们介绍了Cookie绕过登录,其实这就是保持登录状态的方法之一. 另外一种方式则是通过 ...
- python+pytest接口自动化(4)-requests发送get请求
python中用于请求http接口的有自带的urllib和第三方库requests,但 urllib 写法稍微有点繁琐,所以在进行接口自动化测试过程中,一般使用更为简洁且功能强大的 requests ...
- python+pytest接口自动化(12)-自动化用例编写思路 (使用pytest编写一个测试脚本)
经过之前的学习铺垫,我们尝试着利用pytest框架编写一条接口自动化测试用例,来厘清接口自动化用例编写的思路. 我们在百度搜索天气查询,会出现如下图所示结果: 接下来,我们以该天气查询接口为例,编写接 ...
- python+pytest接口自动化(1)-接口测试基础
接口定义 一般我们所说的接口即API,那什么又是API呢,百度给的定义如下: API(Application Programming Interface,应用程序接口)是一些预先定义的接口(如函数.H ...
随机推荐
- SuperEdge: 使用WebAssembly扩展边缘计算场景
作者 SuperEdge 开发者团队 概要 SuperEdge 是 一个开源的分布式边缘计算容器管理系统,用于管理多个云边区域中的计算资源和容器应用. 在当前架构中,这些资源和应用能够作为一个 Kub ...
- SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据
SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...
- 命令行安装django以及新建项目及应用
1:安装django项目,使用pip命令进行安装,默认安装的是最高版本,可以使用pip install django==1.1.11进行指定版本安装 2:新建django项目 2.1:首先切换到创建项 ...
- WOE(weight of evidence, 证据权重)
1. WOE(weight of evidence, 证据权重) WOE是一种衡量正常样本( Good)和违约样本( Bad)分布的差异方法 WOE=ln(Distr Good/Distr Bad)例 ...
- redis.conf配置信息详解
redis.conf配置信息详解 配置文件 # Redis 配置文件 # 当配置中需要配置内存大小时,可以使用 1k, 5GB, 4M 等类似的格式,其转换方式如下(不区分大小写) # # 1k =& ...
- 程序语言与编程实践4-> 蓝桥杯C/C++备赛记录2 | 第二周学习训练
0323,又是一周星期三,按道理该总结了.这周前几天写题比较多,后面事情多了起来,就没怎么写了.主要方向是洛谷的基本语法熟悉,PTA平台数据结构的一些题目. 0323附上: 题目比较多,所以文章可能有 ...
- loj2341「WC2018」即时战略(随机化,LCT/动态点分治)
loj2341「WC2018」即时战略(随机化,LCT/动态点分治) loj Luogu 题解时间 对于 $ datatype = 3 $ 的数据,explore操作次数只有 $ n+log n $ ...
- 是否可以从一个static方法内部调用非static方法?
不可以.静态成员不能调用非静态成员. 非static方法属于对象,必须创建一个对象后,才可以在通过该对象来调用static方法.而static方法调用时不需要创建对象,通过类就可以调用该方法.也就是说 ...
- @Controller 注解?
该注解表明该类扮演控制器的角色,Spring不需要你继承任何其他控制器基类或引用Servlet API.
- elasticsearch 索引数据多了怎么办,如何调优,部署 ?
面试官:想了解大数据量的运维能力. 解答:索引数据的规划,应在前期做好规划,正所谓"设计先行,编码在后", 这样才能有效的避免突如其来的数据激增导致集群处理能力不足引发的线上客户 ...