Testcontainers

Тема дорожной карты · Spring Boot

Testcontainers в Spring Boot — стандартный подход для написания интеграционных тестов, выполняемых против реальных внешних зависимостей — PostgreSQL, MongoDB, Redis, Kafka, RabbitMQ, Elasticsearch — внутри одноразовых Docker-контейнеров, устраняющий ненадёжные in-memory или замоканные заменители, скрывающие продакшн-ошибки. Spring Boot 3.1 ввёл первоклассную интеграцию с Testcontainers: @ServiceConnection автоматически подключает PostgreSQLContainer или RedisContainer к бину DataSource или RedisConnectionFactory без какого-либо ручного переопределения свойств, а модуль spring-boot-testcontainers управляет жизненным циклом контейнеров через Spring ApplicationContext. Разработчики аннотируют тесты @SpringBootTest и объявляют контейнеры как поля @Bean, аннотированные @Container внутри класса @TestConfiguration, или используют сокращение @ImportTestcontainers для совместного использования единственного экземпляра контейнера во всём тестовом наборе через паттерны @Singleton, сокращая время CI-пайплайна. Testcontainers в Spring Boot органично сочетается с @DataJpaTest для тестов Hibernate и Spring Data JPA, поддерживаемых реальным контейнером PostgreSQL, @DataMongoTest для тестов Spring Data MongoDB и REST Assured или WebTestClient для полной HTTP API-верификации. Поскольку контейнеры запускаются из общедоступных Docker Hub-образов, Testcontainers в Spring Boot требует только наличия Docker на агенте сборки, что упрощает запуск идентичных тестов локально и в средах GitHub Actions или Jenkins CI перед развёртыванием в Kubernetes.

Как это работает

Testcontainers: @SpringBootTest бутит полный контекст для интеграционных тестов (медленно, но реалистично). @WebMvcTest + MockMvc для controller-layer unit-тестов (без DB, без полного контекста — быстро). @DataJpaTest для repository-тестов на H2/Testcontainers DB. Testcontainers (Java интеграция) поднимают реальные DB/queues/сервисы в Docker per test — самый high-fidelity вариант. REST Assured для fluent end-to-end API-тестов. Spring Boot test slices держат тесты быстрыми, бутая только нужный слой.

Когда применять

Дефолт Testcontainers вместо H2 — та же DB в тестах + prod = без сюрпризов dialect. Slice-тесты (@WebMvcTest, @DataJpaTest) для быстрой обратной связи; @SpringBootTest для настоящих интеграционных тестов. Mock external HTTP-сервисы через WireMock. Целитесь в testing pyramid — много unit, меньше slice, ещё меньше full integration.

Типичные ошибки

Ловушки Testcontainers: только @SpringBootTest везде (медленно + flaky); H2 для теста против Postgres prod (H2 + Postgres SQL отличаются); flaky-тесты из-за random ports без proper cleanup; мокают всё (тестируете моки, не код).

Связанные понятия

Полезные ресурсы