APIテストを強化する!Postmanのシナリオテスト活用法

こんにちは!QAエンジニアのK.Kです。

今回はPostmanを使用したAPIのシナリオテストについて解説していきたいと思います。

APIのシナリオテストについて

なぜAPIのテストが重要なのか

現代のアプリケーション開発では、APIが重要な役割を果たしています。フロントエンドとバックエンドの連携、外部サービスとの統合、マイクロサービス間の通信など、APIは様々な場面で使用されており、APIの品質が低いと、アプリケーション全体のユーザーエクスペリエンスに大きな影響を与えてしまいます。

「シナリオテスト」が求められる背景

従来のAPIテストでは、個々のエンドポイントの動作確認が中心でした。しかし、これだけでは以下の問題が見過ごされる可能性があります。

  • エンドポイント間の連携エラー:前のAPIで取得したデータを次のAPIで正しく使用できない
  • 状態管理の問題:セッション情報や認証状態の維持ができない
  • データ整合性の問題:複数のAPI操作後のデータ状態が期待と異なる
  • パフォーマンスの劣化:連続したAPI呼び出しでの応答時間の増加

実際のユーザーの行動を模擬した一連のAPIリクエストを通じて、上記の問題を見つけ出すことが可能となります。例えば、ブログシステムでは以下のような流れをテストします。

  1. ユーザー情報取得 → 認証・権限の正常性確認
  2. 投稿一覧取得 → データ取得とページネーションの動作確認
  3. 新規投稿作成 → 作成処理とデータベース登録の確認
  4. 投稿詳細取得 → 作成したデータの一貫性と関連情報の整合性確認
  5. 投稿更新・削除 → データ変更処理と他機能への影響範囲の確認

この一連の流れを通じて、単体テストでは発見できない「エンドポイント間の連携エラー」「状態管理の問題」「データ整合性の問題」を効率的に検出できます。

APIシナリオテストのメリット

シナリオに沿ったテストにおいてE2Eテストも存在しますが、APIレベルでのシナリオテストには異なる価値があります。両者は補完的な関係にあり、適切な使い分けが重要です。

E2EテストとAPIシナリオテストの特徴比較

観点E2EテストAPIシナリオテスト
検証範囲UI操作からデータまでの全体フローAPI層のビジネスロジックとデータフロー
実行速度時間がかかる高速実行が可能
適用タイミングUI完成後バックエンド開発完了後すぐ
得意分野ユーザー体験の検証データ処理・連携の検証

それぞれの適用場面

E2Eテストが適している場面

  • ユーザーの操作フローの検証
  • 画面遷移や表示内容の確認
  • ブラウザ固有の動作検証
  • 統合テストの最終確認

APIシナリオテストが適している場面

  • ビジネスロジックの詳細検証
  • データ整合性の確認
  • マイクロサービス間の連携テスト
  • 継続的インテグレーション(CI)での自動テスト
  • 大量データ処理のテスト

APIシナリオテストの特有のメリット

  • 早期テスト開始:UIが完成する前からバックエンドの品質を検証可能
  • 詳細なデータ検証:レスポンスデータの詳細な検証が容易で、データ構造や値の妥当性を厳密にチェック
  • 高速実行:ブラウザやUIレンダリングが不要で、テスト実行時間を大幅に短縮
  • 安定した実行環境:ブラウザバージョンやOS環境に依存せず、安定したテスト実行が可能
  • 並行実行:軽量なため、大量のテストケースを並行実行してCI/CDパイプラインに組み込みやすい
  • シンプルなデバッグ:リクエスト・レスポンスが明確で、問題の特定と修正が迅速

効果的なテスト戦略

APIシナリオテストとE2Eテストを組み合わせることで、以下のような段階的なテスト戦略が可能になりますす。

  1. 開発初期:APIシナリオテストでビジネスロジックを検証
  2. 統合段階:E2Eテストでユーザー体験を検証
  3. 運用段階:両方を組み合わせた包括的な品質保証

Postmanとは?

Postmanの概要

Postmanは、APIの開発やテストを効率的に行うためのプラットフォームです。

