Посторонняя информация (Irrelevant Information)
Тест заполняет поля объекта, не имеющие никакого отношения к проверяемому поведению. Лишние данные скрывают суть теста и затрудняют понимание того, что именно проверяется.
Симптомы
- Builder с 8+ полями, тогда как поведение зависит от 1–2
- Тест проверяет статус нового заказа, но заполняет адрес доставки, способ оплаты, промокод и комментарий
- Случайные или захардкоженные значения, которые не влияют на assert
- Трудно ответить на вопрос «зачем это поле?» при чтении теста
Причины возникновения
- Конструктор или Builder требует обязательных полей — разработчик заполняет всё доступное
- Копипаста из другого теста, где поля были значимы
- Нет фабрики с разумными дефолтами — приходится задавать всё вручную
- Стремление к «реалистичности» данных, хотя тест проверяет конкретную деталь
Почему это проблема
- Скрытая суть: читая тест с 8 полями в билдере, непонятно, что из них важно для проверки
- Ложная зависимость: кажется, что тест зависит от адреса или промокода, хотя это не так
- Сложность изменений: при изменении модели нужно обновлять даже те тесты, где поле не важно
- Нарушение принципа единственной причины изменения: тест меняется из-за нерелевантных полей
Решение
Указывать только поля, значимые для проверяемого поведения; остальное — дефолты через фабрику:
// ❌ 8 полей, хотя проверяем только статус
Order order = Order.builder()
.customerId(42L).productId(7L).quantity(3)
.shippingAddress("Москва, Тверская, 1")
.paymentMethod("CARD").promoCode("SUMMER2024")
.comment("Позвоните перед доставкой").build();
assertEquals(OrderStatus.PENDING, order.getStatus());
// ✅ только значимые поля
Order order = Order.builder()
.customerId(42L).productId(7L).quantity(1).build();
assertThat(order.getStatus()).isEqualTo(OrderStatus.PENDING);