Посторонняя информация (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);