1. 序章

Web APIを徹底的にテストするには、APIのエンドポイントにアクセスするための何らかのWebクライアントが必要です。 Postmanは、サービスの外部からHTTPリクエストを作成することでWebAPIを実行するスタンドアロンツールです

Postmanを使用する場合、テストのためだけにHTTPクライアントインフラストラクチャコードを記述する必要はありません。 代わりに、コレクションと呼ばれるテストスイートを作成し、PostmanがAPIと対話できるようにします。

このチュートリアルでは、RESTAPIをテストできるPostmanコレクションを作成する方法を説明します。

2. 設定

コレクションを開始する前に、環境を設定する必要があります。

2.1. Postmanのインストール

Postmanは、Linux、Mac、およびWindowsで使用できます。 このツールは、PostmanWebサイトからダウンロードしてインストールできます。

スプラッシュ画面を閉じると、ユーザーインターフェイスが表示されます。

2.2. サーバーの実行

Postmanは、リクエストを処理するためにライブHTTPサーバーを必要とします。 このチュートリアルでは、GitHubで利用可能な以前のBaeldungプロジェクトspring-boot-rest、を使用します。

タイトルから推測できるように、spring-boot-restはSpringBootアプリケーションです。 Mavenの目標インストールを使用してアプリをビルドします。 ビルドが完了したら、カスタムMavenゴール spring-boot:runを使用してサーバーを起動します。

サーバーが実行されていることを確認するために、ブラウザで次のURLを押すことができます。

http://localhost:8082/spring-boot-rest/auth/foos

このサービスは、インメモリデータベースを使用します。 サーバーが停止すると、すべてのレコードがクリアされます。

3. Postmanコレクションの作成

Postmanのコレクションは、一連のHTTPリクエストです。 Postmanは、ヘッダーやメッセージ本文など、リクエストのあらゆる側面を保存します。 したがって、半自動テストとしてリクエストを順番に実行できます。

新しいコレクションを作成することから始めましょう。 新規ボタンのドロップダウン矢印をクリックして、コレクションを選択できます。

CREATE A NEW COLLECTION ダイアログが表示されたら、コレクションに「 fooAPItest」という名前を付けることができます。 最後に、作成ボタンをクリックして、新しいコレクションが左側のリストに表示されることを確認します。

コレクションが作成されたら、その上にカーソルを置くと、2つのメニューボタンが表示されます。 矢印ボタンは、コレクションランナーへのアクセスを提供するプルライトパネルを開きます。 逆に、省略記号ボタンは、コレクションに対するいくつかの操作を含むドロップダウンメニューを開きます。

4. POSTリクエストの追加

4.1. 新しいリクエストの作成

空のコレクションができたので、APIにヒットするリクエストを追加しましょう。 具体的には、POSTメッセージをURI / auth / foosに送信しましょう。これを行うには、コレクションの省略記号メニューを開き、[リクエストの追加]を選択します。

SAVE REQUEST ダイアログが表示されたら、「 add afoo」などのわかりやすい名前を付けましょう。 次に、 foo APItestに保存ボタンをクリックします。

リクエストが作成されると、コレクションが1つのリクエストを示していることがわかります。 ただし、コレクションが展開されていない場合、リクエストはまだ表示されません。 その場合、コレクションをクリックして展開できます。

これで、コレクションの下に新しいリクエストが表示されます。 新しいリクエストは、デフォルトではHTTP GETであり、これは私たちが望んでいるものではないことがわかります。 次のセクションで修正します。

4.2. リクエストの編集

リクエストを編集するには、リクエストをクリックして、リクエストエディタタブにロードします。

リクエストエディタには多数のオプションがありますが、今のところ必要なのはそのうちのいくつかだけです。

まず、ドロップダウンを使用して、メソッドをGETからPOSTに変更しましょう。

次に、URLが必要です。 メソッドドロップダウンの右側には、リクエストURLのテキストボックスがあります。 それで、今それを入力しましょう:

