Conectar seu app ao emulador do Realtime Database

Antes de conectar seu app ao emulador do Realtime Database, você deve entender o fluxo de trabalho geral do Firebase Local Emulator Suite e instalar e configurar o Local Emulator Suite, além de analisar os comandos da CLI.

Escolher um projeto do Firebase

O Firebase Local Emulator Suite emula produtos para um único projeto do Firebase.

Na CLI, execute firebase use no diretório de trabalho antes de iniciar os emuladores para selecionar o projeto a ser usado. Como opção, é possível transmitir a flag --project para cada comando do emulador.

Local Emulator Suite oferece suporte à emulação de projetos reais do Firebase e projetos de demonstração.

Tipo de projeto Recursos Usar com emuladores
Real

Um projeto real do Firebase é aquele que você criou e configurou (provavelmente pelo console do Firebase).

Os projetos reais têm recursos ativos, como instâncias de banco de dados, buckets de armazenamento, funções ou qualquer outro recurso configurado para o projeto do Firebase.

Ao trabalhar com projetos reais do Firebase, é possível executar emuladores para qualquer um ou todos os produtos suportados.

Para todos os produtos que você não estiver emulando, os apps e o código interagem com recursos ativos, como o banco de dados, o bucket de armazenamento, a função etc.

Demonstração

Um projeto de demonstração do Firebase não tem configuração real nem recursos ativos. Em geral, esses projetos são acessados usando codelabs ou outros tutoriais.

Os IDs dos projetos de demonstração têm o prefixo demo-.

Ao trabalhar com projetos de demonstração do Firebase, os apps e códigos interagem apenas com emuladores. Se o app tentar interagir com um recurso em que um emulador não esteja em execução, o código falhará.

Recomendamos que você use projetos de demonstração sempre que possível. Alguns dos benefícios são:

  • Configuração mais fácil, já que é possível executar os emuladores sem precisar criar um projeto do Firebase
  • Mais segurança, já que, se o código invocar acidentalmente recursos não emulados (produção), não haverá chance de alteração, uso e faturamento de dados
  • Melhor suporte off-line, já que não é necessário acessar a Internet para fazer o download da configuração do SDK

Instruir o app a se comunicar com os emuladores

SDKs do Android, da Apple e da Web

Defina a configuração no app ou as classes de teste para interagir com o Realtime Database da seguinte maneira.

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

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

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

Nenhuma outra configuração é necessária para testar funções do Cloud acionadas por eventos do Realtime Database usando o emulador. Quando os emuladores do Realtime Database e do Cloud Functions estão em execução, eles funcionam automaticamente juntos.

Admin SDKs

Os Firebase Admin SDKs se conectam automaticamente ao emulador Realtime Database quando a variável de ambiente FIREBASE_DATABASE_EMULATOR_HOST está definida:

export FIREBASE_DATABASE_EMULATOR_HOST="127.0.0.1:9000"

Se o código estiver sendo executado dentro do emulador do Cloud Functions, o ID do projeto e outras configurações serão definidos automaticamente ao chamar initializeApp.

Se você quiser que o código do Admin SDK se conecte a um emulador compartilhado em execução em outro ambiente, especifique o mesmo ID do projeto definido usando a CLI do Firebase. É possível transmitir um ID do projeto para initializeApp diretamente ou definir a variável de ambiente GCLOUD_PROJECT.

SDK Admin para Node.js
admin.initializeApp({ projectId: "your-project-id" });
Variável de ambiente
export GCLOUD_PROJECT="your-project-id"

Limpar o banco de dados entre os testes

Para transferir o Realtime Database entre as atividades, limpe a referência do banco de dados. Use essa abordagem como uma alternativa ao simples encerramento do processo do emulador.

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

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

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

Naturalmente, o código deve aguardar a confirmação de que a limpeza foi concluída ou falhou usando os recursos de manipulação de eventos assíncronos da sua plataforma.

Depois de implementar uma etapa como esta, sequencie os testes e acione as funções com a certeza de que os dados antigos serão removidos entre as execuções e que você está usando uma nova configuração de teste de referência.

Importar e exportar dados

Os emuladores de Cloud Storage for Firebase e banco de dados permitem exportar dados de uma instância do emulador em execução. Defina um conjunto de dados de referência para usar nos testes de unidade ou nos fluxos de trabalho de integração contínua e o exporte para que seja compartilhado com a equipe.

firebase emulators:export ./dir

Em testes, na inicialização do emulador, importe os dados de referência.

firebase emulators:start --import=./dir

Instrua o emulador a exportar dados no desligamento, especificando um caminho de exportação ou simplesmente usando o caminho transmitido para a flag --import.

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

Essas opções de importação e exportação de dados também funcionam com o comando firebase emulators:exec. Para saber mais, consulte a referência de comandos do emulador.

Visualizar atividades de regras de segurança

Ao trabalhar com repetições de testes e protótipos, você pode usar as ferramentas de visualização e os relatórios fornecidos pelo Local Emulator Suite.

Visualizar avaliações de regras

Ao adicionar regras de segurança ao protótipo, você pode depurá-las com ferramentas de Local Emulator Suite.

Depois de executar um conjunto de testes, é possível acessar relatórios de cobertura de teste que mostram como cada uma das regras de segurança foi avaliada. Para acessar os relatórios, consulte um endpoint exposto no emulador enquanto ele está em execução. Para uma versão otimizada para navegadores, use o seguinte URL:

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

Isso divide as regras em expressões e subexpressões em que você pode passar o mouse para ver mais informações, incluindo o número de execuções e os valores retornados. Para a versão em JSON bruta desses dados, inclua o seguinte URL na consulta:

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

A seguir