masalibの日記

システム開発、運用と猫の写真ブログです

Firebase入門 Cloud Functionsをエミュレータで実行

テストしていないコードをアップしてサービスを落とした人がいます。

そう、です

笑えないですが、事実です。 一昔前、Cloud Functionsは本番しか環境がなかったのですが エミュレータがリリースされました。 ローカル環境でじっくりテストした内容を本番にアップする事ができるようになりました。 Google先生のマニュアルにも記載されています

Firebase Local Emulator Suite を使用すると、Firebase プロジェクトにデプロイする代わりにローカルマシンでアプリをビルドしてテストできます。開発中にローカルテストを行うことを強くおすすめします。その理由の 1 つとしては、本番環境でコストを発生させる可能性があるコーディング エラーのリスク(無限ループなど)が低下するためです。
https://firebase.google.com/docs/functions/get-started?authuser=0#emulate-execution-of-your-functions
より引用

無限ループとか普通にやっていれば気がつくかも知れないのですが、関数を大量に発行させて ありえない金額を請求された人もいます。

gigazine.net

できる限りはローカルでテストして本番UPしたいです。

この記事はReact Firebase入門シリーズです 1-1-1・ Firebase初期設定とFirebaseAuthのSignUp
1-1-2・ 「react-hook-form」を入れてみた
1-1-3・ AuthのSignUpの通信エラー対応
1-2 ・ FirebaseAuthのログイン処理
1-3 ・ FirebaseAuthのログイン認証とログアウト処理
1-4 ・ FirebaseAuthのパスワード初期化処理
1-5 ・ FirebaseAuthのメールアドレスの有効化
1-6 ・ FirebaseAuthのメールアドレスとパスワード変更
1-7 ・ FirebaseAuthの表示名変更
1-8 ・ FirebaseAuthの拡張項目追加
1-9-1 ・ FirebaseAuthのTwitter認証
1-9-2 ・ FirebaseAuthのTwitter認証(既存ユーザー向け)と解除
1-10 ・ FirebaseAuthのGoogle認証(既存ユーザー含む)と解除 2-1・ FirebaseStorageのファイルアップ:基礎
2-2・ FirebaseStorageのファイルアップ前に画像の切り抜き
2-3・ FirebaseStorageのファイルアップの移動
3-1・FirestoreのCRUD
3-2・Firestoreのデータ取得補足
3-3・Firestoreのページネーション処理
3-4・Firestoreのコレクション(テーブル)のJOIN
5・ FirebaseのHosting(デプロイ)
6-1・ Cloud FunctionsでHello,world
6-2・ Cloud Functions(エミュレータ)でHello,world 今ここ
よかったら他の記事も見てください。

エミュレータのインストール

インストールは別の記事でやっているのでそちらを参考にしてください masalib.hatenablog.com

エミュレータでのテスト

実はエミュレータが立ち上がるとfunctionのフォルダは監視されています。 その状態でプログラムを修正します

const functions = require('firebase-functions');

exports.helloWorld = functions.https.onRequest((request, response) => {
    functions.logger.info("Hello World logs!", {structuredData: true});
    response.send("Hello World");
})

+ exports.helloWorld2 = functions.https.onRequest((request, response) => {
+     functions.logger.info("Hello2 World logs!", {structuredData: true});
+     functions.logger.info("emulator test2");
+     response.send("Hello World2");
+ })

ファイルの保存をするとエミュレータ側のログに以下がながれます

+  functions[helloWorld2]: http function initialized (http://localhost:5001/learn-firebase-masalib/region/helloWorld2).

このURLコピーしてをCURLで叩く

curl http://localhost:5001/learn-firebase-masalib/region/helloWorld2
# Hello World2

ログに出力されます

i  functions: Beginning execution of "helloWorld2"
>  {"structuredData":true,"severity":"INFO","message":"Hello2 World logs!"}
>  {"severity":"INFO","message":"emulator test2"}
i  functions: Finished "helloWorld2" in ~1s

感想

修正してデプロイしてテストするのだと時間がかかるが、エミュレータなら一瞬でテストでテストできる。 開発効率が全然違うのでエミュレータの導入は必須だね