如何对需用户认证的FastAPI端点进行集成测试?
测试FastAPI需登录端点的两种方案
针对你这种基于用户名密码获取Token的认证流程,有两种实用的测试方案:
方案一:真实调用登录接口获取Token(端到端集成测试)
这种方式完全模拟真实用户的操作流程,适合验证完整的认证+业务逻辑。
步骤:
- 提前准备好测试用的用户数据(可以在测试前置步骤中插入到测试数据库,或使用预设的测试账号)
- 调用登录接口(通常是
/token)获取有效Token - 在请求目标端点时,将Token放入
Authorization请求头中,格式为Bearer {token}
代码示例:
from fastapi.testclient import TestClient from main import app client = TestClient(app) def test_get_authenticated_list(): # 1. 获取登录Token login_res = client.post( "/token", data={"username": "test_user", "password": "test_password"} ) assert login_res.status_code == 200 access_token = login_res.json()["access_token"] # 2. 使用Token请求需登录的端点 res = client.get( "/lists/1", headers={"Authorization": f"Bearer {access_token}"} ) assert res.status_code == 200 assert res.json()["id"] == 1
方案二:直接替换认证依赖(快速集成/单元测试)
如果只需要测试端点的业务逻辑,不想走完整的认证流程,可以直接替换get_current_active_user依赖,返回模拟的用户对象。
步骤:
- 定义一个返回模拟用户的函数
- 使用FastAPI的
app.dependency_overrides覆盖原依赖 - 直接请求目标端点,无需携带Token
- 测试完成后清理依赖覆盖,避免影响其他测试
代码示例:
from fastapi.testclient import TestClient from main import app, get_current_active_user from your_module import User # 导入你的User模型 client = TestClient(app) def test_get_list_with_mocked_user(): # 构造模拟用户 mock_user = User(id=1, username="test_user", is_active=True) # 覆盖认证依赖 def mock_get_current_user(): return mock_user app.dependency_overrides[get_current_active_user] = mock_get_current_user # 直接请求端点 res = client.get("/lists/1") assert res.status_code == 200 assert res.json()["id"] == 1 # 清理依赖覆盖 del app.dependency_overrides[get_current_active_user]
方案选择建议
- 若要验证完整的用户流程(包括认证有效性、权限控制),选方案一
- 若仅需测试端点业务逻辑,追求测试速度,选方案二
另外注意你提供的示例代码中有个小笔误:if not llist: 应该是if not list:,建议修正。
内容的提问来源于stack exchange,提问作者rick_grimes
相关产品推荐
相关产品推荐

