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

Локальное тестирование С использованием Spring Data и хранилища данных GCP

Разработка в облаке сильно отличается от традиционной разработки. Повторяющаяся задача состоит в том, чтобы… С тегами google cloud, docker, java, тестирование.

Разработка в облаке сильно отличается от традиционной разработки. Повторяющаяся проблема заключается в написании тестов, которые работают локально или в системе CI без доступа к облаку.

В этой статье представлен способ тестирования сервисов, использующих Spring Boot и хранилище данных Google. Предпосылки

  • Java 11 (который можно легко установить с помощью sdkman.)
  • Docker и docker-compose
  • Базовые знания Maven, Spring Boot и облачной платформы Google.

Прежде чем мы начнем

Чтобы убедиться, что все работает локально, выйдите из cloudy и сбросьте настройки проекта.

gcloud auth revoke
gcloud config unset project

Полный код доступен на GitHub .

Настройка проекта

Мы начинаем с проекта Spring Boot, который имеет все необходимые зависимости для использования хранилища данных. Вы можете найти весь код на GitHub.

Проект содержит простую сущность (Article) и хранилище spring-данных с пользовательским методом ( ArticleRepository). Пусть тест провалится.

Проверьте тег 1-let-the-tests-fail, если вы хотите следовать этому шаг за шагом.

Если вы запустите mvn clean install в этом состоянии, тест завершится неудачей, поскольку активного проекта нет:

[...]
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.google.cloud.datastore.Datastore]: Factory method 'datastore' threw exception; nested exception is java.lang.IllegalArgumentException: A project ID is required for this service but could not be determined from the builder or the environment. Please set a project ID using the builder.
Caused by: java.lang.IllegalArgumentException: A project ID is required for this service but could not be determined from the builder or the environment. Please set a project ID using the builder

Это легко исправить, добавив макет идентификатора проекта в application.properties (см. тег git 2-add-project-id-property):

spring.cloud.gcp.project-id=test-project

Maven ( mvn clean install ) теперь завершается ошибкой со следующей ошибкой:

com.google.cloud.datastore.DatastoreException: Cloud Datastore API has not been used in project … before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/datastore.googleapis.com/overview?project=… then retry.

Spring теперь пытается подключиться к хранилищу данных в тестовом проекте, которого не существует. Сделайте тесты зелеными.

Здесь вступает в игру эмулятор хранилища данных. Вы можете установить его через g cloud, но для удобства переносимости мы будем использовать докеризованную версию.

Мы добавляем следующий docker-compose.yml в корень проекта:

version: '3'

services:

  datastore:
    image: knarz/datastore-emulator
    ports:
      - 8081:8432
    environment:
      CONSISTENCY: 1 # If you omit this, the emulator will emulate eventual consistency.

Чтобы убедиться, что Spring использует эмулятор, мы должны добавить свойство в application.properties, которое указывает на него:

spring.cloud.gcp.datastore.host=localhost:8081

(Смотрите тег git 3-хранилище данных-эмулятор для всего кода на этом шаге)

Запустите эмулятор с помощью docker-compose up и снова запустите тест с помощью mvn clean install .

Теперь тесты стали зелеными! Вы создали тест с хранилищем данных, который выполняется на 100% локально! Сделайте это более удобным.

Запуск и остановка контейнера вручную утомительны и подвержены ошибкам. К счастью, мы можем настроить maven так, чтобы это происходило автоматически.

Во-первых, мы добавляем maven-failsafe-plugin в ваш раздел сборки в pom.xml:

...

  org.apache.maven.plugins
  maven-failsafe-plugin
  2.22.2

Основной задачей плагина является запуск интеграционных тестов. Вы можете обсудить, квалифицируется ли наш тест как интеграционный тест или нет. Однако для модульных тестов нет подходящих этапов жизненного цикла maven, как для интеграционных тестов (которые нам понадобятся через секунду). Не стесняйтесь изменять этот шаг так, чтобы он соответствовал вашим потребностям.

Для того, чтобы maven-failsafe-plugin выполнил наш тест, мы должны переименовать его из ArticleRepository Test в ArticleRepositoryIT .

Затем мы добавляем exec-maven-plugin, который запустит эмулятор перед интеграционными тестами и остановит их после.


  org.codehaus.mojo
  exec-maven-plugin
  3.0.0
  
    
      start-datastore-emulator
      pre-integration-test
      
        exec
      
      
        docker-compose
        
          up
          -d
        
      
    
    
      stop-datastore-emulator
      post-integration-test
      
        exec
      
      
        docker-compose
        
          down
          -v
        
      
    
  

Убедитесь, что вы остановили контейнер docker с помощью docker-compose down . Затем запустите mvn clean install , чтобы убедиться, что maven запускает эмулятор, запускает тест и после этого останавливает эмулятор:

[INFO] Scanning for projects…
[INFO] 
[INFO] — — — — — — — < com.example:data-datastore-local-testing > — — — — — — — 
[INFO] Building data-datastore-local-testing 0.0.1-SNAPSHOT...[INFO] 
[INFO] — — exec-maven-plugin:3.0.0:exec (start-datastore-emulator) @ data-datastore-local-testing — -
Creating network "data-datastore-local-testing_default" with driver "bridge"
Creating data-datastore-local-testing_datastore_1 … done
[INFO] 
[INFO] — — maven-failsafe-plugin:2.22.2:integration-test (default) @ data-datastore-local-testing — -
[INFO] 
[INFO] — — — — — — — — — — — — — — — — — — — — — — — — — — — -
[INFO] T E S T S
[INFO] — — — — — — — — — — — — — — — — — — — — — — — — — — — -
[INFO] Running com.example.localtesting.repository.ArticleRepositoryIT...[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.849 s — in com.example.localtesting.repository.ArticleRepositoryIT
[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] 
[INFO] — — exec-maven-plugin:3.0.0:exec (stop-datastore-emulator) @ data-datastore-local-testing — -
Stopping data-datastore-local-testing_datastore_1 … done
Removing data-datastore-local-testing_datastore_1 … done
Removing network data-datastore-local-testing_default...[INFO] — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — 
[INFO] BUILD SUCCESS
[INFO] — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — 
[INFO] Total time: 18.264 s
[INFO] Finished at: 2021–10–19T16:10:59+02:00
[INFO] — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — 

Сделано! Спасибо, что прочитали эту статью. Перейдите на страницу GitHub , чтобы получить полный код.

Оригинал: “https://dev.to/ablx/stats-for-all-storieslocal-testing-with-spring-data-and-gcp-datastore-4pc6”