Postmanコレクションを使用したWeb APIのテスト

  • DevOps

  • link:/category/testing/ [テスト]

 1. 前書き

Web APIを徹底的にテストするには、APIのエンドポイントにアクセスするための何らかの種類のWebクライアントが必要です。 * Postmanは、サービス外部からHTTPリクエストを行うことでWeb APIを実行するスタンドアロンツールです*。
Postmanを使用する場合、テストのためだけにHTTPクライアントインフラストラクチャコードを記述する必要はありません。 代わりに、コレクションと呼ばれるテストスイートを作成し、PostmanがAPIと対話できるようにします。
このチュートリアルでは、REST APIをテストできるPostmanコレクションを作成する方法を説明します。

2. セットアップ

コレクションを始める前に、環境をセットアップする必要があります。

* 2.1。 Postman *のインストール

Postmanは、Linux、Mac、およびWindowsで利用可能です。 このツールは、https://www.getpostman.com/downloads/ [Postman Webサイト]からダウンロードしてインストールできます。
スプラッシュスクリーンを閉じた後、ユーザーインターフェイスが表示されます。
link:/uploads/postman-startup.png []

* 2.2。 サーバーの実行*

  • Postmanは、リクエストを処理するためにライブHTTPサーバーが必要です*。 このチュートリアルでは、以前のBaeldungプロジェクト_spring-boot-rest、_を使用します。これはhttps://github.com/eugenp/tutorials/tree/master/spring-boot-rest[GitHub]で入手できます。

    タイトルから推測できるように、_spring-boot-rest_はSpring Bootアプリケーションです。 Mavenゴール_install_でアプリをビルドします。 構築したら、カスタムMavenゴール_spring-boot:run_でサーバーを起動します。
    サーバーが実行されていることを確認するために、ブラウザーで次のURLにアクセスできます。
http://localhost:8082/spring-boot-rest/auth/foos
このサービスは、インメモリデータベースを使用します。 サーバーが停止すると、すべてのレコードが消去されます。

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

Postmanのコレクションは、一連のHTTP要求です。 Postmanは、ヘッダーやメッセージ本文など、リクエストのあらゆる側面を保存します。 そのため、*要求を半自動テストとして順番に実行できます*。
新しいコレクションを作成することから始めましょう。 _New_ボタンのドロップダウン矢印をクリックして、_Collection_を選択できます。
link:/uploads/postman-new-menu-216x300.png []
_CREATE A NEW COLLECTION_ダイアログが表示されたら、コレクションに「_foo API test_」という名前を付けることができます。 最後に、[作成]ボタンをクリックして、新しいコレクションが左側のリストに表示されることを確認します。
link:/uploads/collection-created-276x300.png []
コレクションが作成されたら、カーソルをその上に置いて2つのメニューボタンを表示できます。 矢印ボタンは、_Collection Runner_へのアクセスを提供するプルライトパネルを開きます。 逆に、省略記号ボタンをクリックすると、コレクションに対する多数の操作を含むドロップダウンメニューが開きます。

4. POSTリクエストの追加

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

空のコレクションができたので、APIにヒットするリクエストを追加しましょう。 具体的には、POSTメッセージをURI _ / auth / foos._に送信します。これを行うには、コレクションの省略記号メニューを開き、_Add Request ._ *を選択します。
_SAVE REQUEST_ダイアログが表示されたら、「_ add a_ foo」などのわかりやすい名前を付けましょう。 次に、ボタン_Save to foo API test_をクリックします。
リクエストが作成されると、コレクションが_one request_を示していることがわかります。 ただし、コレクションが展開されていない場合、リクエストはまだ表示されません。 その場合、コレクションをクリックして展開できます。
これで、コレクションの下に新しいリクエストが表示されます。 デフォルトでは、新しいリクエストはHTTP GETであることがわかりますが、これは望んでいないものです。 次のセクションで修正します。
link:/uploads/new-request-294x300.png []

* 4.2。 リクエストの編集*

