ホームページ >バックエンド開発 >Python チュートリアル >単一の FastAPI アプリと TestClient インスタンスを使用する必要がある理由

単一の FastAPI アプリと TestClient インスタンスを使用する必要がある理由

Barbara Streisand
Barbara Streisandオリジナル
2025-01-18 22:15:09555ブラウズ

Why You Should Use a Single FastAPI App and TestClient Instance

FastAPI 開発では、特に大規模なプロジェクトの場合、プロジェクト全体で単一の FastAPI アプリケーション インスタンスと単一の TestClient インスタンスを採用することが、一貫性を維持し、パフォーマンスを最適化し、信頼性を確保するために重要です。 このベスト プラクティスの背後にある理由を調べ、実際の例を見てみましょう。

1.アプリケーション全体の一貫性

複数の FastAPI アプリ インスタンスを作成すると、不整合が生じる可能性があります。各インスタンスは、独自の内部状態、ミドルウェア構成、依存関係管理を持っています。 インメモリ ストレージやデータベース接続などのステートフル データを複数のインスタンス間で共有すると、予期しない動作やエラーが発生する可能性があります。

2.強化されたパフォーマンス

各 TestClient インスタンスは独自の HTTP 接続を確立し、依存関係を初期化します。単一の TestClient を使用するとオーバーヘッドが最小限に抑えられ、テストの実行が高速化されます。

3.初期化の問題の防止

FastAPI アプリケーションは、起動時にデータベース接続やバックグラウンド タスクなどのリソースを初期化することがよくあります。 複数のインスタンスにより、冗長な初期化やリソースの競合が発生する可能性があります。

実践的なコード例

正しいアプローチ: 単一のアプリと TestClient

<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>

複数のインスタンスに関する一般的な問題

  1. 一貫性のない状態: 共有状態 (データベースなど) は、異なるアプリ インスタンス間で独立して動作します。
  2. 冗長な依存関係の初期化: データベース接続などの依存関係は複数回初期化される可能性があり、リソースの枯渇につながる可能性があります。
  3. 重複する起動/シャットダウン イベント: 複数のアプリ インスタンスが起動イベントとシャットダウン イベントを個別にトリガーし、不要な動作や競合する動作を引き起こします。

ベストプラクティス

再利用可能なプロジェクト構造

別のファイル (例: 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 フィクスチャの活用

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 を使用したテスト
  • pytest フィクスチャ

これらのガイドラインに従うことで、FastAPI プロジェクトの一貫性、効率性が向上し、保守が容易になります。


Shawon Dutta による写真: https://www.php.cn/link/e2d083a5fd066b082d93042169313e21

以上が単一の FastAPI アプリと TestClient インスタンスを使用する必要がある理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。