Какова лучшая практика создания / докер-приложения SpringBoot, которое имеет соединение с базой данных? - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть приложение с загрузочной пружиной, которое имеет следующее application.properties:

spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@ldap:something
spring.datasource.username=${USERNAME}
spring.datasource.password=${PASSWORD}

Как видите, это зависит от некоторых переменных среды.Мой конечный пункт назначения - образ докера, но перед этим я запускаю задачу gradle build - и она, конечно же, не выполняется, поскольку не может найти USERNAME и PASSWORD в переменных среды.

Поэтому я бы хотелразделить мой вопрос на два:

  1. Должна ли задача 1014 *, которая выполняется вместе с gradle build, вообще пытаться проверить соединение с базой данных?Он делает это по умолчанию, когда пытается загрузить приложение весенней загрузки - поэтому моя задача gradle build не выполняется.Почему-то я думаю, что это не самый лучший вариант - поскольку, на мой взгляд, модульные тесты не должны зависеть от каких-либо внешних факторов, таких как соединение с базой данных.

  2. Хорошая идея запустить gradle buildсначала и потом работает docker build?Или все должно быть сделано за один раз?Тогда я могу по крайней мере определить переменные окружения на docker run.Но опять же, я бы не хотел создавать образ докера, не зная, что сборка в порядке и все тесты пройдены.

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Прежде всего, вы должны спросить себя, действительно ли вам нужно загружать целое приложение для вашего теста.Если у вас есть тест, который проверяет, дают ли определенные методы правильный вывод для данного ввода, который не требует вызовов базы данных, он вам, вероятно, не нужен.

Даже если для теста требуется подключение к базе данных, выдолжен спросить себя, должна ли она быть реальной базой данных.Если для ваших тестов вы используете отдельную базу данных, это также означает, что весь процесс сборки завершится неудачей, если в базе данных будет какое-либо обслуживание.Возможно, лучше использовать отдельную базу данных в памяти для целей тестирования.

Чтобы это произошло, вы можете добавить базу данных в памяти, такую ​​как HSQLDB, в свой проект в качестве тестовой зависимости:

testCompile("org.hsqldb:hsqldb")

После этого вы можете предоставить отдельный файл application-test.properties:

spring.datasource.url=jdbc:hsqldb:mem
spring.datasource.username=user
spring.datasource.password=pass

Теперь вы можете комментировать любой тест, для которого требуется соединение с базой данных, с помощью @ActiveProfiles("test").

Даже если вам не нравится база данных в памяти для тестирования, вы все равно можете использовать подход с использованием нескольких профилей для использования другой конфигурации базы данных для тестирования (например, жестко закодированное соединение + имя пользователя / пароль к базе данных).

0 голосов
/ 11 сентября 2018

Трудно ответить на вопросы с "это хорошая идея", но я постараюсь ...

  1. Большинство людей рассматривают модульные тесты как способ тестирования кода, не среду, в которой выполняется этот код. Это одна из причин, почему издевательства и т. Д. Так популярны. Так что я бы позаботился о том, чтобы ваше тестовое задание только проверяло «код». Конечно, есть странность, что вы можете захотеть протестировать код подключения к вашей базе данных (в отличие от среды), что трудно сделать без подключения к базе данных.

  2. Опять же, у большинства людей на этапе сборки выводится некий пакет, который они развертывают в контейнере Docker. Поэтому я бы запустил вашу сборку gradle перед сборкой Docker - и я бы включил в себя «тест на дым», чтобы убедиться, что ваше приложение загружается и может подключаться к базе данных. Возможно, вы также захотите запустить модульные тесты, которые не могут быть реорганизованы, чтобы не требовать базы данных на этом этапе.

0 голосов
/ 11 сентября 2018

Отвечая на ваши вопросы:

  1. По моему скромному мнению, в общем случае gradle test следует выполнить после gradle build.Если тестирование вашей базы данных не является одним из тестов, если вы используете его только для сбора информации для ваших тестов, я выполню gradle test после проверки базы данных.
  2. Да, это хорошая идея:
    • Первый, docker build
    • Второй, docker run -e USERNAME=XXXX -e PASSWORD=XXXX...
    • Третий, gradle build внутри докера.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...