Использование Docker для локального тестирования

Всем привет, работаю java программистом больше 10 лет, в этом посте хотел бы показать, как использовать Docker для локального тестирования приложения.

Средний корпоративный код содержит не очень много логики, но множество интеграций с другими сервисами, несколько баз данных (postgres, кеш в redis, поиск в elastic), очередь (kafka), хранилище документов (s3) итд. Хотелось бы иметь возможность тестировать приложение на локальной машине, без необходимости доставки каждого изменения до общего dev стенда.

Чтобы не разворачивать весь стек технологий на рабочем ноуте, используют Docker контейнеры. Часто образ контейнера содержит минимальную сборку linux (alpine) и сам сервис, например postgres. Внутри контейнера сервис доступен по своему стандартному порту (5432 для postgres), но обратиться напрямую к нему нельзя - на время работы контейнера Docker будет предоставлять внешний порт

Использование Docker для локального тестирования Разработка, Программирование, IT, Docker, Тестирование

Postgres поднят, но порт 5432 доступен только внутри контейнера

Можно настроить, чтобы Docker контейнер сохранял состояние на жестком диске. Но для тестов лучше запускать образы с нуля - тогда предыдущие попытки выполнения тестов не будут влиять на текущие.

Для запуска Docker на рабочей машине можно установить Docker desktop. Для поддержки Docker в CI может потребоваться конфигурация dind (docker in docker). При разработке в компании также потребуется указывать корпоративный репозиторий образов. Версия в образе должна соответствовать используемой на продакшене версии сервиса.

Для автоматизации работы с Docker из java тестов я использую библиотеку testcontainers:

@Container
@ServiceConnection
static PostgreSQLContainer<?> postgreSQLContainer = new PostgreSQLContainer<>("postgres");

Здесь postgres - имя контейнера без указания версии. Аннотация Container указывает на необходимость запустить Docker до старта теста. Аннотация ServiceConnection позволяет java узнать внешний порт сервиса и подставить в свой конфиг.

Использование контейнеров позволяет упростить локальное тестирование приложения и является мастхев инструментом. Буду рад ответить на вопросы.

Лига программистов

1.6K постов11.5K подписчиков

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества