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使用struct处理二进制的实例详解
Sep 11 Python
NetworkX之Prim算法(实例讲解)
Dec 22 Python
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
Jan 04 Python
使用sklearn之LabelEncoder将Label标准化的方法
Jul 11 Python
Python3 导入上级目录中的模块实例
Feb 16 Python
学习python可以干什么
Feb 26 Python
WxPython实现无边框界面
Nov 18 Python
Python脚本如何在bilibili中查找弹幕发送者
Jun 04 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
Jan 19 Python
Python实现粒子群算法的示例
Feb 14 Python
python中scipy.stats产生随机数实例讲解
Feb 19 Python
Python基础详解之描述符
Apr 28 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
PHP下一个非常全面获取图象信息的函数
2008/11/20 PHP
ajax在joomla中的原生态应用代码
2012/07/19 PHP
PHP动态页生成静态页的3种常用方法
2014/11/13 PHP
PHP获取文件相对路径的方法
2015/02/26 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
2017/05/23 PHP
JavaScript中关于indexOf的使用方法与问题小结
2010/08/05 Javascript
jquery滚动条插件jScrollPane的使用介绍
2013/11/08 Javascript
JQuery异步加载无限下拉框级联功能实现示例
2014/02/19 Javascript
jquery下div 的resize事件示例代码
2014/03/09 Javascript
Node.js 的异步 IO 性能探讨
2014/10/08 Javascript
JavaScript实现点击按钮就复制当前网址
2015/12/14 Javascript
JavaScript实现搜索框的自动完成功能(一)
2016/02/25 Javascript
AngularJS入门教程之服务(Service)
2016/07/27 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
微信小程序商品详情页的底部弹出框效果
2020/11/16 Javascript
解决Layui中layer报错的问题
2019/09/03 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
Python实现从订阅源下载图片的方法
2015/03/11 Python
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
Python编写一个优美的下载器
2018/04/15 Python
Python判断中文字符串是否相等的实例
2018/07/06 Python
详解Python3 基本数据类型
2019/04/19 Python
Python3简单实现串口通信的方法
2019/06/12 Python
浅析PEP572: 海象运算符
2019/10/15 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
Python 实现向word(docx)中输出
2020/02/13 Python
Python爬取YY评级分数并保存数据实现过程解析
2020/06/01 Python
浅谈基于Canvas的手绘风格图形库Rough.js
2018/03/19 HTML / CSS
大学生实习自我鉴定
2013/12/11 职场文书
体育系毕业生自荐信
2014/06/28 职场文书
通报表扬范文
2015/01/17 职场文书
2015年加油站站长工作总结
2015/05/27 职场文书
详解php中流行的rpc框架
2021/05/29 PHP
Nginx防盗链与服务优化配置的全过程
2022/01/18 Servers
2022漫威和DC电影上映作品
2022/04/05 欧美动漫