なぜPostmanがシナリオテストに向いているのか

1. 直感的な視覚操作

  • GUIベースでAPIリクエストを簡単に作成・編集
  • ドラッグ&ドロップでワークフローを構築
  • テスト結果をリアルタイムで視覚的に確認

2. 高い再利用性

  • コレクション機能でテストケースを体系的に管理
  • 環境変数を活用した柔軟な設定切り替え
  • JavaScriptを使用した高度なテストスクリプト

3. AI補助機能

  • Postbotによるテストスクリプトの自動生成
  • 自然言語でのテスト要件入力

4. 豊富な機能

  • チーム間でのテストケース共有が容易
  • CI/CDパイプラインとの統合

環境構築手順

必要なもの

Postman

テスト対象API

  • 本記事では、JSONPlaceholder(https://jsonplaceholder.typicode.com/ )を使用します
  • これは無料で利用できるRESTAPIのテストサービスです
  • 注意: JSONPlaceholderはテスト用のAPIサーバーのため、POST/PUT/DELETEリクエストは実際にはデータベースに反映されません。レスポンスは正常に返されますが、データの永続化は行われないことをご了承ください

Postmanによるシナリオテストの実践方法

コレクションとフローの概要・比較

Postmanでは、コレクション機能フロー機能の2つの方法でシナリオテストを実施できます。

特徴コレクションフロー
操作方法リスト形式でリクエストを管理ドラッグ&ドロップの視覚的操作
学習コスト低い(従来のAPIテスト経験があれば習得容易)中程度(視覚的だが新しい概念)
複雑な処理JavaScriptコードで実装GUIで条件分岐・ループを設定
デバッグコンソールログで確認実行フローを視覚的に追跡
適用場面CI/CDへの組み込み非技術者との共有

メリット・デメリット

コレクション
  • ✅ 学習コストが低い
  • ✅ 既存のAPIテスト資産を活用可能
  • ✅ CI/CDとの連携が簡単
  • ❌ 複雑な条件分岐の実装が煩雑
フロー
  • ✅ 複雑なワークフローを視覚的に表現
  • ✅ 非技術者でも理解しやすい
  • ✅ エラーハンドリングが直感的
  • ❌ 新しい機能であるため学習が必要

コレクションを使った手法

コレクション機能は、関連するAPIリクエストをグループ化し、順次実行するPostmanの基本機能です。フォルダ構造でテストを整理し、環境変数を活用してデータを受け渡しながらシナリオテストを実現します。

例:ブログAPIのシナリオテスト

1. コレクションの作成

まず、新しいコレクションを作成します。Postmanの左サイドバーで「Collections」タブを選択し、「Create Collection」ボタンをクリックします。

作業内容解説

  • コレクション名に「Blog API Scenario Test」などの分かりやすい名前を設定
  • フォルダ構造でテストを分類(認証、CRUD操作、エラーハンドリングなど)
フォルダ構造でテストを分類
2. 環境変数の設定

環境変数を設定することで、異なる環境(開発、テスト、本番)でのテスト実行や、テスト間でのデータ受け渡しが可能になります。

作業内容解説

  • 「Environments」タブから新しい環境を作成
  • baseUrlにAPIのベースURL(https://jsonplaceholder.typicode.com)を設定
  • postTitlepostBodyなどのテストデータを定義
  • 実行時に動的に設定される変数(userIdpostId)用の枠を用意
環境変数
3. 各リクエストの詳細設定

設定画面(01_Get Users)

作業内容解説

  • リクエスト名を分かりやすく設定(01_Get Users)
  • HTTPメソッドとURLを指定
  • 「Tests」タブでレスポンス検証とデータ抽出を行うJavaScriptコードを記述

01_Get Users

このリクエストでは、全ユーザー情報を取得し、最初のユーザーIDを後続のテストで使用するため環境変数に保存します。

GET {{baseUrl}}/users

Tests:
pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});

pm.test("Response has users", function () {
    const jsonData = pm.response.json();
    pm.expect(jsonData.length).to.be.greaterThan(0);

    // 最初のユーザーIDを環境変数に保存
    pm.environment.set("userId", jsonData[0].id);
});

