Нет изоляции данных (No Data Isolation)

Тест создаёт данные в системе и не убирает их после завершения. Накопленный «мусор» нарушает последующие тесты, особенно те, которые проверяют списки, подсчёты или уникальность.

Симптомы

  • Нет @AfterEach с удалением созданных данных
  • Тест создаёт запись в БД / через API, но не удаляет при teardown
  • Тест search("Тестовый товар") возвращает 5 результатов вместо 1 — предыдущие прогоны не почистились
  • При повторном запуске тест падает из-за нарушения уникального constraint
  • В тестовой БД накапливаются тысячи Тестовый пользователь_1, Тестовый пользователь_2, ...

Причины возникновения

  • Создать данные легко, убрать — нужно писать дополнительный код
  • «Тестовая база — одноразовая, потом снесём»; база живёт годами
  • Незнание @AfterEach, @AfterAll, транзакционных откатов
  • Нет общего соглашения по жизненному циклу тестовых данных

Почему это проблема

  • Загрязнение среды: следующий прогон — или следующий тест — получает неожиданное состояние
  • Нестабильность: тест зелёный с первого запуска и красный со второго — флаки
  • Нельзя запускать параллельно: несколько потоков создают данные, мешают друг другу
  • Бесполезная диагностика: падение вызвано мусором от другого теста, а не реальным дефектом

Решение

Явная очистка в @AfterEach или транзакционный откат для интеграционных тестов:

// ❌ данные остаются
adminPage.createProduct("Тестовый товар", 999);
assertThat(catalogPage.search("Тестовый товар")).hasSize(1);

// ✅ cleanup в @AfterEach
@AfterEach
void cleanup() {
    if (createdProductId != null) {
        productApi.delete(createdProductId);
    }
}