
Testcontainers – open-source фреймворк, позволяющий развернуть одноразовый экземпляр бд в Docker контейнере.
Контейнеры создаются/запускаются перед выполнением тестов и останавливаются/удаляются после выполнения всех тестов.
Материалы:
- Доки на testcontainers.com, в частности:
- Testcontainers container lifecycle management using JUnit 5 – жизненный цикл контейнеров и способы их хранения в памяти
- Доки на java.testcontainers.org
- Пример на github
- Database Testing with Testcontainers and Kotlin Exposed ORM (vuongdang.dev)
- Testcontainers Best Practices (docker.com)
Подключение с использованием PostgreSQL:
Разворачивать и удалять экземпляр бд в контейнере докера для каждого тестового класса (и тем более для каждого теста) слишком ресурсозатратно. По-хорошему нужно, чтобы экземпляр БД был автоматически создан 1 раз перед запуском любого теста, и удален при завершении всех тестов.
Для этого можно сохранить созданный экземпляр контейнера как Singleton (см. Using Singleton Containers). Другими способами (через Extension annotations, JUnit5 BeforeAllCallback и др.) “из коробки” лично у меня не получилось сделать один единственный запуск контейнера для всех тестовых классов. Можно было добавить проверку с использованием AtomicBoolean
и т.п., но стоит ли оно того.
Т.е. создаете контейнер в статической области памяти с указанием имени образа в докере, где крутится субд (в данном примере PostgreSQL), сразу запускаете (создаете) его и подключаетесь к только что созданной бд. Вызывать удаление контейнера не нужно, это либа берет на себя.
По-умолчанию либа создает бд со “случайным” именем, логином, паролем и т.п. (их значения можно узнать после создания контейнера), но можно задать и свои.
Также, существует экспериментальный флаг reusable
, при включении которого повторные запуски контейнера (.start()
) автоматически будут осуществляться с одинаковыми параметрами, т.е. не будут меняться от запуска к запуску (пока вручную не вызовешь .stop()
).
Ниже пример:
- с указанием собственных параметров запуска (в т.ч. портов, что НЕ рекомендуется делать, но иногда может понадобиться)
- с использованием подключения к бд через JDBC-коннектор HikariCP
- с запуском механизма миграции бд с помощью Flyway