Что такое Testcontainers и как их использовать для интеграционного тестирования?

«Что такое Testcontainers и как их использовать для интеграционного тестирования?» — вопрос из категории Тестирование, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Testcontainers — это Java-библиотека, которая позволяет запускать одноразовые экземпляры инфраструктурных сервисов (БД, брокеры сообщений и т.д.) в Docker-контейнерах прямо из JUnit-тестов.

Основные преимущества:

  • Реальные зависимости: Тесты работают с настоящими СУБД (PostgreSQL, MySQL), а не с in-memory аналогами (H2), что повышает достоверность.
  • Изоляция: Каждый тестовый класс или метод может получить свой чистый экземпляр.
  • Упрощение: Не требуются предустановленные и настроенные внешние сервисы на машине разработчика или CI/CD.

Пример использования с JUnit 5 и PostgreSQL:

@Testcontainers // Аннотация для интеграции с JUnit 5
@DataJpaTest // Аннотация Spring Boot для тестов JPA
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class UserRepositoryIntegrationTest {

    @Container // Запускает контейнер перед всеми тестами в классе
    private static final PostgreSQLContainer<?> postgres = 
        new PostgreSQLContainer<>("postgres:15-alpine")
            .withDatabaseName("testdb")
            .withUsername("test")
            .withPassword("test");

    @DynamicPropertySource // Динамически переопределяет свойства Spring
    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 UserRepository userRepository;

    @Test
    void shouldSaveAndRetrieveUser() {
        User user = new User("John Doe");
        userRepository.save(user);
        assertThat(userRepository.findAll()).hasSize(1);
    }
}

Поддерживаемые технологии: Помимо баз данных, Testcontainers поддерживает Redis, Kafka, Elasticsearch, Selenium и многие другие. Существуют готовые модули для удобной настройки.

Недостаток: Тесты выполняются медленнее из-за времени на загрузку Docker-образов и запуск контейнеров.