Prerequisites. Вам понадобится установленный Docker на машинах всех разработчиков (ну или тех, кто хочет прогонять тесты) и в вашем CI/CD. Я сижу на Windows, поэтому скачал и установил
Docker for Windows. С предыдущей попытки использовать его локально прошло больше полутора лет, система была недавно переустановлена, поэтому установка прошла гладко. В прошлый раз я испытывал трудности с Docker под эту ОС и мне постоянно приходилось делать ему сброс настроек.
Далее открываю документацию Testcontainers и делаю всё по шагам. Добавляю в pom.xml проекта три новые зависимости в тестовом scope (org.testcontainers:testcontainers, org.testcontainers:junit-jupiter и org.testcontainers:mysql). В application-test.yaml указываю jdbc-драйвер org.testcontainers.jdbc.ContainerDatabaseDriver и саму строку подключения: jdbc:tc:mysql:8.0:///emp-unit-tests. It's alive! Запускаю сборку, вижу в консоли подключение к Docker-у, скачивание
образа с СУБД Docker Hub-а и прогон тестов. Но почему всё так медленно?!?
HSQLDB — in-memory database, соответственно, он очень быстр, и скорость его работы не была ограничивающим фактором к использованию аннотации
@DirtiesContext. Это, в свою очередь, приводит к созданию нового контекста после прогона "грязных" тестов, то есть тех, которые по мнению разработчика могут хоть как-то повлиять своими данными на выполнение других тестов. Уверен, знакомая многим ситуация. Теперь с новым контекстом в docker-е каждый раз поднимается новый контейнер с MySQL (примерно 15-25 секунд, хотя на Linux-е я бы ожидал, что это будет быстрее) и выполнение всех миграций (за 9 месяцев разработки у них накопилось примерно 150 changeset-ов). До изменений тесты проходили в среднем за 90 секунд, а сейчас я просто останавливаю сборку примерно после 8 минут, так и не дождавшись результата!
Переписывать все тесты, чтобы они сами чистили за собой данные — долго, нудно, не хочется и не страхует от появления "грязных" тестов в будущем. Тут я обратил своё внимание на то, что все тесты, независимо от того, что они после себя оставляют, устраивает одно условие: абсолютно чистая схема данных с пустыми таблицами до прогона теста.