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();