http://localhost:8082/spring-boot-rest/auth/foos

最後のステップは、メッセージ本文を提供することです。 URLアドレスの下には、タブヘッダーの行があります。 Body タブヘッダーをクリックして、ボディエディターに移動します。

Body タブのテキスト領域のすぐ上に、ラジオボタンの列とドロップダウンがあります。 これらは、リクエストのフォーマットとコンテンツタイプを制御します。

私たちのサービスはJSONデータを受け入れるので、生のラジオボタンを選択します。 右側のドロップダウンで、JSON(application / json)コンテンツタイプを適用します。

エンコーディングとコンテンツタイプを設定したら、JSONコンテンツをテキスト領域に追加します。

{
    "name": "Transformers"
}

最後に、 Ctrl-S を押すか、保存ボタンを押して、変更を保存してください。 保存ボタンは送信ボタンの右側にあります。 保存すると、左側のリストでリクエストがPOSTに更新されたことがわかります。

5. リクエストの実行

5.1. 単一のリクエストの実行

単一のリクエストを実行するには、URLアドレスの右側にある[送信]ボタンをクリックするだけです。 送信をクリックすると、リクエストパネルの下に応答パネルが開きます。 それを表示するには、下にスクロールする必要がある場合があります。

結果を見てみましょう。 具体的には、ヘッダーバーで、リクエストが 201Createdのステータスで成功したことがわかります。 さらに、応答本文は、TransformersレコードがID1を受け取ったことを示しています。

5.2. コレクションランナーの使用

[送信]ボタンとは対照的に、コレクションランナーはコレクション全体を実行できます。 コレクションランナーを起動するには、 foo APIテストコレクションにカーソルを合わせ、右矢印をクリックします。 右のプルパネルに実行ボタンが表示されているので、それをクリックしてみましょう。

実行ボタンをクリックすると、コレクションランナーが新しいウィンドウで開きます。 コレクションから起動したため、ランナーはすでにコレクションに初期化されています。

コレクションランナーは、テストの実行に影響を与えるオプションを提供しますが、この演習ではそれらは必要ありません。 下部にあるRunfoo API test ボタンに直接移動して、それをクリックしてみましょう。

コレクションを実行すると、ビューが実行結果に変わります。 このビューでは、成功の場合は緑色、失敗の場合は赤色でマークされたテストのリストが表示されます。

リクエストが送信されたにもかかわらず、ランナーはゼロテストに合格し、ゼロテストに失敗したことを示しています。 これは、リクエストにまだテストを追加していないためです。

6. 応答のテスト

6.1. リクエストへのテストの追加

テストを作成するために、POSTメソッドを作成したリクエスト編集パネルに戻りましょう。 URLの下にあるテストタブをクリックします。 これを行うと、[テスト]パネルが表示されます。

[テスト]パネルでは、サーバーから応答を受信したときに実行されるJavaScriptを記述します。

Postmanは、リクエストとレスポンスへのアクセスを提供する組み込み変数を提供します。 さらに、 require()構文を使用して、多数のJavaScriptライブラリをインポートできます。

このチュートリアルでカバーするにはスクリプト機能が多すぎます。 ただし、公式のPostmanドキュメントは、このトピックに関する優れたリソースです。

リクエストに3つのテストを追加して続行しましょう。

pm.test("success status", () => pm.response.to.be.success );
pm.test("name is correct", () => 
  pm.expect(pm.response.json().name).to.equal("Transformers"));
pm.test("id was assigned", () => 
  pm.expect(pm.response.json().id).to.be.not.null );

ご覧のとおり、これらのテストでは、Postmanが提供するグローバルpmモジュールを利用しています。 特に、テストでは pm.test()、pm.expect()、およびpm.responseを使用します。

pm.test()関数は、ラベルと、 expect()などのアサーション関数を受け入れます。 pm.expect()を使用して、応答JSONのコンテンツの条件をアサートしています。

