1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Postman Code モックサーバー入門 - 概要編: より現実に近いAPIを再現するモックとは

1
Last updated at Posted at 2026-09-01

Postman Code モックサーバー入門シリーズ

  • Postman Code モックサーバー入門 - 概要編 (本記事)
  • Postman Code モックサーバー入門 - 実装編 (近日中に投稿予定)
  • Postman Code モックサーバー入門 - 障害注入編 (近日中に投稿予定)

2026年7月21日のPostman v12.20.1で、Postman Codeモックサーバー(以下、Codeモックサーバー)とPostman Simulator(以下、Simulator)がクラウドで使えるようになりました。
どちらもこれまではGitリポジトリに接続されたワークスペースでのローカル開発向けの機能でしたが、クラウドサービスとして利用できるようになったことで、チームや外部利用者との共有や、モックAPIとしての利用の幅が大きく広がりました。

そこで本シリーズでは、3回に分けてCodeモックサーバーを紹介します。概要編である本記事では、Codeモックサーバーが何であり、何ができるのか、そして開発の流れを整理します。

Codeモックサーバーとは

Postmanには2種類のモックサーバーがあります。

  • コレクションベースのモックサーバー:従来から提供されているモックサーバーです。コレクションをベースに作成され、コレクションに保存済みのサンプル(example)をそのまま返します
  • Codeモックサーバー:JavaScriptでリクエストの処理とレスポンスのロジックを書き、応答を制御するモックサーバー

この2つは作成方法が違うだけで、クラウドにデプロイされたあとはどちらも単に「モックサーバー」です。
コレクションベースのモックサーバーは作成した時点からクラウド上で動くモックサーバーであり、Codeモックサーバーはローカルで実行してからクラウドへデプロイできます。
本記事では両者の違いを明確にするため、それぞれを「コレクションベースのモックサーバー」「Codeモックサーバー」と呼び分けます。

コレクションベースのモックサーバーは設定が簡単なので、APIの設計確認や固定レスポンスの共有、シンプルなプロトタイピングに向いています。
一方Codeモックサーバーは、コードで応答を組み立てられる分、表現力が高くなります。
コレクションベースのモックサーバーではできないことのうち、代表的なものは次の3つです。

  • 条件分岐やロジックの実行:認証の前後で応答内容を変える、など
  • 状態を持つAPIの再現:リクエストをまたいで状態を保持するCRUD処理、カウンター、セッションごとの別状態、など
  • データ駆動の応答:データセット(Datasets)を参照し、リクエスト条件に合う行を返す

固定レスポンスだけで足りるなら、コレクションベースのモックサーバーで始めるのが手軽です。
ログイン状態、CRUDの蓄積、段階的に変わる処理状態、一定間隔で失敗する挙動などを再現したいなら、Codeモックサーバーを選びます。

code-mock-server-overview.png

図: Codeモックサーバーの全体イメージ

書いたCodeモックサーバーはローカルで実行できますし、クラウドにデプロイして公開URLとして払い出すこともできます。

Codeモックサーバーの利用について

  • Codeモックのローカル実行は、Postmanアプリ(デスクトップ)またはPostman CLIでのみ可能です
  • Codeモックのクラウドへのデプロイは、有料プランでのみ利用できます
  • デプロイ済みCodeモックサーバーの設定について
    • デフォルトは非公開設定で、アクセスにはワークスペース権限またはPostman APIキーが必要です
    • 公開設定にすることで、URLを知っているユーザーがアクセスできます
    • ローカルでの変更を自動的に反映する自動デプロイも設定可能です

Codeモックサーバーの開発の流れ

Codeモックサーバーは、ローカルでコードを書いて検証し、それをクラウドへ同期してデプロイする、という流れで開発します。
ローカル実行とクラウド実行では同じハンドラーコードを使い、実行場所だけを切り替えられます。

全体の流れは次の6ステップです。

# ステップ 実行場所 やること
1 モックを作成する ローカル JavaScriptのハンドラーを書く(*1)
2 ローカルで実行する ローカル Postmanアプリ(デスクトップ)またはPostman CLIでローカル起動する
3 コレクションで検証する ローカル コレクションをモックに向けて実行し、レスポンスを確認する
4 クラウドへPushする
(*2 ネイティブGit連携で、GitをSSoTとする場合のみ)
クラウド Git管理のモックコードの定義をクラウドのワークスペースへ同期する
5 モックサーバーとしてデプロイする クラウド 常時稼働するURLを払い出す
6 運用して改善する 両方 ログを確認し、フィードバックをハンドラーへ反映する

dev-flow.drawio.png

図: Codeモックサーバーの開発の流れ

