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>
FastAPI 앱을 별도의 파일(예: app.py
)로 생성하고 필요한 곳에 가져옵니다.
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!