Gymterview
middle

Что такое Testcontainers и зачем они нужны?

Testcontainers – Java-библиотека для запуска Docker-контейнеров в тестах. Позволяет тестировать с реальными БД, брокерами сообщений, кэшами вместо in-memory заглушек.

Аналогия из жизни: вместо того чтобы репетировать речь перед зеркалом (H2 in-memory), вы выступаете перед небольшой реальной аудиторией (настоящая PostgreSQL в контейнере). Обратная связь гораздо ближе к реальности.

Пример

Полный пример с PostgreSQL
@SpringBootTest
@Testcontainers
class UserServiceIT {

    @Container
    static PostgreSQLContainer<?> postgres =
        new PostgreSQLContainer<>("postgres:16-alpine")
            .withDatabaseName("testdb")
            .withUsername("test")
            .withPassword("test");

    @DynamicPropertySource
    static void configureProperties(DynamicPropertyRegistry registry) {
        registry.add("spring.datasource.url", postgres::getJdbcUrl);
        registry.add("spring.datasource.username", postgres::getUsername);
        registry.add("spring.datasource.password", postgres::getPassword);
    }

    @Autowired
    private UserService userService;

    @Test
    void shouldSaveAndRetrieveUser() {
        User user = userService.create("John", "john@mail.com");
        assertThat(userService.findById(user.getId()))
            .isPresent()
            .hasValueSatisfying(u -> assertThat(u.getName()).isEqualTo("John"));
    }
}

Доступные контейнеры

Контейнер Класс Образ
PostgreSQL PostgreSQLContainer postgres:16
MongoDB MongoDBContainer mongo:7
Kafka KafkaContainer confluentinc/cp-kafka:7.6.0
Redis GenericContainer redis:7
LocalStack (AWS) LocalStackContainer localstack/localstack:3

Ключевые принципы

  • Testcontainers > H2 – тестируете на реальной БД; нет расхождений синтаксиса и поведения
  • @Container + @Testcontainers – автоматический lifecycle (start/stop)
  • @DynamicPropertySource – внедрение динамических свойств (порт, URL) в Spring context
  • Контейнеры переиспользуются между тестами через static поля

Частые ошибки

  • Docker не установлен – Testcontainers требует Docker; в CI нужен Docker-in-Docker или Testcontainers Cloud
  • Не static контейнер – без static контейнер перезапускается для каждого теста (медленно)
  • Не указать версию образа – new PostgreSQLContainer<>("postgres") приводит к непредсказуемой версии

Как используется в 2026

  • Testcontainers – стандарт для интеграционных тестов в Java-экосистеме
  • Spring Boot 3.1+ – нативная поддержка через @ServiceConnection (без @DynamicPropertySource)
  • Testcontainers Desktop / Cloud – запуск без локального Docker

На собеседовании: интервьюер хочет услышать, почему Testcontainers лучше H2, и как настраивается интеграция со Spring Boot. Частая ошибка – не знать про @DynamicPropertySource и @ServiceConnection.