Bei der FastAPI-Entwicklung, insbesondere bei größeren Projekten, ist die Verwendung einer einzelnen FastAPI-Anwendungsinstanz und einer einzelnen TestClient-Instanz im gesamten Projekt von entscheidender Bedeutung, um die Konsistenz aufrechtzuerhalten, die Leistung zu optimieren und die Zuverlässigkeit sicherzustellen. Lassen Sie uns die Gründe für diese Best Practice untersuchen und praktische Beispiele untersuchen.
Das Erstellen mehrerer FastAPI-App-Instanzen kann zu Inkonsistenzen führen. Jede Instanz verfügt über einen eigenen internen Status, eine eigene Middleware-Konfiguration und ein eigenes Abhängigkeitsmanagement. Die gemeinsame Nutzung zustandsbehafteter Daten wie In-Memory-Speicher oder Datenbankverbindungen über mehrere Instanzen hinweg kann zu unvorhersehbarem Verhalten und Fehlern führen.
Jede TestClient-Instanz stellt eine eigene HTTP-Verbindung her und initialisiert Abhängigkeiten. Durch die Verwendung eines einzelnen TestClients wird der Overhead minimiert, was zu einer schnelleren Testausführung führt.
FastAPI-Anwendungen initialisieren beim Start häufig Ressourcen, einschließlich Datenbankverbindungen oder Hintergrundaufgaben. Mehrere Instanzen können zu redundanten Initialisierungen oder Ressourcenkonflikten führen.
<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>
Erstellen Sie Ihre FastAPI-App in einer separaten Datei (z. B. app.py
) und importieren Sie sie bei Bedarf.
<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-Fixtures verwalten gemeinsam genutzte Ressourcen wie den TestClient effektiv:
<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>
Durch die Einhaltung dieser Richtlinien wird Ihr FastAPI-Projekt konsistenter, effizienter und einfacher zu warten.
Foto von Shawon Dutta: https://www.php.cn/link/e2d083a5fd066b082d93042169313e21
Das obige ist der detaillierte Inhalt vonWarum Sie eine einzige FastAPI-App und TestClient-Instanz verwenden sollten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!