• pytest + yaml 框架 - 3.全局仅登录一次,在用例中自动在请求头部添加Authentication token认证


    前言

    我们在使用自动化测试框架的时候,经常会遇到一个需求,希望在全局用例中,仅登录一次,后续所有的用例自动带上请求头部token 或者cookies。

    环境准备

    Python 3.8版本
    Pytest 7.2.0 最新版

    pip 安装插件

    pip install pytest-yaml-yoyo
    
    • 1

    需使用v1.0.2 版本

    登录fixture 功能

    我在pytest + yaml 框架框架中封装了一个内置fixture叫requests_session, 它的作用范围是scope="session",也就是全部session用例会话中仅实例化一次。
    现在我只需在conftest 中写一个登录的fixture功能,获取token后添加到requests_session头部

    import pytest
    import uuid
    """
    全局仅登录一次,获取token,
    在请求头部添加Authentication Bearer 认证
    内置fixture requests_session
    """
    
    
    def login():
        """登录方法"""
        # 调用登录方法,返回token
        return str(uuid.uuid4())  # noqa
    
    
    @pytest.fixture(scope="session", autouse=True)
    def login_first(requests_session):
        """全局仅一次登录, 更新session请求头部"""
        # 调用登录方法,获得token
        token = login()
        headers = {
            "Authentication": f"Bearer {token}"
        }
        requests_session.headers.update(headers)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    上面代码中,我用login() 函数实现登录功能,这里返回一个随机值,主要是为了验证我只调用了一次登录方法
    接着我写2个yaml文件(注意,yaml文件中也不需要重复去添加请求头部了
    test_get_demo.yml

    config:
      name: get
    
    teststeps:
    -
      name: get
      request:
        method: GET
        url: http://httpbin.org/get
      validate:
        - eq: [status_code, 200]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    test_post_demo.yml

    config:
      name: post示例
      variables:
        username: test
        password: "123456"
    
    teststeps:
    -
      name: post
      request:
        method: POST
        url: http://httpbin.org/post
        json:
          username: ${username}
          password: ${password}
      validate:
        - eq: [status_code, 200]
        - eq: [headers.Server, gunicorn/19.9.0]
        - eq: [$..username, test]
        - eq: [body.json.username, test]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    运行用例

    在命令行中输入pytest运行
    抓包看发过去的请求

    于是可以看到,在2个用例中都自动带上了请求头部参数。
    (登录cookies的使用原理也是一样的,登录后cookies一般会自动保持)

    其它需求

    那有些接口不需要登录怎么办呢?比如登录和注册的接口,是不需要带上登录token的,那不能一刀切。
    我除了默认用到一个requests_session 全局的内置fixture,还预留了2个

    • requests_module: 每个yaml文件中用一次
    • requests_function: 每个用例中用一次

    在yaml文件中切换到指定fixture功能,requests_modulerequests_function 后续会实现,先实现大需求,解决大部分人遇到的痛点问题!

  • 相关阅读:
    Apache Ranger安装部署
    英语复习-10.22
    腐败游之川藏线
    socket,tcp,http三者之间的原理和区别
    JAVA基础12:字符串(上)
    酒店客房管理系统|基于Springboot的酒店客房管理系统设计与实现(源码+数据库+文档)
    Tomcat过时了?别多想,很多公司还是在用的。这份Tomcat架构详解,真的颠覆你的认知
    dva.js打包 hash文件名
    无涯教程-JavaScript - BIN2HEX函数
    mmlab花朵分类结果展示(2)
  • 原文地址:https://blog.csdn.net/qq_27371025/article/details/128125913