Python APIテスト完全ガイド|pytest×requestsでCRUDテストからHTMLレポート・CSV出力まで

テスト自動化

PythonでAPIテストを始めたいエンジニアへ。pytest・requestsを使ったCRUD操作のAPIテストから、HTMLレポート・CSV出力まで、このシリーズ1本で全部学べます。

この記事では、APIテスト完全シリーズの全記事をまとめて紹介します。初心者から実務エンジニアまで、ステップバイステップで学べる構成です。

結論

PythonでAPIテストを自動化するなら pytest + requests の組み合わせが最もシンプルで実務でも使われています。

このシリーズでは以下を全7記事で体系的に学べる構成にしています。

  • APIテストの基礎知識
  • CRUD操作(GET・POST・PUT/PATCH・DELETE)の実装
  • ヘッダー・スキーマ検証などの実務パターン
  • HTMLレポート(pytest-html)による結果の可視化
  • CSVエビデンスによるテスト結果の記録と共有

📌 この記事はこんな方におすすめ

  • PythonでAPIテストを一から学びたい方
  • pytest・requestsの使い方をまとめて確認したい方
  • CRUD全操作のAPIテストをポートフォリオに追加したい方
  • UIテストだけでなくAPIテストもできるエンジニアになりたい方

このシリーズで学べること

  • APIテストとは何か・なぜ重要かの基礎知識
  • pytest・requestsによるGET・POST・PUT/PATCH・DELETEの全テスト実装
  • raise_for_status()・ヘッダー検証・スキーマ検証など実務パターン
  • HTMLレポート・CSV出力によるテスト結果の可視化と共有

👨‍💻 筆者について

QAエンジニアとして実務でPython・pytest・requestsを使ったAPIテスト自動化を担当。本シリーズで使用するコードはすべてGitHubで公開しており、実際に動作確認済みのコードをそのまま解説しています。GitHubでコードを見る →


00. このAPIテストシリーズについて

このシリーズは、PythonでAPIテストをゼロから学ぶための全7回の記事です。環境構築から始めて、GETテストから順にCRUD全操作を実装し、最終的にHTMLレポートとCSVでテスト結果を管理する方法まで学べます。

記事タイトル内容
APIテストとは?概念・UIテストとの違い・基本パターン
環境構築pip install・venv・pytest.ini設定
GETテストステータス・レスポンス・スキーマ検証
POSTテストデータ作成・ID付与・バリデーション検証
PUT/PATCHテスト全体更新・部分更新の違いと実装
DELETEテスト削除・削除後の404確認
CSV・レポート化pytest-html・CSV出力・エビデンス管理

💡 ポイント:各記事は独立して読めますが、①→②→③の順に読むと体系的に学べます。特定のHTTPメソッドだけ知りたい場合は直接その記事に飛んでください。


01. APIテストシリーズ 記事一覧

各記事は独立して読めますが、①→②→③の順に読むと体系的に学べます。

📘
① APIテストとは?入門編

APIテストの基本概念・UIテストとの違い・requestsとpytestの基本パターン

→ 記事を読む

🛠️
② 環境構築ガイド

pip install・venv・pytest.ini設定・動作確認テストまで

→ 記事を読む

🔍
③ GETテスト

ステータス・レスポンス・ヘッダー・スキーマ検証(9件)

→ 記事を読む

✏️
④ POSTテスト

データ作成・ID付与・バリデーション異常系(9件)

→ 記事を読む

🔄
⑤ PUT/PATCHテスト

全体更新・部分更新の違いと実装(9件)

→ 記事を読む

🗑️
⑥ DELETEテスト

削除・削除後の404確認・204対応(7件)

→ 記事を読む

📊
⑦ CSV出力・HTMLレポート化

pytest-html・CSV追記・utf-8-sig・fixture初期化・response.elapsed

→ 記事を読む


02. シリーズで学んだ実務コードパターン

このシリーズを通じて登場した実務で必ず使うコードパターンをまとめます。

① 実務の基本パターン(毎回使う3行)

response = requests.get(url, timeout=5)
response.raise_for_status()  # 4xx/5xxで自動例外
elapsed_ms = response.elapsed.total_seconds() * 1000

② ヘッダーチェック(部分一致が正解)

# ✅ in で部分一致(charset付きでも失敗しない)
content_type = response.headers.get("Content-Type", "")
assert "application/json" in content_type

③ 必須フィールドの一括検証

required_fields = ["id", "name", "email"]
for field in required_fields:
    assert field in body, f"'{field}' が存在しません"

④ スキーマ(型)検証

assert isinstance(body["id"],    int)
assert isinstance(body["name"],  str)
assert isinstance(body["email"], str)

⑤ FAIL時もCSVに記録するパターン

try:
    assert response.status_code == 200
    write_result("TC01", "GET /users/1", "PASS", ...)
except AssertionError as e:
    write_result("TC01", "GET /users/1", "FAIL", ..., str(e))
    raise  # pytestに失敗を伝える

💡 ポイント:これら5つのパターンを組み合わせるだけで、実務レベルのAPIテストコードが書けます。


03. このシリーズで実装したテストケース一覧

シリーズ全体で合計34件のテストケースを実装しました。

カテゴリ件数主な検証内容
GETテスト9件ステータス・raise_for_status・ヘッダー・ボディ・フィールド・スキーマ・404・一覧・レスポンスタイム
POSTテスト9件201確認・raise_for_status・ヘッダー・ボディ・ID付与・必須フィールドなし・空文字・不正メール・スキーマ
PUT/PATCHテスト9件PUT200・raise_for_status・PUTボディ・ヘッダー・PATCH200・PATCHボディ・PATCH複数・スキーマ・404
DELETEテスト7件200確認・raise_for_status・レスポンスボディ・削除後404・存在しないリソース・200/204・ヘッダー