作業画面スクリーンショット

02_Get Posts

全投稿を取得して、APIが正常に動作することを確認します。

GET {{baseUrl}}/posts

Tests:
pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});

pm.test("Response has posts", function () {
    const jsonData = pm.response.json();
    pm.expect(jsonData.length).to.be.greaterThan(0);
});

03_Create Post

新しい投稿を作成し、前のステップで取得したユーザーIDを使用します。

POST {{baseUrl}}/posts

Body (JSON):
{
  "title": "{{postTitle}}",
  "body": "{{postBody}}",
  "userId": {{userId}}
}

Tests:
pm.test("Status code is 201", function () {
    pm.response.to.have.status(201);
});

pm.test("Post created successfully", function () {
    const jsonData = pm.response.json();

    // 作成された投稿IDを保存
    // pm.environment.set("postId", jsonData.id);
    // テスト用のAPIサーバであるため投稿したIDが使用できないので100を設定
    pm.environment.set("postId", 100);
});

04_Get Created Post

作成した投稿が正しく取得できることを確認します。

※本来は先ほどの手順で追加した投稿を取得すべきだが、JSONPlaceholderではPOSTで追加した投稿はデータベースに登録されないため、登録済みの投稿を取得

GET {{baseUrl}}/posts/{{postId}}

Tests:
pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});

pm.test("Retrieved correct post", function () {
    const jsonData = pm.response.json();
    pm.expect(jsonData.id).to.eql(100);
    pm.expect(jsonData.title).to.eql("at nam consequatur ea labore ea harum");
});

05_Update Post

投稿内容を更新し、変更が正しく反映されることを確認します。

PUT {{baseUrl}}/posts/{{postId}}

Body (JSON):
{
  "id": {{postId}},
  "title": "{{postTitle}} - 更新版",
  "body": "{{postBody}} 更新されました。",
  "userId": {{userId}}
}

Tests:
pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});

pm.test("Post updated successfully", function () {
    const jsonData = pm.response.json();
    pm.expect(jsonData.title).to.include("更新版");
});

コレクションランナーでの実行

1. コレクションランナーを開く

作成したコレクションの「…」メニューから「フォルダーを実行」を選択します。これにより、コレクション内の全リクエストを順番に自動実行できます。

2. 実行設定

  • Iterations:テストを何回繰り返すかを設定
  • Delay:リクエスト間の待機時間を設定(APIサーバーへの負荷軽減)
  • Data File:CSVやJSONファイルからテストデータを読み込み
実行設定画面スクリーンショット

3. 実行結果の確認

  • 各テストの成功/失敗状況が一覧表示
  • レスポンス時間の確認でパフォーマンス問題を早期発見
  • 失敗したテストの詳細情報を確認してデバッグ
実行結果の確認画面スクリーンショット

コレクション手法のメリット

  • 一括実行:複数のAPIを手動で実行する必要がなくテスト効率が向上
  • 再現性:同じテストを何度でも同じ条件で実行可能

フローを使った手法

概要

フロー機能は、APIリクエスト間の関係性を視覚的に表現し、複雑なワークフローを構築できるPostmanの新機能です。条件分岐やループ処理をGUIで設定でき、プログラミング知識が少ない人でも複雑なシナリオテストを作成できます。

実践例:条件分岐を含むAPIフロー

フローの構成

以下のような条件分岐を含むワークフローを作成します。

Start (初期設定)
  ↓
Get All Users (全ユーザーの情報を取得)
  ↓
Get All Posts (全投稿を取得)
  ↓
Loop 全投稿
	└─If (一番最初のユーザーの投稿かどうか)
		  ├─YES → Update Post (投稿を更新)
		  └─NO → 次の投稿へ

作成されたフロー図

作成されたフロー図

作業内容解説

  1. フローの作成:Postmanで「Flows」タブを選択し、新しいフローを作成
  2. Start ブロック:フロー開始時の初期設定を行う
  3. API リクエストブロック:既存のコレクションからAPIリクエストをドラッグ&ドロップで追加
  4. Loop ブロック:全投稿をループ処理するための設定
  5. If ブロック:条件分岐の設定
  6. 接続線:各ブロック間のデータフローを視覚的に設定