pm.response オブジェクトは、サーバーから返された応答に対するさまざまなプロパティと操作へのアクセスを提供します。 使用可能なプロパティには、応答ステータスやJSONコンテンツなどがあります。

いつものように、Ctrl-Sまたは保存ボタンを使用して変更を保存します。

6.2. テストの実行

テストが完了したので、リクエストをもう一度実行してみましょう。 送信ボタンを押すと、応答パネルのテスト結果タブに結果が表示されます。

同様に、コレクションランナーにテスト結果が表示されます。 具体的には、左上の要約には、更新された合格不合格の合計が表示されます。 概要の下には、各テストとそのステータスを示すリストがあります。

6.3. 郵便配達員コンソールの表示

Postman Console は、スクリプトを作成およびデバッグするための便利なツールです。 コンソールは、表示メニューの下に Show PostmanConsoleという項目名で表示されます。 起動すると、コンソールが新しいウィンドウで開きます。

コンソールが開いている間、すべてのHTTPリクエストとレスポンスを記録します。 さらに、スクリプトが console.log()を使用する場合、 PostmanConsoleは次のメッセージを表示します。

7. 一連のリクエストの作成

これまで、単一のHTTPリクエストに焦点を当ててきました。 それでは、複数のリクエストで何ができるか見てみましょう。 一連のリクエストをチェーン化することで、クライアントサーバーワークフローをシミュレートおよびテストできます

このセクションでは、一連のリクエストを作成するために、学習した内容を適用してみましょう。 具体的には、作成済みのPOSTリクエストの後に、実行するリクエストをさらに3つ追加します。 これらはGET、DELETE、そして最後に別のGETになります。

7.1. 変数での応答値のキャプチャ

新しいリクエストを作成する前に、既存のPOSTリクエストに変更を加えましょう。 サーバーが各fooインスタンスに割り当てるIDがわからないため、変数を使用してサーバーから返されたIDをキャプチャできます。

そのIDをキャプチャするために、POSTリクエストのテストスクリプトの最後にもう1行追加します。

pm.variables.set("id", pm.response.json().id);

pm.variables.set()関数は値を受け取り、それを一時変数に割り当てます。 この場合、オブジェクトのid値を格納するためにid変数を作成しています。 設定すると、後のリクエストでこの変数にアクセスできます。

7.2. GETリクエストの追加

ここで、前のセクションの手法を使用して、POSTリクエストの後にGETリクエストを追加しましょう。

このGETリクエストを使用して、POSTリクエストが作成したのと同じfooインスタンスを取得します。 このGETリクエストに「getafoo」という名前を付けましょう。

GETリクエストのURLは次のとおりです。

http://localhost:8082/spring-boot-rest/auth/foos/{{id}}

このURLでは、POSTリクエスト中に以前に設定したid変数を参照しています。 したがって、GETリクエストは、POSTによって作成されたものと同じインスタンスを取得する必要があります。

変数は、スクリプトの外部に表示される場合、二重中括弧構文{{id}}を使用して参照されます。

GETリクエストの本文がないため、テストタブに直接進みましょう。 テストは類似しているため、POSTリクエストからテストをコピーしてから、いくつかの変更を加えることができます。

まず、 id変数を再度設定する必要がないので、その行をコピーしないでください。

次に、今回はどのIDを期待するかがわかっているので、そのIDを確認しましょう。 id変数を使用して次のことを行うことができます。

pm.test("success status", () => pm.response.to.be.success );
pm.test("name is correct", () => 
  pm.expect(pm.response.json().name).to.equal("Transformers"));
pm.test("id is correct", () => 
  pm.expect(pm.response.json().id).to.equal(pm.variables.get("id")) );

二重中括弧構文は有効なJavaScriptではないため、pm.variables.get()関数を使用してid変数にアクセスします。

