如何在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")
核心逻辑说明
- inject_auth_to_class:这个fixture会把
auth实例绑定到测试类上,让setup_class()能直接调用登录方法。 - setup_class():作为类级别的初始化方法,仅执行一次登录操作,将生成的JWT Token封装成请求头,存储在类变量
_auth_headers中。 - 测试方法复用:所有测试方法通过
self._auth_headers访问预先生成的鉴权头,无需重复登录。
内容的提问来源于stack exchange,提问作者Leo El
相关产品推荐
相关产品推荐

