FastAPI를 사용한 스타트업 프로젝트

목차


  • Overview
  • Pet project
  • Local Run
  • Scope
  • Testing
  • Considerations
  • References

  • 개요



    "startup project with..."시리즈의 경우 파이썬 웹 개발에 접근할 예정이며 FastAPI web framework 을 사용해 보았습니다. 사용이 간편해서 매우 놀랐고 자세히 알아보고 싶었습니다. 무엇보다도 테스트 기능입니다.

    애완동물 프로젝트



    기능을 테스트하기 위해 이것을 구현했습니다pet project. 기본적으로 하나의 나머지 API가 있는 간단한 서버입니다.

    로컬 실행



    코드를 체크아웃한 후 터미널 애플리케이션에서 "script/ci"를 간단히 실행할 수 있습니다. 스크립트는 다음 단계를 실행합니다.
  • Docker 컨테이너에 Python 앱 빌드
  • 코드 검사(미사용 코드 등)
  • 테스트 실행

  • 로컬 호스트 컨테이너에서 API를 사용하려면 다음 명령을 실행하면 됩니다.

    docker-compose up api  
    curl http://localhost:8080/items/123\?q\="test"
    


    두 번째는 다음 응답을 제공해야 합니다.

    {"item_id":123,"q":"test","use_case":"Production Code"}
    


    범위



    코드 디자인과 관련하여 저는 두 가지 사항을 달성하고 싶었습니다.
  • 컨트롤러 API를 클래스에 캡슐화합니다
  • .
  • API를 쉽게 테스트하기 위해 협력자를 주입합니다
  • .

    포인트 1)에 관해서는 다음이 있습니다.

    class AppController:
        def __init__(self, app: FastAPI, use_case: UseCase):
            @app.get("/items/{item_id}")
            def read_item(item_id: int, q: Optional[str] = None):
                return {
                    "item_id": item_id, "q": q, "use_case": use_case.run()
    


    AppController 클래스는 FastAPI 및 UseCase 객체로 빌드할 수 있습니다.
    첫 번째는 FastAPI 구성과 관련된 것이고 두 번째는 내 비즈니스 로직입니다.

    이 클래스가 있으면 앱에 필요한 코드를 연결하는 startup() 메서드를 사용하여 내 애플리케이션을 구성할 수 있습니다.

    def startup(use_case: UseCase = ProductionUseCase()):
        app = FastAPI()
        AppController(app, use_case)
        return app
    


    마지막으로 도커 컨테이너를 사용하여 애플리케이션을 실행할 수 있습니다. 다음은 컨테이너 정의입니다.

    FROM python:3.10.3-slim-bullseye
    
    WORKDIR /code
    COPY ./requirements.txt /code/requirements.txt
    
    RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
    COPY ./app /code/app
    CMD ["uvicorn", "app.main:startup", "--host", "0.0.0.0", "--port", "8080", "--workers", "4"]
    


    테스트



    물론 응용 프로그램을 쉽게 테스트하기 위해 종속성을 주입하는 데 startup() 메서드를 사용할 수도 있습니다.
    다음은 컨트롤러에 대한 두 가지 테스트입니다.

     def test_e2e_production_code(self):
            client = TestClient(startup())
            response = client.get("/items/987?q=this%20is%20the%20query")
            self.assertEqual(200, response.status_code)
            self.assertEqual(
                {"item_id": 987, "q": "this is the query", "use_case": "Production Code"},
                response.json()
            )
    
    class TestableUseCase(UseCase):
        def run(self):
            return "Test Code"
    
     def test_e2e_testable_code(self):
            client = TestClient(startup(TestableUseCase()))
            response = client.get("/items/987?q=this%20is%20the%20query")
            self.assertEqual(200, response.status_code)
            self.assertEqual(
                {"item_id": 987, "q": "this is the query", "use_case": "Test Code"},
                response.json()
            )
    


    첫 번째 테스트는 프로덕션 코드 종속성을 사용하여 프로덕션 사용 사례로 클라이언트를 빌드합니다.

    client = TestClient(startup())
    


    때로는 개발 중에 실제 연결을 사용할 수 없거나 스텁된 협력자를 사용하여 테스트(단위, 통합 ...)를 분해하려고 합니다.
    이러한 이유로 두 번째 테스트(test_e2e_testable_code)와 같이 TestableCollaborator를 주입할 수 있습니다.

    client = TestClient(startup(TestableUseCase()))
    


    고려 사항



    설계 관점에서 FastAPI는 마이크로서비스를 구축하는 데 사용할 수 있는 매우 유용한 프레임워크입니다. 컨테이너 논리 및 클라우드 개발에 매우 ​​적합합니다. 우리가 개발할 애플리케이션을 위한 테스트 스위트를 구축하는 것도 매우 쉽습니다.
    물론 종속성 또는 DBMS 액세스와 같이 제공하는 일부 기능으로 인해 복잡성이 발생하지 않도록 주의해야 합니다.

    참조



    Github project link

    좋은 웹페이지 즐겨찾기