获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

连接您的应用并开始原型设计

在开始使用 Firebase Local Emulator Suite 之前,请确保您已经创建了一个 Firebase 项目,设置了您的开发环境,并根据适用于您平台的Firebase 入门主题为您的平台选择并安装了 Firebase SDK: AppleAndroid网络

原型和测试

Local Emulator Suite 包含多个产品模拟器,如Firebase Local Emulator Suite 简介中所述。您可以根据您在生产中使用的 Firebase 产品,根据您认为合适的情况,使用单个模拟器以及模拟器组合进行原型设计和测试。

Firebase 数据库与函数模拟器之间的交互
数据库和云功能模拟器作为完整本地模拟器套件的一部分。

对于本主题,为了介绍 Local Emulator Suite 工作流程,我们假设您正在开发一个使用典型产品组合的应用程序:Firebase 数据库和由对该数据库的操作触发的云函数。

在本地初始化 Firebase 项目后,使用 Local Emulator Suite 的开发周期通常包含三个步骤:

  1. Prototype 功能与模拟器和 Emulator Suite UI 交互。

  2. 如果您使用的是数据库模拟器或 Cloud Functions 模拟器,请执行一次性步骤将您的应用程序连接到模拟器。

  3. 使用模拟器和自定义脚本自动化您的测试。

在本地初始化一个 Firebase 项目

确保安装 CLI更新到其最新版本

curl -sL firebase.tools | bash

如果您还没有这样做,请将当前工作目录初始化为 Firebase 项目,按照屏幕上的提示指定您使用的是Cloud FunctionsCloud FirestoreRealtime Database

firebase init

您的项目目录现在将包含 Firebase 配置文件、数据库的 Firebase 安全规则定义文件、包含云函数代码的functions目录以及其他支持文件。

交互式原型

Local Emulator Suite 旨在让您快速制作新功能的原型,而该套件的内置用户界面是其最有用的原型制作工具之一。这有点像在本地运行 Firebase 控制台。

使用 Emulator Suite UI,您可以迭代数据库的设计、尝试涉及云功能的不同数据流、评估安全规则更改、检查日志以确认后端服务的执行情况等等。然后,如果您想重新开始,只需清除您的数据库并以新的设计理念重新开始。

当您启动 Local Emulator Suite 时,这一切都可用:

firebase emulators:start

为了制作我们假设的应用程序的原型,让我们设置并测试一个基本的云功能来修改数据库中的文本条目,并在 Emulator Suite UI 中创建和填充该数据库以触发它。

  1. 通过编辑项目目录中的functions/index.js文件,创建由数据库写入触发的云函数。用以下代码片段替换现有文件的内容。此函数侦听messages层次结构中节点的更改,将节点的original属性的内容转换为大写,并将结果存储在该节点的uppercase属性中。
  2.   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);
          });
      
  3. 使用firebase emulators:start启动 Local Emulator Suite。 Cloud Functions 和数据库模拟器启动,自动配置为互操作。
  4. 通过http://localhost:4000在浏览器中查看 UI。端口 4000 是 UI 的默认端口,但请检查 Firebase CLI 输出的终端消息。注意可用模拟器的状态。在我们的例子中,云函数和实时数据库模拟器将运行。
    我的形象
  5. 在 UI 中,在“实时数据库”选项卡上,使用数据库内容编辑器控件创建一组节点,其中一个messages节点包含一个message1节点,该节点又包含一个键设置为original且值设置为test的节点。这会触发我们的云功能。观察到一个新的uppercase属性很快出现,其值为TEST
    我的形象我的形象
  6. 检查日志选项卡以确认您的函数在更新数据库时没有运行错误。

您可以轻松地在云功能代码和交互式数据库编辑之间进行迭代,直到获得您正在寻找的数据流,而无需触及应用程序内数据库访问代码、重新编译和重新运行测试套件。

将您的应用程序连接到模拟器

当您在交互式原型制作方面取得了良好进展并确定了设计后,您就可以使用适当的 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"

更深入地探索各个模拟器

现在您已经了解了基本的客户端工作流程,您可以继续了解套件中各个模拟器的详细信息,包括如何将它们用于服务器端应用程序开发:

接下来是什么?

请务必阅读与上面链接的特定仿真器相关的主题。然后: