はじめに
PostmanはgPRC用の専用クライアントUIがあります。また、通常のREST (HTTP UI)と同じように gRPC用のモックAPIテストのためのモックサーバーの利用ができます。本記事では、テスト用のgRPC APIサーバーを使用して、gRPCリクエスト設定とgRPC用モックサーバーの設定方法を簡単に紹介します。
* 記事を通じて、日本語モードのUIで解説します。
Postman gRPC クライアントとは?
PostmanのgRPCクライアントには、gRPCリクエストを呼び出してテストするためのさまざまな専用ツール、ビュー、コントロールが用意されています。
大きく次の4つのことができます:
- gRPCのサービス定義を管理できる。gRPCではインターフェース定義言語 (IDL)としてprotobufを使用
- gRPCリクエストの送信およびJavaScriptでテストができる
- gRPCサンプルのリクエストとレスポンスのペアを保存できる
- gRPC専用のモックサーバーを活用してモックAPIテストができる
ちなみに、PostmanではJSONインターフェースを使用して gRPCデータを読み書きできることが、大きな特徴です。ProtobufタイプとJSONのマッピングについてはこちらのページが参考になります。
Postman gRPCモックサーバーとは?
gRPCモックサーバーは、gRPC APIのエンドポイントへのリクエストのサンプルデータを返し、実際のAPIの動作をシミュレートします。APIが実装される前に、モックサーバーを使用して APIをテストできます。
なお、PostmanにはREST用モックサーバーがあります。REST用モックサーバーは、各リクエストにリンクされたサンプルレスポンスを返すことで、APIエンドポイントをシミュレートしますが、このgPRCモックサーバーは、このREST用モックサーバーとは独立した機能であり、実装も異なります。ご注意ください。
gRPCモックサーバーの詳細についてはこちらのページが参考になります。
gRPC APIサーバーの準備
テスト用のAPIサーバーを準備します。このAPIサーバーは、データストアにmongoDBを活用してgRPCでやりとりをするシンプルなCRUDサービスです。
サービス定義ファイル
後述のgRPCリクエスト設定で利用するAPIサーバーのサービス定義ファイル (.proto)ファイル(book.proto)は以下の通りです。
syntax = "proto3";
package book;
option go_package = "github.com/yokawasa/grpc-bookstore";
service Bookstore {
rpc PostBook(BookRequest) returns (BookResponse);
rpc GetBook(GetBookReq) returns (BookResponse);
rpc UpdateBook(BookRequest) returns (BookResponse);
rpc DeleteBook(GetBookReq) returns (DeleteBookRes);
rpc GetAllBooks(GetAllReq) returns (GetAllResponse);
}
message Book {
string bookID= 1;
string bookName = 2;
string category = 3;
string author = 4;
}
message BookRequest {Book book = 1;}
message BookResponse {Book book = 1;}
message GetBookReq {string id = 1;}
message DeleteBookRes {int64 deleted = 1;}
message GetAllReq {};
message GetAllResponse {repeated Book book = 1;}
APIサーバー クイックスタート
まずは、APIサーバーのコードをダウンロードします。
git clone https://github.com/yokawasa/grpc-bookstore.git
ダウンロードしたgrpc-bookstore
ディレクトリに移動して、docker compose up
コマンドでmongoDBサーバーを起動します
docker compose up -d
# 出力結果
[+] Running 3/3
✔ Network grpc-bookstore_default Created 0.0s
✔ Container mongo-server Started 0.2s
✔ Container grpc-bookstore-db-client-1 Started 0.3s
続いて、.envファイルを作成し、次のようにMONGO_IMAGEを定義します。なお、同ディレクトリにある.env.example
をコピペするでもOKです。
cat << EOF | tee .env
MONGO_IMAGE="mongodb://mongoadmin:secret@localhost:27017/"
EOF
それでは、テスト用のgRPCサーバーを起動します。
go run main.go
これで準備完了です。
ちなみに、全てのテストが終わったら次のようにmongoDBサーバーを停止することをお忘れなく。
docker compose down
gRPCリクエストの設定
それでは、Postmanアプリで、gRPCリクエストを設定していきます。
1. 新規リクエスト作成
Postmanアプリを立ち上げ、作業用のワークスペース(ここではMy Workspace
)のコレクションメニューをクリックします。そして、次のように新規
ボタンをクリックして、gRPCを選択して新規リクエストを作成します。
2. サービス定義 (Service Definitions) (.proto
)のインポート
新しいgRPCリクエスト設定画面にて、次の手順でサービス定義ファイル(book.proto)をインポートします。
-
[サービス定義]
タブに移動し、.proto ファイルのインポート
を選択 -
.proto
ファイルをローカルシステムからドラッグアンドドロップするか、Choose a File
を選択してファイルエクスプローラーを開いて指定します - ファイルを選択したら、
Import as API
インターフェースが表示されます -
Import as API
をクリックして、新しい APIに名前を付け、Create a New API
ボタンを選択します。ここではbookstore API
という名前をつけます
これで、このAPIをリクエスト内でサービス定義として使用できるようになります。以後サービス定義の設定の際は、ここで設定したAPI (bookstore API
)を選択します。
3. gRPCリクエストのサーバーアドレス、メソッド選択、メッセージ入力
PostBookというサービス呼び出しのためのリクエスト設定を行います。次の内容でリクエストを設定します。
- サーバーアドレスURL:
localhost:9090
- メソッド選択: ドロップダウンリストからPostBookメソッドを選択
- 送信するメッセージ: 次のJSONをメッセージに設定
{ "book": { "bookID": "12348", "bookName": "sample book3", "category": "comic", "author": "Test Test" } }
入力が完了したらリクエストを「保存」ボタンを押してgRPC - bookstore
という名前のコレクションに保存します。これでPostBookリクエストの設定は完了です。
同じように、GetBookサービスを呼び出すためのGetBookリクエストを設定を行います。次の内容でリクエストを設定します。
- サーバーアドレスURL:
localhost:9090
- メソッド選択: ドロップダウンリストからGetBookメソッドを選択
- 送信するメッセージ: 次のJSONをメッセージに設定
{ "id": "12348" }
入力が完了したら同様にリクエストを「保存」ボタンを押してgRPC - bookstore
という名前のコレクションに保存します。
4. リクエスト実行 / サービス呼び出し(Invoke)
3で設定したPostBookとGetBookリクエストを呼び出し(invoke)していきます。
まずは、PostBookリクエストで呼び出し(Invoke)
ボタンを押して、PostBookメソッドを呼び出します。実行すると、次のようにレスポンスが画面下半分のレスポンスエリアに出力されます。
同様に、GetBookリクエストも実行してみてください。PostBookと同じように、レスポンスが画面下半分のレスポンスエリアに出力されます。
RESTのクライアントI/Fとほぼ同じ使用感であることがお分かりいただけるかと思います。
gRPCモックサーバー設定
それでは、いよいよgRPCモックサーバーを設定していきます。
gRPCモックサーバー作成
PostBookリクエストを使ってgRPCモックサーバーを設定します。
まずは、PostBookのサービス定義のところが、さきほどAPIとしてインポートしたbookstore API
が選択されていることを確認してください。
次に、サーバーアドレスURL部分を、実体であるlocalhost:9090
ではなく、空にします。すると、次のようなドロップダウンが表示されので、そこでbookstore APIのモックURLを使う
を選択します。
これで、MockURL(<mock-name>.srv.pstmn.io
)自動生成されます。ここではg-25w1wwzn8xm1lr68wr40z60w7gm1xx.srv.pstmn.io(仮)という名前のMockURLが作成されてます。
たったこれだけです。
モックサーバーにリクエスト送信
モックサーバーにリクエスト送信してみます。下記のようにモックのデータが返却されます。
連続でリクエストを送信してみてください。モックサーバーにリクエストを送信するたびに、異なるランダム データが返却されることが確認できます。
また、GetBookリクエストでも、モックサーバーにリクエストを送信するたびにランダムなデータが返却されます。
レスポンスを固定にする方法
上述のように、gRPCモックサーバーでは、モックサーバーにリクエストを送信するたびにランダムなデータが返却されます。ただし、テストを作成している場合は、毎回同じ応答を取得する必要がある場合があるかと思います。ここでは、レスポンスを固定にする方法を紹介します。
レスポンスの固定にはメタデータのseedを利用します。各レスポンスのメタデータには、次のようにseedが含まれてます。
このseedは乱数となってますが、リクエストのメタデータ定義で固定のseedを渡すと、毎回同じレスポンスが返されるようになります。
さいごに
Postmanを使ったgRPCリクエストの設定やモックサーバーの活用方法を紹介しました。gRPCは高性能な通信プロトコルとして注目されていますが、Postmanの直感的なUIを活用することで、比較的敷居低くgRPCでのテストができます。また、gRPCモックサーバーを活用することで、開発中のgRPC APIだったり、継続的な実行シナリオにおいて、柔軟かつ安定的にテストができるようになります。ぜひ皆さんも試してみてください。