Широко не задокументировано, как это сделать, верно? У вас есть набор тестов, который вы хотите запустить в эмуляторе 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”