サイトのAPI図鑑B版
掲載情報が正確でない可能性があります。
API基礎・入門

APIテスト自動化の入門ガイド【Postman・Newman・Jest・pytest】

APIのテスト自動化について、Postman・Newman・Jest・pytestなどのツールを使った方法を入門者向けに解説。ユニットテストから統合テスト・E2Eテストまで網羅します。

#APIテスト#テスト自動化#Postman#CI/CD

APIテスト自動化の重要性

APIテストの自動化は、品質を保ちながら開発スピードを維持するために不可欠です。手動テストだけでは、コード変更のたびに全機能を確認する工数が膨大になります。自動テストがあれば、リグレッション(既存機能の壊れ)を素早く発見でき、リリースへの不安を減らせます。

APIテストの種類

ユニットテスト(単体テスト)

個別の関数・メソッドを独立してテストします。データベースや外部APIへの依存をモックで置き換えるため、高速で安定したテストが実現できます。テストの大半をここで実施します。

統合テスト

複数のコンポーネントが協調して動作することをテストします。実際のデータベースや一部の外部サービスを使い、コンポーネント間の連携が正しく動作するか確認します。

E2Eテスト(End-to-End)

実際のHTTPリクエストを送り、APIが仕様通りに動作するかを確認します。本番に近い環境で実行し、ユーザーシナリオに沿ったテストを行います。実行コストが高いため数を絞り込みます。

契約テスト(Contract Testing)

マイクロサービス間やAPIプロバイダーと利用者間で「APIの契約(スキーマ・動作)」が合致しているかを検証します。PactやSpring Cloud Contractなどのツールが使われます。

Postmanを使ったAPIテスト

PostmanはGUIでAPIのリクエストを作成・実行・テストできる人気ツールです。基本的な使い方は以下の通りです。

  1. リクエストの作成:HTTP メソッド・URL・ヘッダー・ボディを設定
  2. テストスクリプトの記述:「Tests」タブでJavaScriptのAssertionを書く
  3. コレクションへの保存:関連するリクエストをコレクションにまとめる
  4. 環境変数の設定:本番・開発・テスト環境を切り替えるための変数

Postmanのテストスクリプト例:

pm.test("Status code is 200", function () {
  pm.response.to.have.status(200);
});
pm.test("Response has user id", function () {
  const json = pm.response.json();
  pm.expect(json).to.have.property('id');
  pm.expect(json.id).to.be.a('number');
});

Newmanを使ったCI/CD組み込み

NewmanはPostmanのコレクションをCLIで実行するツールです。CI/CDパイプライン(GitHub Actions・GitLab CI・Jenkins等)に組み込むことで、コードプッシュのたびに自動でAPIテストを実行できます。

newman run collection.json   --environment production.json   --reporters html,cli   --reporter-html-export report.html

Jestを使ったNode.js APIテスト

Node.js/TypeScriptのバックエンドAPIテストには、JestとsuperTest(またはaxios)の組み合わせが広く使われます。

import request from 'supertest';
import app from '../app';

describe('GET /users/:id', () => {
  it('正常なユーザーIDで200を返す', async () => {
    const response = await request(app)
      .get('/v1/users/1')
      .set('X-API-Key', 'test-key');
    
    expect(response.status).toBe(200);
    expect(response.body).toHaveProperty('id', 1);
    expect(response.body).toHaveProperty('name');
  });

  it('存在しないIDで404を返す', async () => {
    const response = await request(app).get('/v1/users/99999');
    expect(response.status).toBe(404);
  });
});

pytestを使ったPython APIテスト

PythonのAPIテストにはpytestとrequestsライブラリの組み合わせが一般的です。FastAPIには専用のTestClientも用意されています。テストのフィクスチャ(setup/teardown)やパラメータ化テストで効率的にテストケースを管理できます。

テスト設計のベストプラクティス

  • AAA(Arrange-Act-Assert)パターン:テストを「準備→実行→検証」の3ステップで構造化する
  • テストの独立性:各テストは他のテストの結果に依存しない
  • エッジケースのカバー:正常系だけでなく、空データ・最大値・不正な入力もテストする
  • テストデータの分離:テスト用のデータを本番データから分離する
  • テストカバレッジの計測:重要なビジネスロジックは必ずカバーする

CI/CDへの組み込み

APIテストをCI/CDに組み込むことで、プルリクエストのマージ前に自動でテストが実行され、品質ゲートとして機能します。GitHub Actionsの設定例では、PRがopenされるたびにビルド・テスト・カバレッジレポートが自動で実行されます。

まとめ

APIテストの自動化は初期投資が必要ですが、長期的にはバグの早期発見・手動テストの削減・自信を持ったデプロイが可能になり、チーム全体の生産性を向上させます。まずはPostmanでの手動テストから始め、徐々にCI/CDへの組み込みとコードベースのユニットテストを整備していくことをお勧めします。

よくある質問

Q.PostmanとNewmanの違いは何ですか?

PostmanはGUIベースのAPI開発・テストツールです。NewmanはPostmanのコレクションをコマンドラインで実行するCLIツールです。PostmanでテストシナリオとAssertionを作成し、NewmanでCI/CDパイプライン上での自動実行に使います。

Q.APIテストはどのレベルで行うべきですか?

ユニットテスト(個別ビジネスロジック)→統合テスト(API層の動作確認)→E2Eテスト(実際のHTTPリクエストによる動作確認)の3層で行うことが推奨されます。テストピラミッドの考え方に基づき、ユニットテストを最も多く、E2Eテストを最も少なくするのが効率的です。

Q.APIテストにモックを使うべきですか?

外部APIや重いDBに依存するテストではモック(スタブ)を使い、テストの速度と安定性を保ちます。ただし、モックは実際の動作を保証しないため、実際の外部APIを使う統合テストも別途行うことが理想的です。

関連記事