Рубрики
Без рубрики

Запустите тесты Java с помощью эмулятора Firestore

Широко не задокументировано, как это сделать, верно? У вас есть набор тестов, который вы хотите запустить… С тегами firestore, java, firebase.

Широко не задокументировано, как это сделать, верно? У вас есть набор тестов, который вы хотите запустить в эмуляторе Firestore, который должен запускаться и останавливаться автоматически во время выполнения тестов. В этом случае мы будем использовать Java.

Подключение к локальному Firestore довольно простое, хотя и плохо документированное:

var options = FirestoreOptions.getDefaultInstance()
  .toBuilder()
  .setProjectId("my_project_id");
var firestoreUrl = System.getenv("FIRESTORE_URL");
if (!Strings.isNullOrEmpty(firestoreUrl) {
  options.setHost(firestoreUrl);
  options.setCredentialsProvider(null);
} else {
  options.setCredentials(GoogleCredentials.getApplicationDefault());
}
Firestore instance = options.build().getService();

Это подключит Firestore к вашей локальной среде, если вы передадите переменную среды с именем FIRESTORE_URL , и, если она не определена, она попытается подключиться к реальной службе, используя учетную запись службы по умолчанию для Compute Engine (если код выполняется в среде CI/CD или просто с шумом завершается сбоем, если это ваш местный ноутбук). Вы можете настроить gradle для запуска эмулятора перед вашими тестами.

bin/start-firestore-emulator запустит эмулятор на порту 9000:

#!/bin/bash
# Launch firestore emulator on port 9000

waitport() {
  while ! nc -z localhost $1; do 
    sleep 1 
  done
}

PID=$(lsof -t -i :9000 -s tcp:LISTEN)
if [ -z "$PID" ]; then
  echo "Starting mock Firestore server on port 9000"
  nohup gcloud beta emulators firestore start \
    --host-port=127.0.0.1:9000 \
    > /tmp/mock-firestore-logs &
  waitport 9000
else
  echo "There is an instance of Firestore already running on port 9000"
fi

bin/stop-firestore-emulator уничтожит все, что запущено на порту 9000, так что лучше, чтобы это был ваш эмулятор:

#!/bin/bash
# Stop mock firestore 

PID=$(lsof -t -i :9000 -s tcp:LISTEN)
if [ ! -z "$PID" ]; then
  echo "Stopping mock Firestore server"
  kill "$PID"
fi

Эти два сценария запустят и остановят Firestore локально на порту 9000. Теперь нам нужно запустить их до и после запуска наших тестов в build.gradle :

task startMockFirestore {
  doFirst {
    ext.process = new ProcessBuilder()
      .directory(projectDir)
      .inheritIO()
      .command("bin/start-firestore-emulator")
      .start()
      .waitFor()
    }
}
tasks.test.dependsOn(startMockFirestore)

task stopMockFirestore(type: Exec) {
  executable "bin/stop-firestore-emulator"
}
test.finalizedBy(stopMockFirestore)

В качестве бонусных баллов IntelliJ будет автоматически использовать эти задачи при запуске отдельных тестов, что приятно. Последнее замечание: помните, что эмулятор Firestore ничего не сохранит между исполнениями – как только вы отключите сервер, вы потеряете данные.

Надеюсь, это будет полезно! Для получения дополнительных советов по тестированию, коду и милым картинкам с животными следуйте за нами в Twitter .

(Фото любезно предоставлено Филом Херингом на Unsplash)

Оригинал: “https://dev.to/nachocoloma/run-java-tests-against-the-firestore-emulator-5c6f”