0%

FastAPI自学教程(70) - 依赖项测试机制

1.基础用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from fastapi import Depends, FastAPI
from fastapi.testclient import TestClient

app = FastAPI()

async def common_params(q: str = None, skip: int = 0, limit: int = 100):
return {"q": q, "skip": skip, "limit": limit}

@app.get("/items/")
async def read_items(params: dict = Depends(common_params)):
return {"message": "Hello Items!", "params": params}

client = TestClient(app)

# 覆盖依赖项
async def override_dependency(q: str = None):
return {"q": q, "skip": 5, "limit": 10}

app.dependency_overrides[common_params] = override_dependency

def test_override():
response = client.get("/items/")
assert response.json() == {
"message": "Hello Items!",
"params": {"q": None, "skip": 5, "limit": 10}
}
  • 通过dependency_overrides字典动态替换依赖项实现
  • 测试流程:
    graph TD
      A[初始化TestClient] --> B[覆盖依赖项]
      B --> C[发送模拟请求]
      C --> D[验证响应参数]
      D --> E[对比覆盖后的参数]

2.进阶配置

2.1 多依赖项覆盖

1
2
3
4
5
# 覆盖多个依赖项
app.dependency_overrides.update({
common_params: override_dependency,
database_conn: test_db_connection
})
  • 使用update()方法批量覆盖多个依赖项
  • 适用场景:同时测试业务逻辑和数据库交互

2.2 子依赖项测试

1
2
3
4
5
6
7
8
async def sub_dependency():
return {"sub_key": "value"}

async def main_dependency(sub: dict = Depends(sub_dependency)):
return {"main_key": sub["sub_key"]}

# 测试时覆盖子依赖
app.dependency_overrides[sub_dependency] = lambda: {"sub_key": "test"}
  • 支持覆盖依赖链中的任意层级
  • 可实现精准的单元测试隔离

3.生产环境建议

  1. 数据库测试

    1
    2
    3
    4
    def override_db():
    test_engine = create_engine("sqlite:///./test.db")
    return Session(test_engine)
    app.dependency_overrides[get_db] = override_db

    使用内存数据库或专用测试数据库

  2. 认证模拟

    1
    2
    3
    def bypass_auth():
    return User(id=1, is_admin=False)
    app.dependency_overrides[get_current_user] = bypass_auth

    绕过OAuth2等复杂认证流程

  3. 错误处理

    1
    2
    3
    def force_error():
    raise HTTPException(500)
    app.dependency_overrides[safe_dependency] = force_error

    测试异常处理逻辑的健壮性

  4. 性能监控

    • 使用pytest-benchmark测量依赖项执行时间
    • 建议单个依赖项执行时间<50ms

测试命令示例:

1
2
3
4
5
# 运行所有测试
pytest test_dependencies.py -v

# 生成测试覆盖率报告
pytest --cov=app --cov-report=html