Assertion Roulette

Один тест-метод содержит множество не связанных между собой проверок assert. При падении первой проверки остальные не выполняются — неизвестно, сломалось ли что-то ещё.

Симптомы

  • 5+ вызовов assertEquals/assertTrue/assertThat в одном @Test-методе
  • Проверки независимы друг от друга (разные поля, разные аспекты поведения)
  • Сообщение об ошибке из первого assert ничего не говорит об остальных
  • Тест называется checkUserProfile(), verifyOrderData() — слишком широко

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

  • Стремление проверить «всё сразу» в одном тесте, чтобы не писать много тестов
  • Непонимание принципа «один тест — одно поведение»
  • Экономия на фикстуре: «раз уж открыли страницу, проверим всё»
  • Нет договорённости о структуре тестов в команде

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

  • Неполная информация о дефекте: упал 1-й assert из 10 — остальные 9 неизвестны. Нужно чинить, перезапускать, снова чинить
  • Размытая ответственность: непонятно, что именно тестирует этот тест
  • Тяжёлая диагностика: при красном тесте надо читать весь метод, чтобы понять, что проверяется
  • Трудно поддерживать: добавление новой проверки раздувает и без того большой тест

Решение

Разбить на отдельные тесты или использовать SoftAssertions:

// ❌
assertEquals("Иван Петров", profile.getFullName());
assertEquals("ivan@test.com", profile.getEmail());
assertTrue(profile.isActive());
// первый упавший — стоп, остальные не выполнятся

// ✅ SoftAssertions — все ошибки собираются вместе
SoftAssertions soft = new SoftAssertions();
soft.assertThat(profile.getFullName()).isEqualTo("Иван Петров");
soft.assertThat(profile.getEmail()).isEqualTo("ivan@test.com");
soft.assertThat(profile.isActive()).isTrue();
soft.assertAll();