python-testing-strategies について
FastAPI形式のエンドポイントをテストする開発者向けに、非同期 Python テストの作成と実行方法をまとめたリファレンスです。非同期設定、エンドポイントの網羅性、テスト間の分離を重視しています。
主な機能
- 01pytest の非同期設定
- 02httpx AsyncClient と ASGITransport の使用
- 03エンドポイント網羅性チェックリスト
- 04テストデータファクトリーの指針
- 05非同期テストのよくある落とし穴
活用シーン
- 01API エンドポイントの非同期テスト設定
- 02成功時とエラー時の動作確認
- 03テスト間のデータベース状態漏れの防止
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ c0x12c/ ai-toolkit --skill python-testing-strategiesインストール後、Claude Code で/python-testing-strategiesを入力して読み込まれたか確認します。
同梱ファイルexamples.md
詳細
Python テスト戦略 — クイックリファレンス
セットアップ(重要)
pyproject.toml で asyncio_mode = "auto" を設定すると、マーカーなしで非同期テストを自動検出できます。(テストに @pytest.mark.asyncio を付ける場合は、デフォルトの「strict」モードでも動作します。)
conftest.py と pyproject.toml の完全なセットアップについては、examples.md を参照してください。
テストクライアント
httpx.AsyncClient と ASGITransport を使用してください。非同期テストで TestClient は使用しないでください。
クライアントフィクスチャのセットアップについては、examples.md を参照してください。
エンドポイントごとに必要なカバレッジ
- 正常系(作成、読み取り、更新、削除)
- 見つからない場合(404)
- バリデーションエラー(422)
- 認証失敗(401)— 保護されている場合
- 論理削除 — 削除済みレコードが返されないこと
テストの命名
async def test_create_item(): # Happy path
async def test_create_item_missing_name(): # Validation
async def test_get_item_not_found(): # 404
async def test_get_item_soft_deleted(): # Soft delete
テストデータファクトリー
妥当なデフォルト値を持つシンプルなファクトリー関数を使用してください。テストで必要なものだけを上書きします。
ファクトリーのパターンについては、examples.md を参照してください。
テストの実行
pytest # All tests
pytest tests/test_items.py # One file
pytest -k "test_create" # By name pattern
pytest --tb=short -q # Quiet output
注意点
-
asyncio_mode = "auto"がないと、すべてが気付かないうちに動作しなくなります。 テストは成功したように見える(収集数が 0)か、無期限にハングします。非同期テストを書く前に、pyproject.tomlに[tool.pytest.ini_options] asyncio_mode = "auto"を追加してください。これは「テストが実行されない」という問題の最大の原因です。 -
TestClientとAsyncClientは互換性がありません。TestClient(Starlette 製)は同期型で、処理をブロックします。AsyncClient(httpx 製)は非同期型で、イベントループを使用します。アプリでasync defのルートとawaitを使用する場合は、ASGITransportと組み合わせてAsyncClientを使用する必要があります。TestClientを使うと同期的に実行されるため、非同期処理のバグが見えなくなることがあります。 -
適切にクリーンアップしないと、データベースの状態がテスト間で漏れます。 各テストにはクリーンなデータベースが必要です。テーブルを作成・削除する
autouse=Trueのフィクスチャを使用するか、テスト間でテーブルを空にしてください。これを行わないと、テストの実行順に依存するようになり、CI でランダムな失敗が発生します。 -
response.json()は、FastAPI のデフォルトではスネークケースを返します。 Pydantic モデルでalias_generatorを使用している場合、JSON のキーは Python のフィールド名と異なることがあります。Python の属性名ではなく、実際の JSON のキーを必ず検証してください。 -
非同期テストで
awaitを忘れると、分かりにくいエラーが発生します。 テスト出力に実際のデータではなく<coroutine object ...>が表示される場合は、awaitを忘れています。client.get()、client.post()などはすべてawaitする必要があります。