Conectar seu app ao emulador do Cloud Firestore

Antes de conectar seu app ao emulador do Cloud Firestore, você precisa entender o fluxo de trabalho geral do Pacote de emuladores locais do Firebase, além de instalar e configurar o Pacote e revisar os comandos da CLI.

Escolher um projeto do Firebase

O Pacote de emuladores locais do Firebase emula produtos para um único projeto.

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.

O Pacote de emuladores locais oferece suporte à emulação de projetos reais e de demonstração do Firebase.

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

Instrua o app a se comunicar com os emuladores

Na inicialização, o emulador do Cloud Firestore cria um banco de dados padrão e um nomeado para cada configuração firestore no arquivo firebase.json.

Os bancos de dados nomeados também são criados implicitamente em resposta a chamadas do SDK ou da API REST para o emulador que fazem referência a um banco de dados específico. Esses bancos de dados criados implicitamente funcionam com regras abertas.

Para trabalhar interativamente com seus bancos de dados nomeados padrão na interface do Pacote de emuladores, atualize o URL na barra de endereço do navegador para selecionar o banco de dados padrão ou nomeado.

  • Por exemplo, para procurar os dados na sua instância padrão, atualize o URL para localhost:4000/firestore/default/data
  • Para navegar em uma instância chamada ecommerce, atualize para localhost:4000/firestore/ecommerce/data.

SDKs do Android, da Apple e da Web

Defina a configuração no app ou as classes de teste para interagir com o Cloud Firestore conforme mostrado a seguir. Nas amostras a seguir, o código do aplicativo está se conectando ao banco de dados padrão do projeto. Para exemplos que envolvem outros bancos de dados do Cloud Firestore além do banco de dados padrão, consulte o guia para vários bancos de dados.

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 firestore = Firebase.firestore
firestore.useEmulator("10.0.2.2", 8080)

firestore.firestoreSettings = firestoreSettings {
    isPersistenceEnabled = false
}
Java
// 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

Web

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

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

Web

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

Nenhuma configuração adicional é necessária para testar o Cloud Functions acionado por eventos do Firestore usando o emulador. Quando os emuladores do Firestore e do Cloud Functions estão em execução, eles funcionam automaticamente juntos.

SDKs Admin

Os SDKs Admin do Firebase se conectam automaticamente ao emulador do Cloud Firestore quando a variável de ambiente FIRESTORE_EMULATOR_HOST é definida:

export FIRESTORE_EMULATOR_HOST="127.0.0.1:8080"

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

Se você quiser que o código do SDK Admin 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

O Firestore de produção não fornece nenhum método do SDK da plataforma para limpar o banco de dados. No entanto, o emulador do Firestore fornece um endpoint REST especificamente para essa finalidade, que pode ser chamado a partir de uma etapa de configuração/eliminação do framework de teste, de uma classe de teste ou do shell (por exemplo, com curl) antes do início de um teste. Use essa abordagem como uma alternativa para simplesmente encerrar o processo do emulador.

Em um método apropriado, execute uma operação HTTP DELETE, fornecendo o ID do projeto do Firebase, por exemplo, firestore-emulator-example, para o seguinte endpoint:

"http://localhost:8080/emulator/v1/projects/firestore-emulator-example/databases/(default)/documents"

Naturalmente, o código deve aguardar a confirmação REST de que a limpeza foi concluída ou falhou.

Você pode executar esta operação no shell:

// Shell alternative…
$ curl -v -X DELETE "http://localhost:8080/emulator/v1/projects/firestore-emulator-example/databases/(default)/documents"

Depois de implementar uma etapa como esta, é possível sequenciar os testes e acionar 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

O banco de dados e os emuladores do Cloud Storage para Firebase 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.

Confira a atividade das regras de segurança

Ao trabalhar com repetições de testes e protótipos, é possível usar as ferramentas de visualização e os relatórios fornecidos pelo Pacote de emuladores locais.

Usar o monitor de solicitações

O emulador do Cloud Firestore permite visualizar as solicitações de clientes na IU do Pacote do emulador, incluindo o rastreamento de avaliação das regras de segurança do Firebase.

Abra a guia Firestore > Solicitações para visualizar a sequência de avaliação detalhada para cada solicitação.

Monitor de solicitações do emulador do Firestore mostrando avaliações de regras de segurança

Visualizar relatórios de avaliações de regras

Ao adicionar regras de segurança ao protótipo, é possível depurá-las com as ferramentas específicas do Pacote de emuladores locais.

Depois de executar um conjunto de testes, é possível acessar relatórios de cobertura 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:8080/emulator/v1/projects/<database_name>:ruleCoverage.html

Isso divide suas regras em expressões e subexpressões em que é possível passar o mouse para encontrar 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:8080/emulator/v1/projects/<database_name>:ruleCoverage

Aqui, a versão em HTML do relatório destaca as avaliações que geram erros indefinidos e de valor nulo:

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

O emulador do Cloud Firestore tenta replicar o comportamento do serviço de produção de maneira fiel, com algumas limitações notáveis:

Suporte a vários bancos de dados para o Cloud Firestore

Atualmente, a IU do Pacote de emuladores é compatível com criação interativa, edição, exclusão, monitoramento de solicitações e visualização de segurança em um banco de dados padrão, mas não em outros bancos de dados nomeados.

No entanto, o próprio emulador cria um banco de dados nomeado com base na configuração no seu arquivo firebase.json e implicitamente em resposta a chamadas da API REST ou do SDK.

Transações

No momento, 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. Em vez disso, ele executa consultas válidas. Não deixe de testar o app com uma instância real do Cloud 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.

A seguir