You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在pytest测试类中用setup_class复用JWT Token?

实现方案:用setup_class()单次登录复用JWT Token

步骤1:调整conftest.py中的fixture作用域

为了让auth和client能在类级别复用(和setup_class()生命周期对齐),修改它们的作用域为class:

@pytest.fixture(scope="class")
def app():
    app = create_app({
        'TESTING': True,
    })
    yield app
   
    with app.app_context():
        db.drop_all()

@pytest.fixture(scope="class")
def client(app):
    return app.test_client()

@pytest.fixture(scope="class")
def auth(client):
    return AuthActions(client)

# 添加一个辅助fixture,将auth实例注入到测试类
@pytest.fixture(scope="class")
def inject_auth_to_class(auth, request):
    request.cls.auth = auth

步骤2:修改TestSecured测试类

移除原有的setup_user_and_token fixture依赖,改用setup_class()完成单次登录并存储Token:

@pytest.mark.usefixtures("inject_auth_to_class")
class TestSecured:
    # 类级别变量存储鉴权头
    _auth_headers = None

    @classmethod
    def setup_class(cls):
        # 仅执行一次登录
        response = cls.auth.login(username='test_user', password='test_pass')
        token = response.get_json()['access_token']
        cls._auth_headers = {'Authorization': f'Bearer {token}'}

    def test_get_operations(self, client):
        # 复用类级别存储的鉴权头
        response = client.get(f'{SECURED_ROUTE}get-operations', headers=self._auth_headers)
        assert response.status_code == 200

    def test_post_operation(self, client):
        # 同样使用鉴权头访问受保护接口
        response = client.post(f'{SECURED_ROUTE}post-operation', headers=self._auth_headers, json={"data": "test"})
        assert response.status_code == 200

    def test_post_ope2(self, client):
        # 按需使用鉴权头
        print("ok")

核心逻辑说明

  1. inject_auth_to_class:这个fixture会把auth实例绑定到测试类上,让setup_class()能直接调用登录方法。
  2. setup_class():作为类级别的初始化方法,仅执行一次登录操作,将生成的JWT Token封装成请求头,存储在类变量_auth_headers中。
  3. 测试方法复用:所有测试方法通过self._auth_headers访问预先生成的鉴权头,无需重复登录。

内容的提问来源于stack exchange,提问作者Leo El

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 13:35:00