Gymterview
junior

Что такое интеграционное тестирование?

Интеграционное тестирование – проверка взаимодействия нескольких компонентов системы: приложение + БД, приложение + внешний API, несколько сервисов вместе.

Аналогия из жизни: после того как каждая деталь проверена отдельно (unit), их собирают вместе и проверяют, что механизм работает в сборке – передачи переключаются, двигатель крутит колёса.

Отличие от unit-тестов

Критерий Unit-тест Интеграционный тест
Зависимости Замокированы Реальные (БД, API)
Скорость Миллисекунды Секунды
Что проверяет Логику метода Взаимодействие компонентов
Инфраструктура Не нужна Нужна (БД, контейнеры)

Пример с Testcontainers

Пример кода
@SpringBootTest
@Testcontainers
class OrderRepositoryIT {

    @Container
    static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16");

    @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 OrderRepository orderRepository;

    @Test
    void shouldSaveAndFindOrder() {
        Order order = new Order("product-1", BigDecimal.valueOf(99.99));
        orderRepository.save(order);

        Optional<Order> found = orderRepository.findById(order.getId());
        assertThat(found).isPresent();
        assertThat(found.get().getProductId()).isEqualTo("product-1");
    }
}

Ключевые принципы

  • Интеграционные тесты дороже unit-тестов – запускайте их реже (CI pipeline)
  • Testcontainers – стандарт для интеграционных тестов с БД, Kafka, Redis
  • @SpringBootTest поднимает полный Spring Context – медленно; используйте слайсы (@DataJpaTest, @WebMvcTest)

Частые ошибки

  • H2 вместо реальной БД – синтаксис и поведение отличаются; тесты проходят, production падает
  • Общая БД между тестами – данные одного теста влияют на другой; используйте @Transactional или очистку
  • Слишком много интеграционных тестов – медленный CI; придерживайтесь пирамиды тестирования

Как используется в 2026

  • Testcontainers + реальная БД – стандарт, H2 для интеграционных тестов считается anti-pattern
  • Spring Boot слайсы (@DataJpaTest, @WebMvcTest) – быстрее полного @SpringBootTest

На собеседовании: интервьюер хочет услышать, чем интеграционный тест отличается от unit-теста, и когда что применять. Частая ошибка – не упомянуть Testcontainers и сказать, что для интеграционных тестов используется H2.