Для чего используется TestContainers?

«Для чего используется TestContainers?» — вопрос из категории Фреймворки тестирования, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

TestContainers — это Java-библиотека для запуска одноразовых экземпляров внешних зависимостей (таких как базы данных, брокеры сообщений, веб-серверы) внутри Docker-контейнеров во время выполнения тестов. Она позволяет писать интеграционные тесты, максимально приближенные к реальному окружению, без необходимости разворачивать сложную инфраструктуру вручную.

Ключевые преимущества для QA/тестирования:

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

Пример интеграционного теста с PostgreSQL и JUnit 5:

@Testcontainers
public class UserRepositoryIntegrationTest {

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

    @Test
    void shouldSaveAndRetrieveUser() {
        // Получаем реальный JDBC URL запущенного контейнера
        String jdbcUrl = postgres.getJdbcUrl();
        UserRepository repository = new UserRepository(jdbcUrl);

        User user = new User("testUser");
        repository.save(user);

        User found = repository.findById(user.getId());
        assertThat(found.getName()).isEqualTo("testUser");
    }
}

Типичное применение: Тестирование слоя доступа к данным (DAO/Repository), проверка миграций базы данных, интеграция с внешними API (через контейнеризованный WireMock).