Confira tudo que foi anunciado no Firebase Summit e veja como usar o Firebase para acelerar o desenvolvimento de apps e executar os aplicativos com confiança. Saiba mais

Conecte seu aplicativo ao emulador do Cloud Firestore

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

Antes de conectar seu aplicativo ao emulador do Cloud Firestore, certifique-se de entender o fluxo de trabalho geral do Firebase Local Emulator Suite e de instalar e configurar o Local Emulator Suite e revisar seus comandos CLI .

Escolha um projeto do Firebase

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

Para selecionar o projeto a ser usado, antes de iniciar os emuladores, na CLI, execute firebase use em seu diretório de trabalho. Ou você pode passar o sinalizador --project para cada comando do emulador.

O 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 por meio do console do Firebase).

Projetos reais têm recursos ativos, como instâncias de banco de dados, depósitos de armazenamento, funções ou qualquer outro recurso configurado para esse projeto do Firebase.

Ao trabalhar com projetos reais do Firebase, você pode executar emuladores para qualquer um ou todos os produtos compatíveis.

Para qualquer produto que você não esteja emulando, seus aplicativos e código irão interagir com o recurso ao vivo (instância de banco de dados, depósito de armazenamento, função, etc.).

Demonstração

Um projeto de demonstração do Firebase não tem nenhuma configuração real do Firebase nem recursos ativos. Esses projetos geralmente são acessados ​​por meio de codelabs ou outros tutoriais.

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

Ao trabalhar com projetos de demonstração do Firebase, seus aplicativos e códigos interagem apenas com emuladores . Se seu aplicativo tentar interagir com um recurso para o qual um emulador não está em execução, esse código falhará.

Recomendamos que você use projetos de demonstração sempre que possível. Os benefícios incluem:

  • Configuração mais fácil, pois você pode executar os emuladores sem nunca criar um projeto Firebase
  • Maior segurança, pois se seu código invocar acidentalmente recursos não emulados (de produção), não há chance de alteração de dados, uso e cobrança
  • Melhor suporte offline, pois não há necessidade de acessar a internet para baixar a configuração do seu SDK.

Instrumente seu aplicativo para conversar com os emuladores

Android, plataformas Apple e SDKs da Web

Defina sua configuração no aplicativo ou classes de teste para interagir com o Cloud Firestore 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 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);
Rápido
let settings = Firestore.firestore().settings
settings.host = "localhost:8080"
settings.isPersistenceEnabled = false 
settings.isSSLEnabled = false
Firestore.firestore().settings = settings

Web version 9

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

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

Web version 8

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

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

SDKs administrativos

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="localhost:8080"

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

Se você quiser que seu código Admin SDK se conecte a um emulador compartilhado em execução em outro ambiente, será necessário especificar o mesmo ID do projeto definido usando a Firebase CLI . Você pode passar um ID de projeto para initializeApp diretamente ou definir a variável de ambiente GCLOUD_PROJECT .

SDK de administração do Node.js
admin.initializeApp({ projectId: "your-project-id" });
Variável de ambiente
export GCLOUD_PROJECT="your-project-id"

Limpe seu banco de dados entre os testes

O Firestore de produção não fornece nenhum método SDK de plataforma para liberar o banco de dados, mas o emulador do Firestore fornece um endpoint REST especificamente para essa finalidade, que pode ser chamado a partir de uma etapa de configuração/tearDown da estrutura de teste, de uma classe de teste ou do shell (por exemplo, , com curl ) antes do início de um teste. Você pode usar essa abordagem como uma alternativa para simplesmente desligar o processo do emulador.

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

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

Naturalmente, seu código deve aguardar a confirmação REST de que a liberação 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"

Tendo implementado uma etapa como esta, você pode sequenciar seus testes e acionar suas funções com a confiança de que os dados antigos serão eliminados entre as execuções e você está usando uma nova configuração de teste de linha de base.

Importar e exportar dados

O banco de dados e os emuladores do Cloud Storage para Firebase permitem que você exporte dados de uma instância de emulador em execução. Defina um conjunto de dados de linha de base para usar em seus testes de unidade ou fluxos de trabalho de integração contínua e, em seguida, exporte-os para serem compartilhados entre a equipe.

firebase emulators:export ./dir

Nos testes, na inicialização do emulador, importe os dados da linha de base.

firebase emulators:start --import=./dir

Você pode instruir o emulador a exportar dados no desligamento, especificando um caminho de exportação ou simplesmente usando o caminho passado para o sinalizador --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 obter mais informações, consulte a referência de comando do emulador .

Visualize a atividade das regras de segurança

À medida que você trabalha com protótipos e loops de teste, pode usar ferramentas de visualização e relatórios fornecidos pelo Local Emulator Suite.

Use o Monitor de Solicitações

O emulador do Cloud Firestore permite que você visualize as solicitações do cliente 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 de cada solicitação.

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

Visualizar relatórios de avaliação de regras

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

Depois de executar um conjunto de testes, você pode acessar relatórios de cobertura de teste que mostram como cada uma de suas regras de segurança foi avaliada.

Para obter os relatórios, consulte um ponto de extremidade exposto no emulador durante a execução. Para uma versão amigável ao navegador, use o seguinte URL:

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html

Isso divide suas regras em expressões e subexpressões nas quais você pode passar o mouse para obter mais informações, incluindo o número de avaliações e valores retornados. Para a versão JSON bruta desses dados, inclua o seguinte URL em sua consulta:

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage

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

Como o emulador do Cloud Firestore difere da produção

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

Transações

Atualmente, o emulador não implementa todo o comportamento de transação visto 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 as solicitações de gravação. Em alguns casos, os bloqueios podem demorar até 30 segundos para serem liberados. Considere ajustar os tempos limite de teste de acordo, se necessário.

Índices

O emulador não rastreia índices compostos e, em vez disso, executará qualquer consulta válida. Certifique-se de testar seu aplicativo em uma instância real do Cloud Firestore para determinar quais índices serão necessários.

Limites

O emulador não impõe todos os limites impostos na produção. Por exemplo, o emulador pode permitir transações que seriam rejeitadas como muito grandes pelo serviço de produção. Certifique-se de estar familiarizado com os limites documentados e de projetar seu aplicativo para evitá-los proativamente.

Qual o proximo?