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