単体テストサンプル
FastAPIのテストのためのモジュールTestClientを使って、テストの対象となるFastAPIモジュールに対してテスト用のクライアントを生成します。test_
で始まる関数は自動的にテストケースとして認識されるので関数名をtest_sampleにします。サンプルコードは下のようになります。
api/tests/test_sample.py
from app import app
from fastapi.testclient import TestClient
client = TestClient(app)
def test_sample():
response = client.post(
"/api/test-sample",
json={
[
"test":"requset-sample"
]
},
)
assert response.status_code == 200
assert response.json() == {
[
"test":"respons-sample"
]
}
まずはローカルで動作確認するためにpytestをインストールして、テストを実行します。
➜ pytest
========================================= test session starts =========================================
platform darwin -- Python 3.12.0, pytest-8.2.2, pluggy-1.5.0
rootdir: *****
configfile: pyproject.toml
plugins: anyio-4.3.0
collected 1 item
tests/test_get_city_code.py . [100%]
========================================== 1 passed in 2.49s ==========================================
必要なPythonパッケージ
pytestを含めたpyproject.toml(パッケージ管理はryeを利用している)
[project]
name = "test-sample-api"
version = "0.1.0"
description = "FastAPIテストのサンプルコードです。"
authors = [
{ name = "kyoku", email = "kyoku@mierune.co.jp" }
]
dependencies = [
"fastapi>=0.111.0",
# ....(中略)
"pytest>=8.2.2",
]
readme = "README.md"
requires-python = ">= 3.12"
[tool.rye]
managed = true
virtual = true
dev-dependencies = []
GitHub Actionsワークフローを作成
GitHub Actionsのワークフローを定義し、Pull Requestをオープンしたタイミングで作成したテストコードを走らせます。
.github/workflows/api-test.yml
name: Test API
on: pull_request
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
lfs: true
- uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: "pip"
- name: Install dependencies
run: pip install -r requirements.lock
working-directory: api
- name: Run tests
run: pytest
working-directory: api
- actions/checkout@v4:Workflowがリポジトリにアクセスする
- actions/setup-python@v5:Pythonの実行環境をインストールする。cacheを指定することによってpip dependenciesのキャッシュを利用してテストを高速化する。
- おまけ:actというツールを利用して、GitHubにアップロードする前にローカルでWorkflowの動作を確認することもできます。M2 Macでテストしたところ
actions/setup-python@v5
がインストールできず、Apple Siliconとの相性がよくないですが、本番のLinuxでは正常に動作します。