在开始使用 Firebase Local Emulator Suite 之前,请确保您已经创建了一个 Firebase 项目,设置了您的开发环境,并根据适用于您平台的Firebase 入门主题为您的平台选择并安装了 Firebase SDK: Apple 、 Android或网络。
原型和测试
Local Emulator Suite 包含多个产品模拟器,如Firebase Local Emulator Suite 简介中所述。您可以根据您在生产中使用的 Firebase 产品,根据您认为合适的情况,使用单个模拟器以及模拟器组合进行原型设计和测试。

对于本主题,为了介绍 Local Emulator Suite 工作流程,我们假设您正在开发一个使用典型产品组合的应用程序:Firebase 数据库和由对该数据库的操作触发的云函数。
在本地初始化 Firebase 项目后,使用 Local Emulator Suite 的开发周期通常包含三个步骤:
Prototype 功能与模拟器和 Emulator Suite UI 交互。
如果您使用的是数据库模拟器或 Cloud Functions 模拟器,请执行一次性步骤将您的应用程序连接到模拟器。
使用模拟器和自定义脚本自动化您的测试。
在本地初始化一个 Firebase 项目
curl -sL firebase.tools | bash
如果您还没有这样做,请将当前工作目录初始化为 Firebase 项目,按照屏幕上的提示指定您使用的是Cloud Functions和Cloud Firestore或Realtime Database :
firebase init
您的项目目录现在将包含 Firebase 配置文件、数据库的 Firebase 安全规则定义文件、包含云函数代码的functions
目录以及其他支持文件。
交互式原型
Local Emulator Suite 旨在让您快速制作新功能的原型,而该套件的内置用户界面是其最有用的原型制作工具之一。这有点像在本地运行 Firebase 控制台。
使用 Emulator Suite UI,您可以迭代数据库的设计、尝试涉及云功能的不同数据流、评估安全规则更改、检查日志以确认后端服务的执行情况等等。然后,如果您想重新开始,只需清除您的数据库并以新的设计理念重新开始。
当您启动 Local Emulator Suite 时,这一切都可用:
firebase emulators:start
为了制作我们假设的应用程序的原型,让我们设置并测试一个基本的云功能来修改数据库中的文本条目,并在 Emulator Suite UI 中创建和填充该数据库以触发它。
- 通过编辑项目目录中的
functions/index.js
文件,创建由数据库写入触发的云函数。用以下代码片段替换现有文件的内容。此函数侦听messages
层次结构中节点的更改,将节点的original
属性的内容转换为大写,并将结果存储在该节点的uppercase
属性中。 - 使用
firebase emulators:start
启动 Local Emulator Suite。 Cloud Functions 和数据库模拟器启动,自动配置为互操作。 - 通过
http://localhost:4000
在浏览器中查看 UI。端口 4000 是 UI 的默认端口,但请检查 Firebase CLI 输出的终端消息。注意可用模拟器的状态。在我们的例子中,云函数和实时数据库模拟器将运行。 - 在 UI 中,在“实时数据库”选项卡上,使用数据库内容编辑器控件创建一组节点,其中一个
messages
节点包含一个message1
节点,该节点又包含一个键设置为original
且值设置为test
的节点。这会触发我们的云功能。观察到一个新的uppercase
属性很快出现,其值为TEST
。 - 检查日志选项卡以确认您的函数在更新数据库时没有运行错误。
const functions = require('firebase-functions'); exports.makeUppercase = functions.database.ref('/messages/{pushId}/original') .onCreate((snapshot, context) => { const original = snapshot.val(); console.log('Uppercasing', context.params.pushId, original); const uppercase = original.toUpperCase(); return snapshot.ref.parent.child('uppercase').set(uppercase); });
您可以轻松地在云功能代码和交互式数据库编辑之间进行迭代,直到获得您正在寻找的数据流,而无需触及应用程序内数据库访问代码、重新编译和重新运行测试套件。
将您的应用程序连接到模拟器
当您在交互式原型制作方面取得了良好进展并确定了设计后,您就可以使用适当的 SDK 将数据库访问代码添加到您的应用程序中。您将继续使用 Emulator Suite UI 中的数据库选项卡和功能日志选项卡来确认您的应用程序的行为是正确的。
请记住,Local Emulator Suite 是一个本地开发工具。写入您的生产数据库不会触发您在本地制作原型的功能。
要切换到让您的应用写入数据库,您需要将测试类或应用内配置指向实时数据库模拟器。
Kotlin+KTX
// 10.0.2.2 is the special IP address to connect to the 'localhost' of // the host computer from an Android emulator. val database = Firebase.database database.useEmulator("10.0.2.2", 9000);
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of // the host computer from an Android emulator. FirebaseDatabase database = FirebaseDatabase.getInstance(); database.useEmulator("10.0.2.2", 9000);
迅速
// In almost all cases the ns (namespace) is your project ID. let db = Database.database(url:"http://localhost:9000?ns=YOUR_DATABASE_NAMESPACE")
Web version 9
import { getDatabase, connectDatabaseEmulator } from "firebase/database"; const db = getDatabase(); if (location.hostname === "localhost") { // Point to the RTDB emulator running on localhost. connectDatabaseEmulator(db, "localhost", 9000); }
Web version 8
var db = firebase.database(); if (location.hostname === "localhost") { // Point to the RTDB emulator running on localhost. db.useEmulator("localhost", 9000); }
使用自定义脚本自动化测试
现在是最后一个整体工作流程步骤。一旦您对应用程序内的功能进行了原型设计并且它在您的所有平台上看起来都很有前途,您就可以转向最终实施和测试。对于单元测试和 CI 工作流程,您可以使用exec
命令在一次调用中启动模拟器、运行脚本测试和关闭模拟器:
firebase emulators:exec "./testdir/test.sh"
更深入地探索各个模拟器
现在您已经了解了基本的客户端工作流程,您可以继续了解套件中各个模拟器的详细信息,包括如何将它们用于服务器端应用程序开发:
- 将身份验证模拟器添加到您的原型制作工作流程
- 深入了解实时数据库模拟器功能
- 深入了解 Cloud Storage for Firebase 模拟器功能
- 深入了解 Cloud Firestore 模拟器功能
- 将您的应用程序连接到 Cloud Functions 模拟器
- 使用 Extensions 模拟器评估 Firebase Extensions,同时最大限度地降低计费成本
接下来是什么?
请务必阅读与上面链接的特定仿真器相关的主题。然后:
- 如需一组精选的视频和详细的操作示例,请关注Firebase Emulators Training Playlist 。
- 研究涉及安全规则测试和 Firebase 测试 SDK 的高级用例:测试安全规则 (Cloud Firestore) 、测试安全规则(实时数据库)和测试安全规则(Cloud Storage for Firebase) 。