リクエストを編集するには、リクエストをクリックして、リクエストエディタタブに読み込みます。
link:/uploads/postman9-100x57.png%20100w []
リクエストエディタには多数のオプションがありますが、今のところ必要なのはそのうちのいくつかです。
まず、ドロップダウンを使用して、メソッドをGETからPOSTに変更します。
第二に、URLが必要です。 メソッドのドロップダウンの右側には、リクエストURLのテキストボックスがあります。 だから、今それを入力しましょう:
http://localhost:8082/spring-boot-rest/auth/foos
最後のステップは、メッセージ本文を提供することです。 URLアドレスの下には、タブヘッダーの行があります。 _Body_タブヘッダーをクリックして、ボディエディターに移動します。
[_Body_]タブのテキスト領域のすぐ上に、ラジオボタンの列とドロップダウンがあります。 これらは、リクエストのフォーマットとコンテンツタイプを制御します。
*当社のサービスはJSONデータを受け入れるため、[_ raw_]ラジオボタンを選択します*。 *右側のドロップダウンで、_JSON(application / json)_コンテンツタイプを適用します*。
エンコードとコンテンツタイプが設定されたら、JSONコンテンツをテキスト領域に追加します。
{
    "name": "Transformers"
}
最後に、_Ctrl-S_を押すか、_Save_ボタンを押して、変更を保存してください。 [保存]ボタンは、[送信]ボタンの右側にあります。 保存すると、左側のリストでリクエストがPOSTに更新されていることがわかります。
link:/uploads/post-method-1024x262.png []

5. リクエストの実行

* 5.1。 単一のリクエストの実行*

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

    link:/uploads/post-response.png []
    結果を調べてみましょう。 具体的には、ヘッダーバーでは、_201 Created_ステータスでリクエストが成功したことがわかります。 さらに、応答本文は、_Transformers_レコードが1のIDを受け取ったことを示しています。

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

  • _Send_ボタンとは対照的に、コレクションランナーはコレクション全体を実行できます*。 コレクションランナーを起動するには、カーソルを_foo API test_コレクションの上に置いて、右矢印をクリックします。 右側のパネルに_Run_ボタンがあるので、クリックしてみましょう。

    link:/uploads/collection-pull-right.png []
    _Run_ボタンをクリックすると、コレクションランナーが新しいウィンドウで開きます。 コレクションから起動したため、ランナーは既にコレクションに初期化されています。
    link:/uploads/postman1-100x74.png%20100w []
    コレクションランナーは、テストの実行に影響するオプションを提供しますが、この演習では必要ありません。 一番下の_Run foo API test_ボタンに直接移動して、それをクリックします。
    コレクションを実行すると、ビューが_Run Results_に変わります。 このビューでは、*成功の場合は緑色、失敗の場合は赤色でマークされたテストのリストが表示されます*
    リクエストが送信されたにもかかわらず、ランナーはテストがゼロで失敗したことを示します。 これは、リクエストにテストをまだ追加していないためです。
    link:/uploads/postman2-1-100x32.png%20100w []

6. 応答のテスト

* 6.1。 リクエストへのテストの追加*

テストを作成するために、POSTメソッドを作成したリクエスト編集パネルに戻りましょう。 URLの下にある_Tests_タブをクリックします。 それを行うと、テストパネルが表示されます。
link:/uploads/postman3-100x43.png%20100w []
[テスト]パネルで、サーバーから応答を受信したときに実行されるJavaScriptを作成します。
  • Postmanは、要求と応答へのアクセスを提供する組み込み変数を提供します*。 さらに、_require()_構文を使用して、多数のJavaScriptライブラリをインポートできます。

    このチュートリアルではカバーできないほど多くのスクリプト機能があります。 ただし、https://learning.getpostman.com/docs/postman/scripts/test_scripts [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_または_Save_ボタンで変更を保存します。

* 6.2。 テストの実行*

テストができたので、リクエストを再度実行しましょう。 [送信]ボタンを押すと、応答パネルの[テスト結果]タブに結果が表示されます。
link:/uploads/postman4-100x24.png%20100w []
同様に、コレクションランナーにテスト結果が表示されるようになりました。 具体的には、左上のサマリーには、更新された_passed_および_failed_の合計が表示されます。 概要の下には、各テストとそのステータスを示すリストがあります。
link:/uploads/postman5-100x27.png%20100w []

* 6.3。 Postmanコンソールの表示*

