python+pytest接口自动化之token关联登录的实现


Posted in Python onApril 06, 2022

在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文件
    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():
    查询个人信息(需要先登录系统)
    # 先从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()

执行测试用例结果如下:

python+pytest接口自动化之token关联登录的实现

说明思路二也是可行的,当然这里只执行了一条测试用例,如果执行很多的用例,效果会是怎样还没去验证,大家可以试试看。

三. 总结

  • 相对于Session/Cookies来说,请求量较大或者涉及第三方接口的系统,使用token更适合。
  • 有些项目token是放在请求头中发送的,而有一些项目则是放在请求参数里发送的,做接口自动化时要明确是哪种方式。
  • 接口自动化处理token时这两种思路可任选一种,如果使用pytest框架的话建议尝试思路二。

到此这篇关于python+pytest接口自动化(13)-token关联登录的文章就介绍到这了,更多相关python接口自动化token关联登录内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中利用原始套接字进行网络编程的示例
May 04 Python
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
Jul 04 Python
Python基于回溯法子集树模板解决m着色问题示例
Sep 07 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
Jan 30 Python
python批量修改图片尺寸,并保存指定路径的实现方法
Jul 04 Python
Python3基本输入与输出操作实例分析
Feb 14 Python
Python 基于jwt实现认证机制流程解析
Jun 22 Python
Python开发入门——迭代的基本使用
Sep 03 Python
Scrapy中如何向Spider传入参数的方法实现
Sep 28 Python
python如何快速拼接字符串
Oct 28 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
Nov 20 Python
Python集合set()使用的方法详解
Mar 18 Python
Python图像处理库PIL详细使用说明
Apr 06 #Python
Python可变与不可变数据和深拷贝与浅拷贝
Apr 06 #Python
Python 全局空间和局部空间
Apr 06 #Python
Selenium浏览器自动化如何上传文件
Apr 06 #Python
在Python 中将类对象序列化为JSON
Apr 06 #Python
Python中itertools库的四个函数介绍
Apr 06 #Python
如何用六步教会你使用python爬虫爬取数据
You might like
简单易用的计数器(数据库)
2006/10/09 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
2011/06/16 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
基于PHP给大家讲解防刷票的一些技巧
2015/11/18 PHP
php+jquery+html实现点击不刷新加载更多的实例代码
2016/08/12 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
2017/11/06 PHP
php实现统计二进制中1的个数算法示例
2018/01/23 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
2019/07/15 PHP
jQuery库与其他JS库冲突的解决办法
2010/02/07 Javascript
JSON.stringify 语法实例讲解
2012/03/14 Javascript
js获取系统的根路径实现介绍
2013/09/08 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
基于Jquery代码实现手风琴菜单
2015/11/19 Javascript
jQuery事件绑定用法详解
2016/09/08 Javascript
微信小程序  modal弹框组件详解
2016/10/27 Javascript
如何使用angularJs
2017/05/08 Javascript
微信小程序--组件(swiper)详细介绍
2017/06/13 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
layui表格数据复选框回显设置方法
2019/09/13 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
python发送邮件的实例代码(支持html、图片、附件)
2013/03/04 Python
详解Python中的各种函数的使用
2015/05/24 Python
Python中的探索性数据分析(功能式)
2017/12/22 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
python或C++读取指定文件夹下的所有图片
2019/08/31 Python
西班牙香水和化妆品购物网站:Arenal Perfumerías
2019/03/01 全球购物
香港演唱会订票网站:StubHub香港
2019/10/10 全球购物
测绘工程系学生的自我评价
2013/11/30 职场文书
英文简历中的自我评价用语
2013/12/09 职场文书
医学求职信
2014/05/28 职场文书
财政局党的群众路线教育实践活动整改方案
2014/09/21 职场文书
2015年艾滋病防治工作总结
2015/05/22 职场文书
Golang 正则匹配效率详解
2021/04/25 Golang
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python
SpringBoot详解执行过程
2022/07/15 Java/Android