在 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中文網其他相關文章!