Use o emulador do Firestore localmente

A CLI do Google Cloud oferece um emulador local na memória para o Firestore que pode usar para testar a sua aplicação. Pode usar o emulador com todas as bibliotecas cliente do Firestore. Deve usar o emulador apenas para testes locais.

Não use o emulador para implementações de produção. Uma vez que o emulador armazena dados apenas na memória, não mantém os dados entre execuções.

Instale o emulador

Para instalar o emulador do Firestore, instale e atualize a CLI gcloud:

  1. Instale a CLI gcloud.

  2. Atualize a instalação da CLI gcloud para receber as funcionalidades mais recentes:

    gcloud components update
    

Execute o emulador

  1. Execute o seguinte comando para iniciar o emulador:

    gcloud emulators firestore start
    

    O emulador imprime o anfitrião e o número da porta onde está a ser executado.

    Por predefinição, o emulador tenta usar 127.0.0.1:8080. Para associar o emulador a um anfitrião e uma porta específicos, use a flag --host-port opcional, substituindo HOST e PORT:

    gcloud emulators firestore start --host-port=HOST:PORT
    
  2. Escreva Control + C para parar o emulador. O emulador também pode ser parado com um POST para /shutdown. Por exemplo:

    curl -d '' HOST:PORT/shutdown
    

Estabeleça ligação ao emulador

A forma como se liga ao emulador depende do tipo de biblioteca de cliente, biblioteca de cliente de servidor ou SDK para dispositivos móveis/Web.

Bibliotecas cliente do servidor

Para ligar uma biblioteca cliente do servidor do Firestore (C#, Go, Java, Node.js, PHP, Python e Ruby), defina a variável de ambiente FIRESTORE_EMULATOR_HOST. Quando esta variável de ambiente está definida, as bibliotecas de cliente do servidor ligam-se automaticamente ao emulador.

export FIRESTORE_EMULATOR_HOST="HOST:PORT"

Android, plataformas Apple e SDKs Web

Os exemplos seguintes demonstram como ligar as plataformas Android e Apple, e os SDKs Web ao emulador do Firestore:

Android
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFirestore firestore = FirebaseFirestore.getInstance();
firestore.useEmulator("10.0.2.2", 8080);

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(false)
        .build();
firestore.setFirestoreSettings(settings);
Swift
let settings = Firestore.firestore().settings
settings.host = "127.0.0.1:8080"
settings.cacheSettings = MemoryCacheSettings()
settings.isSSLEnabled = false
Firestore.firestore().settings = settings

Versão Web 9

import { getFirestore, connectFirestoreEmulator } from "firebase/firestore";

// firebaseApps previously initialized using initializeApp()
const db = getFirestore();
connectFirestoreEmulator(db, '127.0.0.1', 8080);

Versão Web 8

// Firebase previously initialized using firebase.initializeApp().
var db = firebase.firestore();
if (location.hostname === "localhost") {
  db.useEmulator("127.0.0.1", 8080);
}

O emulador do Firestore no modo nativo limpa o conteúdo da base de dados quando é encerrado. Uma vez que a cache offline do SDK do Firestore não é limpa automaticamente, é recomendável desativar a persistência local na configuração do emulador para evitar discrepâncias entre a base de dados emulada e as caches locais. No SDK Web, a persistência está desativada por predefinição.

Limpe os dados do emulador

O emulador do Firestore inclui um ponto final REST para eliminar todos os dados atualmente no emulador. Pode usar este ponto final para limpar dados entre testes sem encerrar o emulador.

Para eliminar todos os dados no emulador, execute uma operação HTTP DELETE no seguinte ponto final, substituindo HOST e PORT pelo anfitrião e pela porta que selecionou, e substituindo PROJECT_ID pelo seu próprio ID do projeto:

http://HOST:PORT/emulator/v1/projects/PROJECT_ID/databases/(default)/documents

Ajuste o anfitrião e a porta se o emulador não usar 127.0.0.1:8080. O seu código deve aguardar a confirmação REST de que a eliminação foi concluída ou falhou.

Pode realizar esta operação a partir da shell com curl:

$ curl -v -X DELETE "http://HOST:PORT/emulator/v1/projects/PROJECT_ID/databases/(default)/documents"

Como o emulador do Firestore difere da produção

O emulador do Firestore tenta replicar fielmente o comportamento do serviço de produção com algumas limitações notáveis.

Transações

O emulador não tenta imitar o comportamento das transações observado na produção. Usa uma abordagem de bloqueio simples e não tenta replicar os vários modos de concorrência oferecidos no ambiente de produção.

Quando estiver a testar funcionalidades que envolvem várias escritas simultâneas num documento, o emulador pode demorar a concluir os pedidos de escrita. O emulador pode demorar até 30 segundos a libertar os bloqueios. Se precisar de ajustar os intervalos de tempo limite do teste, faça-o.

O emulador também não tenta imitar todos os limites de produção, como os limites de tempo limite e de tamanho, que envolvem transações. Se testar funcionalidades que dependem destes limites de produção, recomendamos que use um ambiente de produção em vez de um emulador.

Índices

O emulador não acompanha os índices compostos e, em vez disso, executa qualquer consulta válida. Certifique-se de que testa a sua app com uma instância real do Firestore para determinar os índices de que precisa.

Limites

O emulador não aplica todos os limites aplicados na produção. Por exemplo, o emulador pode permitir transações que seriam rejeitadas como demasiado grandes pelo serviço de produção. Certifique-se de que conhece os limites documentados e que cria a sua app para os evitar proativamente.