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

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

Ответ

Testcontainers — это Java-библиотека, которая предоставляет легковесные, одноразовые экземпляры баз данных, брокеров сообщений или других сервисов, запускаемых в Docker-контейнерах. Это позволяет проводить интеграционные тесты в среде, максимально приближенной к продакшену.

Типичный сценарий использования с Spring Boot и PostgreSQL:

@Testcontainers // Аннотация JUnit Jupiter
@SpringBootTest
public class UserRepositoryIntegrationTest {

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

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

    @Test
    void shouldSaveAndRetrieveUser() {
        User user = new User("test@email.com", "Test User");
        userRepository.save(user);
        assertThat(userRepository.findById(user.getId())).isPresent();
    }
}

Ключевые преимущества:

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

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