API ワークフローをノーコードでグラフィカルに構築する新機能「Postman Flows」を試してみた

2022.04.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、MAD事業部のきんじょーです。

REST APIの開発をしていて実際に叩いてテストをする際、みなさんは何のツールを使っていますか?
OpenAPIの定義を読み込んですぐに叩け、環境毎の変数の管理が楽なので、私はPostmanを使うことが多いです。

つい先日、Postmanを開くと「Flows」という見慣れないアイコンが追加されていることに気づきました。試してみるとグラフィカルに複数のAPIを組み合わせたワークフローを構築できる便利な機能だったので、この記事で「Postman Flows」を紹介したいと思います。

Postman Flows とは

README.mdを見ると以下のような説明があります。

Postman Flows は API を論理的に接続するための、API ワークフロービルダーです。Flows を使ってリクエストを連鎖させたり、データを処理したり、実際のワークフローを Postman のワークスペース内で作成できます。

ref: postmanlabs/postman-flows

たとえば、シナリオベースのテストで以下のようなフローを組もうとすると、何かしらのコードを書く必要があります。

  • あるAPIの結果を元に別のAPIを呼ぶ
  • APIの結果を元に条件分岐や繰り返し処理を行う
  • 複数のAPIの結果をマージして別のAPIを呼ぶ

「Postman Flows」を使うと、このような処理を直感的なGUIを用いてノーコードで組むことができます。 現時点ではベータ版で、無料で使用できます。

やってみる

テスト用APIの準備

テスト用のAPIにPet Storeを使用します。 swagger.jsonをダウンロードし、Postmanへインポートします。 import-collections-from-swagger

ペットの登録を試しに叩いてみます。 send-post-request

200応答が返ってきました。テスト用APIの準備はこれで完了です。

簡単なフローの構築

まずは上記と同じく、ペット登録APIを叩くだけのフローを作成し、GUIの使い方を確認します。

新規フローの作成

左のメニューからFlowsを選択し、新規フローを作成します。 create-new-flow

ブロックの追加

Startの+からAPIへリクエストを送信するSend Requestと、ターミナルへ結果を出力するTerminalのブロックを追加します。下にある+ Blockからも自由にブロックの追加が可能です。

実行結果の確認

Startでフローを実行します。 execute-flow

実行結果はコンソールとターミナルから確認できます。

コンソールではAPIのリクエストとレスポンスの情報を確認できます。 console-log

ターミナルではTerminalブロックに接続して出力したログが確認できます。 ロググループを設定して、ログを出力するグループを分けることも可能です。 terminal-log

ブロックについて

操作方法

block

  • 入力・出力
    • 入力の+へ前のブロックから矢印で繋ぎ、出力の+から後続ブロックへの出力を生やします。
    • 入出力のポートの種類や対応する型はブロックにより違います。
  • 簡易設定
    • ブロックの設定を入力します。
    • SendRequestの場合、叩くAPIのパスと、使用するEnvironment(変数のセット)、変数に割り当てる値を指定します。
  • 詳細設定
    • ウィンドウが開き、より詳細にブロックの設定が可能です。
  • 後続ブロックの指定
    • 処理が完了した後に発火させる、次のブロックを指定します。
    • 出力のポートと違い、後続ブロックに対して出力結果は渡されないため、実行タイミングだけを制御したい場合に使えそうです。

ブロックの種類

各ブロックの説明と入出力を以下にまとめました。

