はじめに
みずほリサーチ&テクノロジーズ株式会社の @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
というファイルを作成し、以下のコードを記述します。
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形式で表示されます。
コマンドプロンプトで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のエンドポイント /
の詳細を確認できます。
「Try it out」ボタンをクリックして、APIを実際にテストすることも可能です。
http://127.0.0.1:8000/redoc
でRedoc形式のドキュメントも確認できます。
5. 単体テストの作成
プログラムが正しく動作することを確認するために、テストコードを作成します。
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メソッドとパスパラメータの実装について解説いたします。