_Postman Console_は、スクリプトを作成およびデバッグするための便利なツールです。 _View_メニューの下に、アイテム名_Show Postman Console_のコンソールがあります。 起動すると、コンソールが新しいウィンドウで開きます。
*コンソールが開いている間、すべてのHTTPリクエストとレスポンスを記録します*。 さらに、スクリプトが_console.log()、_を使用する場合、_Postman Console_はこれらのメッセージを表示します:
link:/uploads/postman6-100x76.png%20100w []

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リクエストに「_get a foo_」と名前を付けましょう。
GETリクエストのURLは次のとおりです。
http://localhost:8082/spring-boot-rest/auth/foos/{{id}}
このURLでは、POSTリクエスト中に以前に設定した_id_変数を参照しています。 したがって、GET要求は、POSTによって作成された同じインスタンスを取得する必要があります。
スクリプトの外部に表示される変数は、二重中括弧構文_ \ {\ {id}} _を使用して参照されます。
GETリクエストの本文がないため、_Tests_タブに直接進みましょう。 テストは似ているため、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。 削除リクエストの追加*

次に、サーバーから_foo_オブジェクトを削除するDELETEリクエストを追加します。
GETの後に新しいリクエストを追加し、そのメソッドをDELETEに設定することから始めます。 このリクエストに「_delete a foo_」という名前を付けることができます。
削除のURLはGET URLと同じです:
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_を選択します。
重複したリクエストには、名前に「コピー」という単語が追加されます。 混乱を避けるために、名前を「_verify delete_」に変更しましょう。 _Rename_オプションを使用するには、リクエストを右クリックします。
デフォルトでは、複製リクエストは元のリクエストの直後に表示されます。 そのため、DELETEリクエストの下にドラッグする必要があります。
最後のステップは、テストを修正することです。 ただし、その前に、失敗したテストを確認する機会を設けましょう。
GETリクエストをコピーし、DELETEの後に移動しましたが、テストはまだ更新していません。 DELETE要求でオブジェクトが削除されているはずなので、テストは失敗するはずです。
すべてのリクエストを保存してから、コレクションランナーで_Retry_を押してください。 予想どおり、テストは失敗しました。
link:/uploads/postman7-100x59.png%20100w []
簡単な迂回が完了したので、テストを修正しましょう。
失敗したテストを確認すると、サーバーが500ステータスで応答していることがわかります。 したがって、テストでステータスを変更します。
さらに、失敗した応答を_Postman Console_で表示すると、応答に_cause_プロパティが含まれていることがわかります。 さらに、_cause_プロパティには、文字列「_No value present_」が含まれています。 それについてもテストできます。
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 完全なコレクションの実行*

すべてのリクエストを追加したので、コレクションランナーで完全なコレクションを実行しましょう。
link:/uploads/postman8-100x57.png%20100w []
すべてが計画どおりに進んだ場合、9つのテストが成功するはずです。

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

  • Postmanがコレクションを個人のローカルな場所に保存している間、コレクションを共有したい場合があります*。 それを行うために、コレクションをJSONファイルにエクスポートします

    _Export_コマンドは、コレクションの省略記号メニュー内で使用できます。 JSONファイルのバージョンを求められたら、最新の推奨バージョンを選択しましょう。
    ファイルのバージョンを選択すると、Postmanはエクスポートされたコレクションのファイル名と場所の入力を求めます。 たとえば、GitHubプロジェクト内のフォルダーを選択できます。
    *以前にエクスポートされたコレクションをインポートするには、_Import_ボタンを使用します*。 メインのPostmanウィンドウのツールバーにあります。 Postmanがファイルの場所を求めるプロンプトを表示したら、インポートするJSONファイルに移動できます。
    Postmanはエクスポートされたファイルを追跡しないことに注意してください。 その結果、コレクションを再インポートするまで、Postmanは外部の変更を表示しません。

9. 結論

この記事では、Postmanを使用してREST APIの半自動テストを作成しました。 この記事はPostmanの基本機能の紹介として機能しますが、その機能の表面をかろうじて傷つけただけです。 https://learning.getpostman.com/docs/postman/launching_postman/installation_and_updates/[Postmanオンラインドキュメント]は、詳細な調査のための貴重なリソースです。
このチュートリアルで作成されたコレクションは、https://github.com/eugenp/tutorials/tree/master/spring-boot-rest [GitHub]で入手できます。