Help us understand the problem. What is going on with this article?

Go + Firestore (サーバー側) でローカルエミュレーターを使ってテストする

要約

  • Cloud Firestore のローカルエミュレーターは Go でも使える
  • gcloud beta emulators firestore start した後に環境変数 FIRESTORE_EMULATOR_HOST をセットするだけ

きっかけ

Firebase の超便利なデータストアサービス Cloud Firestore 、ついにGAになって東京リージョンもきて最近熱いサービスです!

しかし、クラウド系のサービスはローカル開発やテストをしたいときにどうやってやるか悩みがちです。大抵次のどちらかになる印象です。

  • ローカルで起動できるエミュレーターなどを使う
  • テスト専用のクラウドリソースを作っておいて、毎回そこに接続する

Cloud Firestore にはローカルエミュレーターがある

幸い Firestore にはローカルエミュレーターがあります。google-cloud-jpにわかりやすい記事があがっているので、こちらも参照するとよいでしょう。

Firestore ローカルエミュレーターを試してみた。 – google-cloud-jp – Medium

Node.js しか対応してない・・・?

しかし、公式ドキュメントを読んでみると…

https://firebase.google.com/docs/firestore/security/test-rules-emulator?hl=ja#before_you_run_the_emulator

現在エミュレータをサポートしている唯一の SDK は Node.js SDK です。エミュレータとのやりとりを容易にするために、@firebase/testing モジュールを用意しました。

Node.js 以外のランタイムでは使えなさそうです。残念ですね。

Go でもローカルエミュレーターが使える

自分は最初 Go をつかって Firestore をサーバー側から操作するプログラムを書いてたので、「Node.js しか使えないのか…残念だなぁ」と思いました。

しかし、Go のライブラリのドキュメントを読んでいると…

https://godoc.org/cloud.google.com/go/firestore

This package supports the Cloud Firestore emulator, which is useful for testing and development. Environment variables are used to indicate that Firestore traffic should be directed to the emulator instead of the production Firestore service.

To install and run the emulator and its environment variables, see the documentation at https://cloud.google.com/sdk/gcloud/reference/beta/emulators/firestore/. Once the emulator is running, set FIRESTORE_EMULATOR_HOST to the API endpoint.

Node.js だけではなくて、Go でも使えるじゃん!!!!!

image.png

使い方

Go のドキュメントに書いてある通りです。 gcloud beta emulators firestore start で指定のポート番号でローカルエミュレーターを立ち上げできます。

$ gcloud beta emulators firestore start --host-port=localhost:8812

Executing: ../google-cloud-sdk/platform/cloud-firestore-emulator/cloud_firestore_emulator start --host=localhost --port=8812
[firestore] API endpoint: http://localhost:8812
[firestore] If you are using a library that supports the FIRESTORE_EMULATOR_HOST environment variable, run:
[firestore] 
[firestore]    export FIRESTORE_EMULATOR_HOST=localhost:8812
[firestore] 
[firestore] Dev App Server is now running.
[firestore] 

あとは、↑の出力にも書かれている通り、環境変数 FIRESTORE_EMULATOR_HOST にセットしてあげると、Go の Firestore ライブラリはエミュレーターの方につなぎにいくようになります。

package main

import (
    "context"
    "firebase.google.com/go"
    "log"
)

func main() {
    ctx := context.Background()

    // firebase の認証情報は何も指定しなくてOK
    app, err := firebase.NewApp(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }

    store, err := app.Firestore(ctx)
    if err != nil {
        log.Fatal(err)
    }
    doc, _, err := store.Collection("users").Add(ctx, map[string]interface{}{
        "name": "hello",
    });
    if err != nil {
        log.Fatal(err)
    }
    println(doc.ID)
}

これでテスト専用の Firestore を作らなくても、気軽にテストが実行できる環境ができました。便利ですね! :smile:

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした