python+pytest接口自动化(13)-token关联登录

简介: 在PC端登录公司的后台管理系统或在手机上登录某个APP时,经常会发现登录成功后,返回参数中会包含token,它的值为一段较长的字符串,而后续去请求的请求头中都需要带上这个token作为参数,否则就提示需要先登录。这其实就是状态或会话保持的第三种方式token。

一. 什么是token


token 由服务端产生,是客户端用于请求的身份令牌。第一次登录成功时,服务端会生成一个包含用户信息的加密字符串token,返回给客户端并保存在本地,后续客户端只需要带上token进行请求即可,无需带上用户名密码。


token原理简单概括如下:

  1. 用户首次登录成功后,服务端会生成一个token值,服务端会将它保存保存在数据库中,同时也会将它返回给客户端;
  2. 客户端拿到token值后,保存在本地;
  3. 后续客户端再次发送除登录外的其他请求时,会把保存在本地的token值作为参数一起发送给服务端;
  4. 服务端收到客户端的请求后,会拿发送过来的token值与保存在数据库中的token值进行比较;
  5. 如果两个token值相同, 则说明当前用户处于登录状态;
  6. 如果数据库中没有这个token值或者token值已经生效,则需用户重新登录。


二. token场景处理


公司某管理后台系统,登录后返回token,接着去请求其他接口时请求头中都需要加上这个token,否则提示请先登录。

请求该系统的登录接口如下:

# @author: 给你一页白纸
# 微信公众号:测试上分之路
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文件中。

# @author: 给你一页白纸
# 微信公众号:测试上分之路
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放在请求参数中,视被测试项目具体情况而定),再发送请求。

# @author: 给你一页白纸
# 微信公众号:测试上分之路
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。

# @author: 给你一页白纸
# 微信公众号:测试上分之路
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()


执行测试用例结果如下:

微信图片_20220425205547.png

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


三. 总结


  1. 相对于Session/Cookies来说,请求量较大或者涉及第三方接口的系统,使用token更适合。
  2. 有些项目token是放在请求头中发送的,而有一些项目则是放在请求参数里发送的,做接口自动化时要明确是哪种方式。
  3. 接口自动化处理token时这两种思路可任选一种,如果使用pytest框架的话建议尝试思路二。
相关文章
|
1天前
|
运维 Prometheus 监控
自动化运维的魔法:使用Python脚本简化日常任务
【8月更文挑战第50天】在数字化时代的浪潮中,自动化运维成为提升效率、减少人为错误的利器。本文将通过一个实际案例,展示如何利用Python脚本实现自动化部署和监控,从而让运维工作变得更加轻松和高效。我们将一起探索代码的力量,解锁自动化运维的神秘面纱,让你的工作环境焕然一新。
116 81
|
7天前
|
SQL JavaScript 前端开发
基于Python访问Hive的pytest测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Python、来开发Hive应用的方法,产生的代码如下
26 6
基于Python访问Hive的pytest测试代码实现
|
1天前
|
Java Python
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
【9月更文挑战第18天】在 Python 中,虽无明确的 `interface` 关键字,但可通过约定实现类似功能。接口主要规定了需实现的方法,不提供具体实现。抽象基类(ABC)则通过 `@abstractmethod` 装饰器定义抽象方法,子类必须实现这些方法。使用抽象基类可使继承结构更清晰、规范,并确保子类遵循指定的方法实现。然而,其使用应根据实际需求决定,避免过度设计导致代码复杂。
|
3天前
|
Python
全网最适合入门的面向对象编程教程:Python函数方法与接口-函数与方法的区别和lamda匿名函数
【9月更文挑战第15天】在 Python 中,函数与方法有所区别:函数是独立的代码块,可通过函数名直接调用,不依赖特定类或对象;方法则是与类或对象关联的函数,通常在类内部定义并通过对象调用。Lambda 函数是一种简洁的匿名函数定义方式,常用于简单的操作或作为其他函数的参数。根据需求,可选择使用函数、方法或 lambda 函数来实现代码逻辑。
|
7天前
|
运维 监控 Linux
自动化运维的魔法:如何用Python脚本简化日常任务
【9月更文挑战第13天】在数字化时代的浪潮中,自动化运维如同一股清流,为IT团队带来了效率和灵活性的双重提升。本文将深入探讨如何通过Python脚本实现日常运维任务的自动化,从而释放双手,让重复性工作变得轻松愉快。从环境搭建到实际案例分析,我们将一步步揭开自动化运维的神秘面纱,让你的运维之路更加顺畅。
|
3天前
|
存储 数据挖掘 测试技术
Python接口自动化中操作Excel文件的技术方法
通过上述方法和库,Python接口自动化中的Excel操作变得既简单又高效,有助于提升自动化测试的整体质量和效率。
11 0
|
7天前
|
敏捷开发 测试技术 持续交付
自动化测试之美:如何用Selenium和Python打造高效测试脚本
【9月更文挑战第13天】在软件开发的海洋中,自动化测试是那抹不可或缺的亮色。它不仅提升了测试效率,还保障了产品质量。本文将带你领略使用Selenium和Python构建自动化测试脚本的魅力所在,从环境的搭建到脚本的编写,再到问题的排查,每一步都是对软件质量把控的深刻理解和实践。让我们开始这段探索之旅,解锁自动化测试的秘密吧!
11 0
|
7天前
|
jenkins 测试技术 持续交付
自动化测试的高效之路:如何利用Python进行Web应用测试
【9月更文挑战第13天】在软件开发的快节奏中,自动化测试是确保质量和效率的关键。本文将引导你了解如何使用Python语言及其强大的测试框架来提升Web应用的测试效率。我们将一起探索编写简洁而强大的测试脚本的技巧,以及如何通过持续集成(CI)实现自动化测试流程。准备好让你的测试工作飞一般的感觉!
|
30天前
|
测试技术 索引 Python
Python接口自动化测试框架(练习篇)-- 数据类型及控制流程(一)
本文提供了Python接口自动化测试中的编程练习,包括计算器、猜数字、猜拳和九九乘法表等经典问题,涵盖了数据类型、运算、循环、条件控制等基础知识的综合应用。
30 1
|
30天前
|
IDE 测试技术 开发工具
Python接口自动化测试框架(基础篇)-- 不只是txt的文件操作
本文介绍了Python中的文件操作方法,包括使用open()打开文件、close()关闭文件、read()读取内容、readline()读取单行、readlines()读取多行、write()写入内容以及writelines()写入多行的方法。同时,探讨了文件操作模式和编码问题,并扩展了上下文管理器with...as的使用,以及对图片和音频文件操作的思考和练习。
17 1
Python接口自动化测试框架(基础篇)-- 不只是txt的文件操作