Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Docker: integration testing, test database, test environment, test setup, database isolation

Как запускаются интеграционные тесты (какая БД используется)?

Вопрос проверяет понимание процесса запуска интеграционных тестов, включая выбор и настройку базы данных для изоляции тестовой среды.

Короткий ответ

Интеграционные тесты проверяют взаимодействие нескольких компонентов, например, приложения и базы данных. Для их запуска обычно используется отдельная тестовая база данных, чтобы не затронуть продакшен-данные. Часто применяют легковесные in-memory БД (H2 для Java, SQLite) или управляемые контейнерами экземпляры (PostgreSQL в Docker). Процесс включает настройку тестового окружения, миграцию схемы и очистку данных перед/после каждого теста.

Длинный ответ

Интеграционные тесты проверяют корректность взаимодействия между различными модулями системы, такими как сервис приложения и база данных. Их запуск требует специальной подготовки окружения, чтобы тесты были изолированы, воспроизводимы и не влияли на рабочие данные.

Выбор базы данных для тестов

Основные подходы:

  • In-memory базы данных (H2, SQLite): Быстрые, не требуют внешних зависимостей, идеальны для CI/CD. Не всегда полностью повторяют поведение продакшен-БД.
  • Управляемые контейнерами БД (Postgres, MySQL в Docker): Запускаются в изолированном контейнере для каждого прогона тестов. Обеспечивают максимальное соответствие продакшену, но медленнее.
  • Выделенный тестовый инстанс в облаке или на сервере: Менее изолирован, требует тщательной очистки данных между тестами.

Типичный процесс запуска

Рассмотрим пример настройки для приложения на 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 гарантирует чистоту данных для каждого теста.

Ключевые практики

  • Изоляция: Каждый тестовый класс или метод должен работать с чистой БД, чтобы избежать побочных эффектов.
  • Миграции: Схема БД (таблицы, индексы) должна создаваться автоматически через инструменты миграции (Flyway, Liquibase) как часть настройки тестов.
  • Скорость: Используйте транзакции или TRUNCATE для быстрой очистки вместо удаления строк по одной.
  • CI/CD: В пайплайне убедитесь, что доступны Docker или права на запуск контейнеров для использования Testcontainers.

Вывод: Интеграционные тесты с БД стоит запускать на изолированной тестовой базе, максимально близкой к продакшену (лучше всего через контейнеризацию), чтобы гарантировать корректность работы с реальными SQL-запросами и транзакциями, не загрязняя рабочие данные.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Docker

    Docker

  • Testing

Ключевые слова

#integration testing

#test database

#test environment

#test setup

#database isolation

Подпишись на Java Developer в телеграм