Usar o emulador do Firestore localmente

A Google Cloud CLI fornece um emulador local na memória para Firestore que você pode usar para testar seu aplicativo. Você pode usar o com todas as bibliotecas de cliente do Firestore. Você deve usar o emulador apenas para testes locais.

Não use o emulador para implantações de produção. Como o emulador armazena dados apenas na memória, não armazenará dados durante as execuções.

Instalar o emulador

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

  1. Instale a CLI da gcloud.

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

    gcloud components update
    

Executar o emulador

  1. Execute o seguinte comando para iniciar o emulador:

    gcloud emulators firestore start
    

    O emulador imprime o host e o número da porta em que está sendo executado.

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

    gcloud emulators firestore start --host-port=HOST:PORT
    
  2. Digite Control + C para interromper o emulador. O emulador também pode ser interrompido com um POST para /shutdown. Exemplo:

    curl -d '' HOST:PORT/shutdown
    

Conectar ao emulador

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

Bibliotecas de cliente do servidor

Conectar um cliente do servidor do Firestore (C#, Go, Java, Node.js, PHP, Python e Ruby), defina a variável de ambiente FIRESTORE_EMULATOR_HOST. Quando esse ambiente for definida, as bibliotecas de cliente do servidor se conectarão automaticamente ao emulador.

export FIRESTORE_EMULATOR_HOST="HOST:PORT"

SDKs do Android, da Apple e da Web

Os exemplos a seguir demonstram como conectar o SDKs do Android, da Apple e da Web para o Firestore emulator:

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 9 para a Web

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

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

Versão 8 para a Web

// 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 limpa o conteúdo do banco de dados quando é encerrado. Como o cache off-line do SDK do Firestore não é limpo automaticamente, desative a persistência local na configuração do emulador para evitar discrepâncias entre o banco de dados emulado e os caches locais. No SDK da Web, a persistência é desativada por padrão.

Limpar dados do emulador

O emulador do Firestore inclui um endpoint REST para excluir todos os os dados que estão atualmente no emulador. É possível usar esse endpoint para limpar dados entre testes sem encerrar o emulador.

Para excluir todos os dados no emulador, execute uma operação DELETE HTTP na endpoint a seguir, substituindo HOST e PORT pelo e a porta selecionadas e substituindo PROJECT_ID pelo seu próprio ID do projeto:

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

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

É possível executar essa operação no shell usando curl:

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

Qual é a diferença entre o emulador do Firestore e a produção

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

Transações

O emulador não implementa todo o comportamento da transação encontrado na produção. Quando você está testando recursos que envolvem várias gravações simultâneas em um documento, o emulador pode demorar para concluir solicitações de gravação. Em alguns casos, os bloqueios podem levar até 30 segundos para serem liberados. Considere ajustar os tempos limites do teste de acordo, se necessário.

Índices

O emulador não rastreia índices compostos e, em vez disso, executa consultas válidas. Não deixe de testar o app com uma instância real do Firestore para determinar quais índices são necessários.

Limites

O emulador não impõe todos os limites aplicados na produção. Por exemplo, o emulador pode permitir transações que são rejeitadas por serem muito grandes pelo serviço de produção. Verifique se você conhece os limites documentados e se desenvolve o app para evitá-los de maneira proativa.