*1 - ハンドラーの実装は、Postman AI(Agent Mode)を活用することで大幅に効率化・自動化できます
*2 - ネイティブGit連携で、GitをSSoT(Single Source of Truth、信頼できる唯一の情報源)とする場合とは?: ネイティブGit連携で、モックサーバーのコードのバージョンをGitベースのレポジトリで管理している場合のこと。ネイティブGit連携については、こちらの記事が参考になります。

ステップバイステップでの開発方法については、「Postman Code モックサーバー入門 - 実装編」にて紹介予定です

ローカルでの開発(ステップ1〜3)

ハンドラーではリクエストを読み取り、ステータスコード、ヘッダー、レスポンス本文を決定します。
書いたらPostmanアプリ(デスクトップ)またはPostman CLIでローカル起動し、localhostのエンドポイントにリクエストを送って動作を確認します。

たとえばGET /healthだけを持つ、最小のCodeモックサーバーは次のように書けます。

単純なGET /healthのエンドポイントを実装したCodeモックサーバー
const http = require("http");
// 実行環境が指定するポートを優先(ローカルとクラウドで同じコードが動く)
const PORT = process.env.PORT || 4500;

// Node.js標準のhttpモジュールでハンドラーを定義する
const server = http.createServer((req, res) => {
  const { method, url } = req;
  // @endpointコメントでエンドポイントを宣言する(Postman固有の作法)
  // @endpoint GET /health
  // メソッドとパスで分岐し、自分でレスポンスを組み立てる
  if (method === "GET" && url === "/health") {
    res.writeHead(200, { "Content-Type": "application/json" });
    return res.end(JSON.stringify({ status: "ok" }));
  }
  // どのエンドポイントにも一致しない場合のフォールバック
  res.writeHead(404, { "Content-Type": "application/json" });
  res.end(JSON.stringify({ error: "Endpoint not defined" }));
});

server.listen(PORT, () => {
  console.log(`Mock server running on port ${PORT}`);
});

動作を確認したら、対象のコレクションをローカルのモックに向けて実行し、ステータスコードやレスポンス形式が期待どおりかを検証します。
CIでは同じファイルを使って、コミットごとに再現可能なテストを回せます。

クラウドへの公開(ステップ4〜5)

PushとDeployについての補足です。

Pushは、検証済みのコードの定義をPostmanクラウド上のワークスペースへ同期する操作です。先述の通り、ネイティブGit連携で、GitをSSoTとする場合にのみ行います。
Pushした段階ではコードがクラウドに保存されるだけで、常時稼働するURLはまだありません。

Deployは、クラウド上のモックのコードをモックサーバーとして稼働させる操作です。
デプロイすると安定したクラウドURLが払い出され、利用者がアクセスできるようになります。デフォルトでPrivate、つまり利用者はアクセスにPostman APIキーが必要なURLが払い出されます。

デプロイ後は、リクエストログや状態、レスポンスを確認しながらハンドラーを改善していきます。
変更したらローカルで再検証し、あらためてクラウドへ同期して再デプロイします。

Codeモックサーバーで利用可能な主要JavaScript API

Codeモックサーバーのハンドラーで利用できる主要なJavaScript APIを紹介します。イメージが湧くように、スニペットも合わせて示します。
4つ紹介しますが、まずはpm.mockとpm.stateの2つを押さえると、Codeモックサーバーの利点が見えやすくなります。

pm.mock - リクエストマッチ、サンプル指定

pm.mock.matchRequestでリクエストをマッチさせ、pm.mock.sendExampleで保存済みのサンプル(example)を参照してレスポンスを返します。
すべてを手書きするのではなく、既存コレクションのサンプルを流用できます。
ベースは既存のサンプルに任せ、一部だけ条件分岐を加えたいときに効きます。

GetUserbyIdリクエストに対して200 OKのサンプルを指定する例
const server = http.createServer((req, res) => {
  const { method, url } = req;
  const requestPath = "<collection-and-folder-path>/GetUserById.request.yaml";
  const examplePath = "<collection-and-folder-path>/.resources/GetUserById.resources/examples/200 OK.example.yaml";
  // @endpoint GET /users/:id`
  if (pm.mock.matchRequest(requestPath, req)) {
    return pm.mock.sendExample(examplePath, res);
  }
  //...snip...
});

pm.mockのリファレンス: Postman Docs: pm.mock

pm.state (BETA) - 状態管理

pm.stateは状態を管理するAPIです。リクエストをまたいで状態を保持したいときに使います。
これによってCodeモックサーバーは、固定レスポンスを返すだけのものから、前の操作を覚えているAPIのように振る舞うものになります。

