Вопрос проверяет понимание процесса запуска интеграционных тестов, включая выбор и настройку базы данных для изоляции тестовой среды.
Интеграционные тесты проверяют корректность взаимодействия между различными модулями системы, такими как сервис приложения и база данных. Их запуск требует специальной подготовки окружения, чтобы тесты были изолированы, воспроизводимы и не влияли на рабочие данные.
Основные подходы:
Рассмотрим пример настройки для приложения на Spring Boot с использованием Testcontainers (PostgreSQL в Docker) и JUnit 5.
@SpringBootTest
@Testcontainers
class UserRepositoryIntegrationTest {
@Container
static PostgreSQLContainer postgres = new PostgreSQLContainer<>("postgres:15");
@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;
@BeforeEach
void setUp() {
// Очистка таблицы перед каждым тестом
userRepository.deleteAll();
}
@Test
void shouldSaveAndRetrieveUser() {
User user = new User("test@example.com", "John");
userRepository.save(user);
Optional found = userRepository.findByEmail("test@example.com");
assertThat(found).isPresent();
assertThat(found.get().getName()).isEqualTo("John");
}
}В этом примере Testcontainers запускает контейнер с PostgreSQL перед всеми тестами в классе. Аннотация @DynamicPropertySource динамически подставляет параметры подключения в контекст Spring. Метод @BeforeEach гарантирует чистоту данных для каждого теста.
Вывод: Интеграционные тесты с БД стоит запускать на изолированной тестовой базе, максимально близкой к продакшену (лучше всего через контейнеризацию), чтобы гарантировать корректность работы с реальными SQL-запросами и транзакциями, не загрязняя рабочие данные.