スタートアッププロジェクト


目次

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


    シリーズ「スタートアッププロジェクト」私はPythonウェブ開発にアプローチして、使用しようとしましたFastAPI web framework . 私は、それが使用の容易であることに非常に驚きました、そして、私はそれについてより深く入りたかったです;上記のすべての機能をテストしている.

    ペットプロジェクト


    機能をテストするためにpet project . 基本的に1つのREST APIを持つ単純なサーバです.

    ローカルラン


    コードをチェックアウトした後に、単にあなたのターミナルアプリケーションで「スクリプト/ci」を実行することができます.スクリプトはこれらの手順を実行します.
  • DockerコンテナでビルドPythonアプリ
  • コードチェック(未使用のコードのように)
  • テスト実行
  • ローカルホストコンテナでAPIを試したければ、以下のコマンドを実行してください.
    docker-compose up api  
    curl http://localhost:8080/items/123\?q\="test"
    
    2番目はこのレスポンスを提供します.
    {"item_id":123,"q":"test","use_case":"Production Code"}
    

    スコープ


    コード設計については、2点を達成したかっただけです.
  • クラスにコントローラ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オブジェクトで構築できます.
    最初の1つはFastAPIの設定に関連しているし、2番目の1つを実行する私のビジネスロジックです.
    このクラスを使用すると、アプリケーションに必要なコードを配線するstartup ()メソッドを使用してアプリケーションを設定できます.
    def startup(use_case: UseCase = ProductionUseCase()):
        app = FastAPI()
        AppController(app, use_case)
        return app
    
    最後に、Dockerコンテナを使用してアプリケーションを実行できます.これはコンテナ定義です:
    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 ()メソッドを使うこともできます.
    これらはコントローラの2つのテストです.
     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())
    
    場合によっては、開発中に実際の接続を使用することはできませんし、テストを分解するだけです.頑固な協力者の使用
    このため、2つ目のテスト( TestCount E 2 eCurn TabableLesコード)のようなtestableCollapatorを注入できます.
    client = TestClient(startup(TestableUseCase()))
    

    考慮


    Finapiのデザインポイントから、我々のマイクロサービスを構築するのに使用する超便利なフレームワークです.非常によくコンテナーロジックと雲の開発とフィットします.また、我々が開発しようとしているアプリケーションのテストスイートを構築することは非常に簡単です.
    もちろん、依存関係やDBMSアクセスのような機能を備えた複雑さを導入しないよう注意しなければなりません.

    参考文献


    Github project link