最後に、以前と同じように変更を保存しましょう。

7.3. DELETEリクエストの追加

次に、サーバーからfooオブジェクトを削除するDELETEリクエストを追加します。

GETの後に新しいリクエストを追加し、そのメソッドをDELETEに設定して続行します。 このリクエストには「deleteafoo」という名前を付けることができます。

削除のURLは、GETURLと同じです。

http://localhost:8082/spring-boot-rest/auth/foos/{{id}}

応答にはテストする本文がありませんが、応答コードをテストできます。 したがって、DELETEリクエストのテストは1つだけです。

pm.test("success status", () => pm.response.to.be.success );

7.4. DELETEの確認

最後に、GETリクエストの別のコピーを追加して、DELETEが実際に機能したことを確認しましょう。 今回は、リクエストを最初から作成するのではなく、最初のGETリクエストを複製しましょう。

リクエストを複製するには、リクエストを右クリックしてドロップダウンメニューを表示します。 次に、Duplicateを選択します。

重複するリクエストには、名前にCopyという単語が追加されます。 混乱を避けるために、名前を「verifydelete」に変更しましょう。 名前の変更オプションは、リクエストを右クリックして使用できます。

デフォルトでは、重複するリクエストは元のリクエストの直後に表示されます。 そのため、DELETEリクエストの下にドラッグする必要があります。

最後のステップは、テストを変更することです。 ただし、その前に、失敗したテストを確認する機会を利用しましょう。

GETリクエストをコピーし、DELETEの後に移動しましたが、テストはまだ更新されていません。 DELETE要求でオブジェクトが削除されているはずなので、テストは失敗するはずです。

必ずすべてのリクエストを保存してから、コレクションランナーで再試行を押してください。 予想どおり、テストは失敗しました。

簡単な迂回が完了したので、テストを修正しましょう。

失敗したテストを確認すると、サーバーが500ステータスで応答していることがわかります。 したがって、テストでステータスを変更します。

さらに、 Postman Console で失敗した応答を表示すると、応答にcauseプロパティが含まれていることがわかります。 さらに、 cause プロパティには、文字列「値がありません」が含まれています。 それについてもテストできます。

pm.test("status is 500", () => pm.response.to.have.status(500) );
pm.test("no value present", () => 
  pm.expect(pm.response.json().cause).to.equal("No value present"));

7.5. フルコレクションの実行

すべてのリクエストを追加したので、コレクションランナーで完全なコレクションを実行してみましょう。

すべてが計画どおりに進んだ場合、9つのテストが成功するはずです。

8. コレクションのエクスポートとインポート

Postmanはコレクションをプライベートなローカルの場所に保存していますが、コレクションを共有したい場合がありますこれを行うには、コレクションをJSONファイルにエクスポートします。

Export コマンドは、コレクションの省略記号メニュー内で使用できます。 JSONファイルのバージョンの入力を求められたら、最新の推奨バージョンを選択しましょう。

ファイルバージョンを選択すると、Postmanはエクスポートされたコレクションのファイル名と場所の入力を求めます。 たとえば、GitHubプロジェクト内のフォルダーを選択できます。

以前にエクスポートされたコレクションをインポートするには、[インポート]ボタンを使用します。 Postmanのメインウィンドウのツールバーにあります。 Postmanがファイルの場所の入力を求めるプロンプトが表示されたら、インポートするJSONファイルに移動できます。

Postmanはエクスポートされたファイルを追跡しないことに注意してください。 その結果、コレクションを再インポートするまで、Postmanは外部の変更を表示しません。

9. 結論

この記事では、Postmanを使用してRESTAPIの半自動テストを作成しました。 この記事はPostmanの基本的な機能の紹介として役立ちますが、その機能の表面をかじっただけです。 Postmanオンラインドキュメントは、より深く探求するための貴重なリソースです。

このチュートリアルで作成されたコレクションは、GitHubから入手できます。