将您的应用连接到 Realtime Database 模拟器

在将您的应用连接到 Realtime Database 模拟器之前,请确保您了解 Firebase Local Emulator Suite 的整体工作流,而且已安装和配置 Local Emulator Suite 并已查看其 CLI 命令

选择一个 Firebase 项目

Firebase Local Emulator Suite 模拟的是单个 Firebase 项目的产品。

如需选择要使用的项目,请在启动模拟器之前,使用 CLI 在工作目录下运行 firebase use。或者,您也可以向每个模拟器命令传递 --project 标志。

Local Emulator Suite 支持模拟实际 Firebase 项目和演示项目。

项目类型 特性 与模拟器结合使用
实际项目

实际 Firebase 项目就是您创建和配置的项目(很可能是通过 Firebase 控制台创建和配置)。

实际项目具有实时资源,例如数据库实例、存储桶、函数或您为该 Firebase 项目设置的任何其他资源。

使用实际的 Firebase 项目时,您可以为任何或所有受支持的产品运行模拟器。

对于您未模拟的任何产品,您的应用和代码都将与实时资源(数据库实例、存储桶、函数等)交互。

演示项目

演示 Firebase 项目没有实际 Firebase 配置,也没有实时资源。通常可通过 Codelab 或其他教程来访问这些项目。

演示项目的 ID 带有 demo- 前缀。

使用演示 Firebase 项目时,您的应用和代码仅与模拟器交互。如果您的应用尝试与您没有为其运行模拟器的资源进行交互,该代码将失败。

我们建议您尽可能使用演示项目。演示项目具有以下优势:

  • 设置更简单,您无需创建 Firebase 项目也可运行模拟器
  • 安全性更强,就算您的代码意外调用了非模拟(生产环境)资源,也不可能发生数据更改、使用资源或产生费用
  • 提供更好的离线支持,无需访问互联网即可下载您的 SDK 配置。

对应用进行插桩 (instrument) 处理以便与模拟器通信

Android、Apple 平台和 Web SDK

按照以下步骤设置您的应用内配置或测试类,以便与 Realtime Database 进行交互。

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);
Swift
    // In almost all cases the ns (namespace) is your project ID.
let db = Database.database(url:"http://127.0.0.1:9000?ns=YOUR_DATABASE_NAMESPACE")

Web 模块化 API

import { getDatabase, connectDatabaseEmulator } from "firebase/database";

const db = getDatabase();
if (location.hostname === "localhost") {
  // Point to the RTDB emulator running on localhost.
  connectDatabaseEmulator(db, "127.0.0.1", 9000);
} 

Web 命名空间型 API

var db = firebase.database();
if (location.hostname === "localhost") {
  // Point to the RTDB emulator running on localhost.
  db.useEmulator("127.0.0.1", 9000);
} 

使用模拟器测试由 Realtime Database 事件触发的 Cloud Functions 函数无需进行额外设置。当 Realtime Database 和 Cloud Functions 模拟器都在运行时,它们会自动协同工作。

Admin SDK

设置 FIREBASE_DATABASE_EMULATOR_HOST 环境变量后,Firebase Admin SDK 会自动连接到 Realtime Database 模拟器:

export FIREBASE_DATABASE_EMULATOR_HOST="127.0.0.1:9000"

如果您的代码在 Cloud Functions 模拟器中运行,系统会在调用 initializeApp 时自动设置您的项目 ID 和其他配置。

如果您希望 Admin SDK 代码连接到在其他环境中运行的共享模拟器,则需要指定您使用 Firebase CLI 设置的同一项目 ID。您可以直接将项目 ID 传递给 initializeApp 或设置 GCLOUD_PROJECT 环境变量。

Node.js Admin SDK
admin.initializeApp({ projectId: "your-project-id" });
环境变量
export GCLOUD_PROJECT="your-project-id"

在两轮测试的间隙清空数据库

如需在两轮活动的间隙刷新 (flush) Realtime Database,您可以清除数据库引用。您可以使用此方法来代替简单地停止模拟器进程。

Kotlin+KTX
// With a DatabaseReference, write null to clear the database.
database.reference.setValue(null)
Java
// With a DatabaseReference, write null to clear the database.
database.getReference().setValue(null);
Swift
// With a DatabaseReference, write nil to clear the database.
    Database.database().reference().setValue(nil);

Web 模块化 API

import { getDatabase, ref, set } from "firebase/database";

// With a database Reference, write null to clear the database.
const db = getDatabase();
set(ref(db), null);

Web 命名空间型 API

// With a database Reference, write null to clear the database.
firebase.database().ref().set(null);

当然,您的代码应使用平台的异步事件处理功能等待关于刷新完成或失败的确认信息。

完成这样的步骤后,您就可以放心地对测试进行排序并触发函数,知道旧数据会在两轮运行的间隙得到清除,从而使用全新的基准测试配置。

导入和导出数据

借助数据库模拟器和 Cloud Storage for Firebase 模拟器,您可以从正在运行的模拟器实例中导出数据。定义要在单元测试或持续集成工作流中使用的基准数据集,然后将其导出以供团队共享。

firebase emulators:export ./dir

在测试中,当模拟器启动时,导入基准数据。

firebase emulators:start --import=./dir

您可以指示模拟器在关停时导出数据,方法是指定导出路径,或是直接使用传递给 --import 标志的路径。

firebase emulators:start --import=./dir --export-on-exit

这些数据导入和导出选项也适用于 firebase emulators:exec 命令。如需了解详情,请参阅模拟器命令参考文档

直观呈现安全规则活动

在完成原型设计和测试循环的过程中,您可以使用 Local Emulator Suite 提供的可视化工具和报告。

直观呈现规则评估结果

在向原型设计添加安全规则时,您可以使用 Local Emulator Suite 工具调试这些规则。

运行一系列测试后,您可以访问测试范围报告,其中显示了每条规则的评估结果。如需获取这些报告,请在模拟器运行时查询其上的公开端点。如需适用于浏览器的版本,请使用以下网址:

http://localhost:9000/.inspect/coverage?ns=<database_name>

这会将您的规则分解为表达式和子表达式,您可以将鼠标悬停在相应表达式上以了解更多信息(包括评估次数和返回的值)。如需这些数据的原始 JSON 版本,请在查询中包含以下网址:

http://localhost:9000/.inspect/coverage.json?ns=<database_name>

后续步骤