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 プロジェクトの一貫性、効率性が向上し、保守が容易になります。
Shawon Dutta による写真: https://www.php.cn/link/e2d083a5fd066b082d93042169313e21
以上が単一の FastAPI アプリと TestClient インスタンスを使用する必要がある理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。