Ответ
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).