フロー手法のメリット

  • 視覚的理解:複雑な条件分岐も図で一目瞭然
  • リアルタイムデバッグ:実行中にどのブロックが動作しているかをリアルタイムで確認
  • エラーハンドリング:エラー時の処理フローも視覚的に設計可能
  • チーム共有:非技術者でもワークフローの内容を理解しやすい

AI機能(Postbot)の活用

Postbotの概要と機能

PostbotはPostmanに組み込まれたAIアシスタントで、以下の機能を提供します。

1. テストスクリプトの自動生成

  • 自然言語での要件入力
  • 適切なJavaScriptテストコードの生成
  • ベストプラクティスに基づいたコード提案
  • 不足しているテストケースの提案

2. APIドキュメントの自動生成

  • リクエスト・レスポンスからドキュメント作成
  • サンプルコードの生成
  • API仕様書の自動更新

利用例

テストスクリプトの自動生成

Postbotに以下のように指示:

ユーザーが1件以上存在することを検証するためのテストと最初のユーザーのIDを変数に保存するためのコードを書いてください。

自動生成される例:

pm.test("Ensure at least one user is retrieved", function () {
    const jsonData = pm.response.json();
    pm.expect(jsonData.length).to.be.greaterThan(0);
});

// 最初のユーザーIDを環境変数に保存
pm.environment.set("userId", pm.response.json()[0].id);

Postbotに以下のように指示:

Add basic tests

自動生成される例:

// Check if the response status code is 200
pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});

// Check if the response body is an array of users
pm.test("Response body is an array of users", function () {
    const jsonData = pm.response.json();
    pm.expect(jsonData).to.be.an('array');
    pm.expect(jsonData.length).to.be.greaterThan(0);
});

// Check if the user ID is saved in the environment variable
pm.test("Save the first user's ID in environment variable", function () {
    const firstUserId = pm.response.json()[0].id;
    pm.environment.set("userId", firstUserId);
});

APIドキュメントの自動生成

ドキュメントが空の状態から自動生成される例:

ドキュメントが空の状態から自動生成される例

まとめ

APIシナリオテストは、単体テストやE2Eテストでは捉えきれない独自の価値を提供します。本記事の実践を通じて、その真の価値を改めて確認することができました。

APIシナリオテストが解決する主要課題

  • 実ユーザー体験の再現:単発的なAPIテストでは発見できない、一連のAPI呼び出しで発生するデータ整合性や状態管理の問題を早期発見
  • システム間連携の信頼性:マイクロサービス環境での複数サービスを横断する処理の信頼性を確保
  • データ一貫性の検証:CRUD操作の流れにおけるデータベース状態の一貫性を継続的に検証
  • 性能問題の早期発見:連続したAPI呼び出しで発生するセッション管理やキャッシュ関連の性能劣化を特定

開発プロセスへの貢献

UIが完成する前からバックエンドの品質を検証できるため、開発ライフサイクル全体での品質保証を効率化できます。また、CI/CDパイプラインに組み込むことで継続的な品質確保が可能となり、アジャイル開発やDevOpsにおいて重要な役割を果たします。

今回の実践を通じて、APIシナリオテストは現代のソフトウェア開発における品質保証の要となる手法であることを再確認できました。適切なツールの選択と活用により、その価値を最大限に引き出すことが重要です。

SHARE

  • facebook
  • twitter

SQRIPTER

AGEST Engineers

AGEST

記事一覧

AGESTのエンジニアが情報発信してます!
AGESTのサービスやソリューションのお問い合わせページはこちらです。

株式会社AGEST

RANKINGアクセスランキング
#TAGS人気のタグ
  • 新規登録/ログイン
  • 株式会社AGEST
NEWS最新のニュース

Sqriptsはシステム開発における品質(Quality)を中心に、エンジニアが”理解しやすい”Scriptに変換して情報発信するメディアです

  • 新規登録/ログイン
  • 株式会社AGEST