emahiro/b.log

日々の勉強の記録とか育児の記録とか。

単体テストのために local で gRPC サーバーを起動する

Overview

タイトルのとおりです。
このエントリは local で簡単に gRPC サーバーを起動して GCP のライブラリの簡易的な動作検証環境を整えたときの備忘録になります。
モチベーションとしては、単体テストと書いてますが、主に GCP のライブラリの動作を local で簡単にエミュレートしたいとき、GCP のライブラリには gRPC サーバーがセットで必要なことが多く、良く HTTP サーバーのエミュレートで利用される httptest package がそのまま利用できません。
リモート環境にデプロイすることなく local で簡易的な動作チェックが出来ると開発も捗るのでその手順を記載します。

local での起動手順

listener, err := net.Listen("tcp", "localhost:0")
if err != nil {
    t.Fatal(err)
}
ts := grpc.NewServer()
go func() {
    if err := ts.Serve(listener); err != nil {
        panic(err)
    }
}()

これだけです。
※ port を 0 にするとその時空いている適当な port を利用してくれます。

実はこれと同じように gPRC のサーバーを起動するサンプルコードは GCP のライブラリの internal の中に testutil としてコードは公開されていました(これをあとから知りました...)

github.com

local で gRPC サーバーを起動して GCP のライブラリの挙動をテストするときはこのサーバーの実装をまるっと fork してくるほうが早いかもしれません。

また grcp-ecosystem というリポジトリがあって、ここで簡易的な local での gRPC サーバーの立ち上げ方も書かれているのでこういうとこを見て実装方法を調べるのは良いですね。 -> https://github.com/grpc-ecosystem/grpc-cloud-run-example/blob/master/golang/server/main.go