pytest 多环境配置 + 全局自动登录 +Token 自动注入 笔记

6 阅读1分钟

1,环境配置

class Env:
    ENV="test" #test / uat / prod
    # 环境配置
    URLS = {
        "test": "https://httpbin.org",
        "uat": "https://uat.httpbin.org",
        "prod": "https://prod.httpbin.org"
    }
    @classmethod
    def base_url(cls):
        return cls.URLS.get(cls.ENV)

2,单例模式创建全局session

import requests
from auto_test.Common.Env import Env

class BaseSession:
    # 定义私有变量,保存
    _instance = None
    _session= None

    # 单例核心,__new__控制只创建一次  __new__为构造方法,每次调用类会自动执行
    def __new__(cls, *args, **kwargs):
        # 判断不存在就创建,保证只创建一次
        if cls._instance is None:
            # 这里的super是调用BaseSession类的父类object中的__new__方法,真正创建对象的方法
            cls._instance = super(BaseSession, cls).__new__(cls)
            cls._init_session() #通过类调用

    # 3. 初始化全局唯一 session    必须加@classmethod表明是类方法,这样才能通过类调用
    @classmethod
    def _init_session(cls):
        # 全局只有这一个 session
        cls._session = requests.Session()
        # 统一请求头
        cls._session.headers = {
            "Content-Type": "application/json",
            "User-Agent": "Expert-Framework-V1"
        }

    # 自动拼接环境域名
    def full_url(self, path):
        return Env.base_url() + path

3,全局登录 fixture token自动注入

@pytest.fixture(scope="session", autouse=True)
def global_login():
    # 1. 创建单例 session
    session = BaseSession()

    # 2. 模拟登录(真实项目替换成登录接口)
    print("✅ 全局登录成功")
    token = "MY_GLOBAL_TOKEN_2026"

    # 3. 全局注入Token(所有接口自动带)
    session.set_token(token)

    yield
    print("🔚 测试结束,清理登录")

4,用例执行

def test_user_info():
    # 不用写域名、不用写token、不用登录!
    res = session.get(session.full_url("/get"))
    assert res.status_code == 200
    print("✅ 接口调用成功,自动带Token!")

def test_order():
    res = session.get(session.full_url("/get?id=123"))
    assert res.status_code == 200