主な操作はpm.stateのget、set、delete、keys、clear、incrementメソッドです。なお、いずれも非同期なのでawaitを使う必要があります。

あるセッションの状態を更新する例
const sessionId = req.headers['x-mock-session'] || 'shared';
const stateKey = `cart:${sessionId}`;

const items = (await pm.state.get(stateKey)) || [];
const newItem = "New Value";
items.push(newItem);
await pm.state.set(stateKey, items);
// ...snip...
}

pm.stateのリファレンス: Postman Docs: pm.mock

pm.datasets (BETA) - データセット操作

データセットを読み込み、SQLクエリやviewを使って応答データを組み立てます。
固定JSONを大量に抱えることなく、問い合わせ条件に応じて現実的なデータを返せます。

ユーザー情報のデータセットからあるユーザーIDの情報を取得する例
const dataset = pm.datasets('<dataset-unique-ID>');
const userId = "user-ID";
const result = await dataset.executeQuery(
  'SELECT userId, email, name FROM source_users WHERE userId = ?',
  [userId]
);
const rows = [];
for await (const row of result.rows) {
  rows.push(row);
}

pm.datasetsのリファレンス: Postman Docs: pm.datasets

pm.require - パッケージの読み込み

pm.requireはパッケージを読み込むAPIです。読み込み元は次の2つです。

共通のロジックを毎回書き写す必要がなくなるので、複数のモックで同じ処理を使い回したいときに活用します。

ここで、主要なJavaScript APIを紹介しましたが、まずはpm.mockとpm.stateの2つを押さえると、Codeモックサーバーの利点が見えやすくなります。

代表的なユースケース

ユースケース できること 使う機能
認証フロー ログイン前後でアクセス可否を変える pm.stateによる状態管理と条件分岐
CRUD API POSTで保存し、GETで取得し、DELETEで削除する pm.stateによる状態管理と条件分岐
セッション分離 ユーザーごとに互いに影響しないシナリオを検証する セッション用ヘッダー(例:x-mock-session)で識別し、pm.stateでセッションごとの状態を管理
データ参照API データセットから該当するユーザーを返す pm.datasetsによるデータセットに格納せれているレコードの活用
障害注入 一定割合や一定回数で5xxを返す Postman Simulatorの活用

Simulatorによるモックへの障害注入

Simulatorは、1つまたは複数のモックに障害シナリオを適用するシミュレーションを作る機能です。

デプロイ済みのCodeモックサーバーに対して障害を注入できるので、利用者は同じモックサーバーのまま、本番に近い異常系を再現できます。

注入できる障害は次のとおりです。

  • 遅延
  • エラー(4xx、5xx)
  • レート制限
  • Chaosモード(指定した割合で5xxを返す)

simulator-integration.png

図: Postman Simulatorによるモックへの障害の注入のイメージ

設定はPostmanアプリのUIから行えます。また、ローカル開発の場合はYAMLで記述することもできます。

下図は、2種類のモック、inventory_mockとpayment_mockに対してそれぞれ、Chaos(80%の確率で5xxエラー)とレートリミット(10 req/min)を発生させる設定の例です。左がPostmanアプリのUIでの設定、右がYAML設定ファイルになります。

simulation-config.png

図: Simulationの設定例 (Postman App UIとYAMLでの設定)

Simulatorによるモックサーバーへの障害注入の流れ

デプロイ済みのモックに対して次の流れで障害を注入します。

  1. Simulatorのシナリオを作成します(シナリオごとにURLが発行されます)
  2. 作成したシミュレーションを開始します
  3. 利用者はSimulatorが適用されたモックURLに切り替えて利用します(これで、障害レスポンスが返ります)

ステップバイステップでの障害注入の方法については、「Postman Code モックサーバー入門 - 障害注入編」にて紹介予定です

さいごに

本記事では、Codeモックサーバーの概要として、コレクションベースのモックサーバーとの違い、ハンドラーで使える主要なJavaScript API、開発の流れ、そしてSimulatorによる障害注入までを見てきました。

Codeモックサーバーの要点は、モックを「保存済みのレスポンスを返すもの」から「コードで振る舞いを組み立てるもの」へ広げられることです。
pm.stateでリクエストをまたいだ状態を持たせ、pm.datasetsでデータに基づいた応答を返し、Simulatorで異常系を注入する。
これらを組み合わせれば、認証フローやCRUD、遅延やエラーといった、本番に近い条件をモックの段階で再現できます。

次回の実装編では、本記事で紹介したJavaScript APIを使って、実際に動くモックサーバーをステップバイステップで組み立てていきます。

参考リンク

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?