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

如何让FastAPI TestClient启动lifespan生命周期?

解决FastAPI TestClient未启动lifespan的问题

要让TestClient触发FastAPI的lifespan生命周期,核心是利用TestClient的上下文管理器特性——只有通过with语句初始化TestClient,才会执行lifespan的startup和shutdown逻辑。以下是具体实现方式:

1. 直接在测试中使用with语句

from fastapi.testclient import TestClient
from your_app import app

def test_global_rw_state():
    # 用with包裹TestClient,自动触发lifespan
    with TestClient(app) as client:
        # 此时app.state已被lifespan初始化并运行
        resp = client.get("/get_global_rw")
        # 根据你的lifespan逻辑断言预期值,比如初始值或递增后的值
        assert resp.json()["value"] == 1

2. 结合pytest Fixture复用上下文

如果多个测试都需要用到带lifespan的客户端,可以封装成fixture避免重复代码:

import pytest
from fastapi.testclient import TestClient
from your_app import app

@pytest.fixture(scope="function")
def client():
    # 在fixture中启动上下文,每个测试用例都会触发一次lifespan
    with TestClient(app) as c:
        yield c

def test_initial_state(client):
    resp = client.get("/get_global_rw")
    assert resp.json()["value"] == 1

def test_after_increment(client):
    # 若lifespan包含定时递增任务,需等待足够时间让任务执行
    import time
    time.sleep(11)
    resp = client.get("/get_global_rw")
    assert resp.json()["value"] == 2

注意事项

  • 若lifespan包含异步定时任务(比如asyncio.create_task启动的逻辑),测试时要注意任务执行时机——测试运行速度快,可能需要手动等待或直接调用任务函数模拟递增,避免依赖真实定时等待。
  • 不要直接用client = TestClient(app)初始化,这种写法不会触发lifespan的上下文逻辑,自然无法获取预期状态值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:43:10