在 FastAPI 开发中,特别是对于大型项目,在整个项目中使用单个 FastAPI 应用程序实例和单个 TestClient 实例对于保持一致性、优化性能和确保可靠性至关重要。 让我们研究一下这种最佳实践背后的原因并探索实际示例。
创建多个 FastAPI 应用实例可能会导致不一致。每个实例都拥有自己的内部状态、中间件配置和依赖关系管理。 跨多个实例共享有状态数据(例如内存存储或数据库连接)可能会导致不可预测的行为和错误。
每个 TestClient 实例建立自己的 HTTP 连接并初始化依赖项。使用单个 TestClient 可最大限度地减少开销,从而加快测试执行速度。
FastAPI 应用程序经常在启动期间初始化资源,包括数据库连接或后台任务。 多个实例可能会导致冗余初始化或资源冲突。
<code class="language-python">from fastapi import FastAPI, Depends from fastapi.testclient import TestClient # Single FastAPI app instance app = FastAPI() # Simple in-memory database database = {"items": []} # Dependency function def get_database(): return database @app.post("/items/") def create_item(item: str, db: dict = Depends(get_database)): db["items"].append(item) return {"message": f"Item '{item}' added."} @app.get("/items/") def list_items(db: dict = Depends(get_database)): return {"items": db["items"]} # Single TestClient instance client = TestClient(app) # Test functions def test_create_item(): response = client.post("/items/", json={"item": "foo"}) assert response.status_code == 200 assert response.json() == {"message": "Item 'foo' added."} def test_list_items(): response = client.get("/items/") assert response.status_code == 200 assert response.json() == {"items": ["foo"]}</code>
<code class="language-python"># Incorrect: Multiple app instances app1 = FastAPI() app2 = FastAPI() # Incorrect: Multiple TestClient instances client1 = TestClient(app1) client2 = TestClient(app2) # Problem: State changes in client1 won't affect client2</code>
在单独的文件(例如 app.py
)中创建 FastAPI 应用程序并在需要时导入。
<code class="language-python"># app.py from fastapi import FastAPI app = FastAPI() # Add your routes here</code>
<code class="language-python"># main.py from fastapi.testclient import TestClient from app import app client = TestClient(app)</code>
pytest 装置有效管理共享资源,例如 TestClient:
<code class="language-python">import pytest from fastapi.testclient import TestClient from app import app @pytest.fixture(scope="module") def test_client(): client = TestClient(app) yield client # Ensures proper cleanup</code>
<code class="language-python">def test_example(test_client): response = test_client.get("/items/") assert response.status_code == 200</code>
通过遵守这些准则,您的 FastAPI 项目将更加一致、高效且更易于维护。
肖恩·杜塔拍摄:https://www.php.cn/link/e2d083a5fd066b082d93042169313e21
以上是为什么应该使用单个 FastAPI 应用程序和 TestClient 实例的详细内容。更多信息请关注PHP中文网其他相关文章!