💡 ポイント:34件のテストケースでCRUD全操作をカバーできます。「APIテストができる」というポートフォリオのアピールとして十分な内容です。


04. APIテストのポートフォリオ活用法

このシリーズで実装したコードをポートフォリオとして公開する際のポイントを紹介します。

GitHubに公開する構成(おすすめ)

automated-testing-portfolio/
├── README.md              ← テストケース一覧・実行方法を記載
├── pytest.ini             ← HTMLレポート自動生成設定
├── requirements.txt       ← 依存ライブラリ一覧
├── tests/
│   ├── test_get_api.py    ← GETテスト(9件)
│   ├── test_post_api.py   ← POSTテスト(9件)
│   ├── test_put_patch_api.py ← PUT/PATCHテスト(9件)
│   └── test_delete_api.py ← DELETEテスト(7件)
├── report.html            ← テスト実行結果(HTMLレポート)
└── test_results.csv       ← テスト実行結果(CSV)

💡 ポイント:report.htmltest_results.csv をGitHubに含めると、「実際に動かした証拠」がそのまま見えます。クライアントや採用担当者へのアピールになります。


05. APIテストシリーズ ハマりポイント総まとめ

シリーズ全体を通じて、特によく出てくるハマりポイントをまとめます。


① Content-Typeは == ではなく in で比較する

# ❌ charset付きで失敗する
assert response.headers["Content-Type"] == "application/json"

# ✅ 部分一致で安全
assert "application/json" in response.headers.get("Content-Type", "")

② 204 No Contentでjson()を呼ぶとエラーになる

# ✅ ステータスコードで分岐する
if response.status_code == 204:
    body = None
else:
    body = response.json()

③ raise_for_statusとassertの使い分け

# 正常系:raise_for_status()でまとめて4xx/5xxを検知
response.raise_for_status()

# 異常系:意図的に4xx/5xxを確認するときはassertを使う
response = requests.delete(url)
assert response.status_code == 404

④ CSV出力はutf-8-sigでExcel対応

# ✅ ExcelでCSVを開いても文字化けしない
with open(CSV_FILE, mode="w", encoding="utf-8-sig") as f:
    ...

⑤ timeoutとresponse.elapsedで実務品質に

# ✅ 実務の基本パターン
response = requests.get(url, timeout=5)
elapsed_ms = response.elapsed.total_seconds() * 1000

06. よくある質問(FAQ)

Q. pytestとPostmanどちらでAPIテストを書くべきですか?
A. 手動テストや動作確認ならPostmanが便利ですが、自動テストやCI/CDに組み込む場合はpytest + requestsの方が適しています。コードとして管理できるため、テストの再利用・自動実行・GitHubでの共有が可能になります。ポートフォリオとして公開するならpytest + requestsがおすすめです。

Q. このシリーズはどの順番で読めばいいですか?
A. APIテストが初めての方は①→②→③の順に読むことをおすすめします。特定のHTTPメソッドだけ学びたい方は直接その記事に飛んでください。各記事は独立して読めるよう構成しています。

Q. JSONPlaceholder以外のAPIで試せますか?
A. はい。認証フローのテストには Restful Booker、より本格的なテストには reqres.in や自前のAPIを使うことができます。このシリーズのコードはAPIのURLを変えるだけで他のAPIにも応用できます。

Q. このシリーズのコードをポートフォリオに使ってもいいですか?
A. もちろんです。GitHubに公開してポートフォリオとして活用してください。READMEにテストケース一覧と実行方法を記載し、HTMLレポートも含めると完成度が上がります。

Q. Playwrightのコードも一緒に載せた方がいいですか?
A. はい。UIテスト(Playwright)とAPIテスト(requests)を1つのリポジトリで公開すると「UIもAPIも両方できます」というアピールになります。実際にGitHubで公開しているポートフォリオの構成としておすすめです。

Q. CI/CDに組み込む方法はありますか?
A. GitHub Actionsを使えばpushするたびにAPIテストを自動実行できます。.github/workflows/test.yml を作成して pytest コマンドを実行する設定を追加するだけです。シリーズの次のステップとして検討してみてください。


07. まとめ

PythonによるAPIテストの自動化は、pytestとrequestsの2つを組み合わせるだけで実務レベルの品質が実現できます。このシリーズで学んだスキルはポートフォリオとしてもUpworkやLinkedInへのアピールとしても十分な内容です。

このシリーズでは、APIテストの基礎から実務パターン・レポート化まで全7回で解説しました。

スキル内容
APIテストの基礎概念・環境構築・基本パターンの理解
CRUD全操作のテストGET・POST・PUT/PATCH・DELETEの実装(34件)
実務パターンの習得raise_for_status・ヘッダー検証・スキーマ検証
レポート・CSV出力pytest-html・csvモジュール・エビデンス管理
ポートフォリオ活用GitHub公開・HTMLレポート・requirements.txt

このシリーズを最後まで読んでいただきありがとうございました。「UIテストもAPIテストもできるQAエンジニア」として、ぜひポートフォリオに活かしてください💪

⬅️ 前の記事

PythonでAPIテスト結果をCSV・HTMLレポートに出力する方法|pytest×requests実務パターン

記事を読む →

📚 シリーズ一覧

Python APIテスト完全ガイド|pytest×requestsでCRUDテストからHTMLレポート・CSV出力まで

一覧を見る →

タイトルとURLをコピーしました