ブロック名 説明 入力 出力
Check 入力を検証しパスした場合のみ後続へデータを渡します。検証対象のPrimaryと検証時に使用するSecondaryの2つのデータを渡すことができます。 Primary
Secondary
Primary
Concatenate 2つのListを受け取り1つのListに合体して返します。 2つのList 1つのList
Condition 入力を検証し、trueとfalseの場合で処理を分岐します。 Data Accept
Reject
Create Data 自由にデータを作成・変更できます。 Data(任意) Data
Create Durables Flowsの中で扱う変数のことをDurablesと呼びます。このブロックで変数の定宣言や値の割当ができます。 Data 変数に値がセットされる
Delay 指定したミリ秒の間待機し、受け取ったデータを後続処理へ流します。 Data Data
For Each 入力で受け取ったListの要素数分繰り返します。 List Listの要素
Group By 入力で受け取ったListの内容で、要素をグルーピングします。 List Group
List Top Listから最初の1件を取り出します。 List 最初の1要素
Merge Sourceに入力された値をTargetにマージします。 Source
Target
MergeされたData
Send Request APIへリクエストを送信します。出力はAPIのレスポンスと結果検証用のTestがあります。 Durables Response
Test
Terminal 入力を画面右側のターミナルへ出力します。 Data Terminalのログ
Test Summary テスト結果を集計し、テスト結果のレポートを出力します。 Test Testレポート

ハマったポイント

APIのレスポンスを解釈するためには、APIにexampleが設定されている必要があります。

たとえば、Send Requestの結果をCheckで検証しようとする場合、 check-detail

APIのexampleが設定されていない状態だと、APIのレスポンスを解釈できていないため、bodyはstringの扱いになっています。 この状態だとレスポンスの型がわからないため、後続ブロックでレスポンスの中身を取り出して扱うことができません。 response-unrecognized

このような場合、1度APIを実行しexampleを保存する必要があります。 save-response

するとAPIのレスポンスの型が解釈され、後続のブロックで使用できるようになります。 response-recognized

テストシナリオを組んでみる

使い方がなんとなく掴めたので、以下のもう少し複雑なシナリオを組んでみます。

  1. ユーザーのログイン
  2. ペットの登録
  3. 登録したペットの取得
  4. 1から3の処理を3回繰り返して終了する

 execute-complex-flow

2から3は登録した情報をもとに次のAPIを叩くため、本来であればSend Requestの間にCreate Durablesを挟んで変数を渡す必要がありますが、Mockを叩いているので省略しました。
4の繰り返し処理については、最初のCreate Durablesでループカウンターを宣言し、APIのリクエストが終わったタイミングでCreate Durablesを使いインクリメントし、指定回数に満たない場合はConditionsでフローの最初に飛ばしています。

簡単にAPIのワークフローが作成できました

このように「Postman Flows」を使用することで、直感的なインタフェースを用いて、複数のAPIを組み合わせて実行するワークフローをノーコードで作成することができました。

最後にこのサービスの向き不向きをまとめて終わりたいと思います。

向いているケース

あまり複雑ではないものをノーコードで作りたい時に向いています。

  • シナリオベースのテストの自動化
  • 複数のAPIを組み合わせて大量のテストデータ作成

今後のロードマップでは、作成したフローのエクスポートが予定されていました。実装されれば以下も可能になるのを期待しています。

  • 定期実行してAPIの外形監視(未実装?)
  • CI/CD環境でAPIのE2Eテスト(未実装?)

向かないケース

  • 複雑な分岐や繰り返し処理や、大規模なワークフロー構築
    • GUIでフローを組んでプログラミングをするサービスについて、初回の構築の容易さと保守性は反比例すると考えています。
    • 大規模で複雑になると可読性が著しく下がったり、複数人で開発を行う際のソース管理や構成管理のコストが高くついてくるので、素直にプログラミング言語で実装すべきです。
  • 本番ワークロード
    • 現時点でベータ版のため、開発途中のサービスです。
    • フローを切断するとDurablesの型が認識されないなど、いくつか不安定な挙動を発見しました。
  • 負荷テスト
    • 一連のAPI実行のシナリオを組むことは可能ですが、想定最大同時リクエスト数に向けて指定した増分でリクエストを増やし、一定の期間継続して負荷をかけるといった、負荷テスト特有のシナリオには対応していません。 負荷テストにはLocustなどを利用しましょう。

この記事で少しでも興味を持っていただいた方は、是非「Postman Flows」を試してみてください。

以上。MAD事業部のきんじょーでした。

参考

以下を参考にさせていただきました。