Ответ
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.
- Автоматизация: Контейнеры автоматически стартуют перед тестами и останавливаются после.
Недостаток: Тесты выполняются дольше из-за времени запуска контейнеров.