Дублирование данных (Data Clones)
Тестовые объекты (User, Address, Order) создаются вручную с одинаковыми значениями в каждом тест-классе или тест-методе. Любое изменение модели требует правки в десятках мест.
Симптомы
- Одинаковые конструкторы
new User("Ivan", "Petrov", "ivan@test.com", ...)в нескольких тест-файлах - Копипаста блоков создания объектов между классами
- При изменении конструктора модели — компиляционная ошибка в 20+ местах
- Нет классов
*Factory,*Builder,*Motherв тестовом коде
Причины возникновения
- Каждый тест писался отдельно без мысли о переиспользовании
- «Проще скопировать, чем абстрагировать»
- Отсутствие договорённости о тестовых фабриках в команде
- Торопливость: создание фабрики кажется лишними затратами времени
Почему это проблема
-
Хрупкость к изменениям модели: добавили обязательное поле в
User— нужно обновить 30 тестов -
Несогласованность данных: в тесте A пользователь с email
ivan@test.com, в тесте B — тот же email, конфликт в БД - Неуникальность: захардкоженный email нарушает уникальный constraint при параллельном запуске
- Трудно найти все места: grep по строке покажет не всё из-за вариаций в форматировании
Решение
Централизованные фабрики с разумными дефолтами и уникальными значениями:
// ❌ копипаста в каждом тесте
User user = new User("Ivan", "Petrov", "ivan@test.com", "+79990000001");
// ✅ фабрика с уникальным email
public static User defaultUser() {
return User.builder()
.firstName("Ivan").lastName("Petrov")
.email("ivan+" + UUID.randomUUID() + "@test.com")
.build();
}