0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FastAPIによるHello Worldとドキュメント生成、テストの実行

Last updated at Posted at 2025-01-05

はじめに

みずほリサーチ&テクノロジーズ株式会社の @fujine です。本記事はFastAPI学習コンテンツシリーズの1つとして、

  • "Hello World"を出力する簡単なAPIプログラムの作成
  • Swaggerドキュメントの生成
  • テストコードの実装と実行

までを体験することを目的とします。

0. 仮想環境の作成と有効化

helloという仮想環境を作成して有効化します。

python -m venv hello

cd hello
Scripts\activate

1. FastAPIと関連パッケージのインストール

FastAPIとpytest(テストフレームワーク)をインストールします。

pip install fastapi[standard] pytest

2. "Hello World"を出力するAPIの作成

main.py というファイルを作成し、以下のコードを記述します。

hello/main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}

プログラムの内容を解説します。

  • app = FastAPI()で、FastAPIのインスタンスを作成します。このappオブジェクトが、APIの全てのエンドポイントや設定を管理する中心的な存在となります。appという名前は慣例であり、変更可能です。
  • @app.get("/")デコレータです。ここでは、root関数をGETメソッドのルートパス(/)に紐付けます。つまり、ブラウザでhttp://127.0.0.1:8000/ にアクセスすると、root関数が実行されます。 GET以外にも、@app.post("/")@app.put("/")@app.delete("/") など、他のHTTPメソッドにも対応するデコレータがあります。
  • async def root():root関数を定義しています。asyncキーワードは、この関数が非同期関数であることを示します。非同期関数を使用することで複数のリクエストを効率的に処理でき、特にI/Oバウンドな処理(データベースアクセス、外部API呼び出しなど)で効果を発揮します。

非同期処理に詳しくない場合は、ひとまず「高速化のための機能」と考えておけば問題ありません。単純なAPIであれば、asyncを省略してdef root():と実装しても動作します。

  • return {"message": "Hello World"}でAPIのレスポンスを定義します。辞書を返すと、FastAPIは自動的にJSON形式に変換してクライアントに返送します。

3. プログラムの実行

コマンドプロンプトで以下のコマンドを実行し、Uvicornを起動します。

uvicorn main:app --reload

--reload オプションを付けると、コードの変更が自動的に反映されます。

ブラウザで http://127.0.0.1:8000/ にアクセスすると、{"message": "Hello World"} がJSON形式で表示されます。

image.png

コマンドプロンプトでcurlコマンドを実行する方法でも同じ結果が得られます。

curl http://127.0.0.1:8000
{"message":"Hello World"}

4. Swaggerドキュメントの確認

FastAPIはインタラクティブなSwagger APIドキュメントを自動生成することができます。

Uvicornを起動した状態で、ブラウザで http://127.0.0.1:8000/docsにアクセスします。するとSwagger UIが表示され、APIのエンドポイント / の詳細を確認できます。

image.png

「Try it out」ボタンをクリックして、APIを実際にテストすることも可能です。

image.png

http://127.0.0.1:8000/redocでRedoc形式のドキュメントも確認できます。

image.png

5. 単体テストの作成

プログラムが正しく動作することを確認するために、テストコードを作成します。
test_main.pyというファイルを作成し、以下コードを記述します。

hello/test_main.py
from fastapi.testclient import TestClient

from main import app


client=TestClient(app)

def test_read_main():
    response = client.get("/")
    assert response.status_code == 200
    assert response.json() == {"message": "Hello World"}

プログラムの内容を解説します。

  • from main import appで、作成したFastAPIアプリケーションのappインスタンスをインポートします。
  • client=TestClient(app)では、appを渡してTestClientインスタンスを作成します。これにより、clientオブジェクトを通じてFastAPIアプリケーションとやり取りできるようになります。TestClientは、FastAPIアプリケーションをテストするための特別なクライアントです。
  • def test_read_main():がテスト関数です。関数名をtest_ で始めることで、pytestが自動的にテスト関数を探索して実行できるようになります。

このテスト関数では、client.get("/")でエンドポイントにアクセスし、

  • レスポンスのステータスコードが200(正常終了)であること
  • レスポンスの中身が{"message": "Hello World"}と一致すること

の2点を検証します。

6. テストの実行

以下のコマンドでテストを実行します。

pytest test_main.py

テストが成功すると、以下のような出力が表示されます。test_main.py .と出力された行は、test_main.pyに実装された1件のテスト関数が正常終了したことを意味します。

====================== test session starts ======================
platform win32 -- Python 3.13.0, pytest-8.3.4, pluggy-1.5.0
...
collected 1 item

test_main.py .                                             [100%]

======================= 1 passed in 5.26s =======================

もしテストが失敗した場合、.ではなくFが出力され、期待値と実際の値の違いがコンソールに出力されます。


以上で本記事は終了です。

次回の記事では、HTTPメソッドとパスパラメータの実装について解説いたします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?