Java: Автоматическое тестирование
Теория: Библиотека AssertJ
Встроенный в Java механизм проверки утверждений assert обладает рядом недостатков:
- Вы не можете быть уверены что он сработает в любой ситуации. Если запустить программу без аргумента
-enableassertions(-ea), то проверки будут игнорироваться. Поэтому полагаться наassertв полной мере нельзя. - Сами проверки сильно ограничены. После ключевого слова
assertможет быть только либоtrue, либоfalse, а это значит что вам необходимо сначала самостоятельно подготовить данные к проверке. - Результат проверки неинформативен. Вам вернётся только сообщение об ошибке с указанием номера строки и имени класса в котором произошла ошибка. Да, есть вариант передать текстовое сообщение вместе с ошибкой, но так не делают, потому что это слишком "ручной" способ, требующий больших усилий.
В результате всё это привело к тому, что ключевым словом assert практически не пользуются. Более того, далеко не все Java-программисты смогут быстро ответить почему они иногда срабатывают, а иногда нет. Однако, это был отличный переход от использования if для проверки утверждения и ручного пробрасывания ошибок, к более чистому и понятному коду.
Сегодня мы рассмотрим библиотеку AssertJ, которая позволяет гораздо проще и удобнее писать тесты, а также получать достаточно информативный вывод об ошибках. При этом внутри будет всё равно лежать тот же самый механизм, который мы рассматривали в предыдущих уроках.
AssertJ не входит в перечень стандартных библиотек, но её можно подключить к вашему проекту как любую другую стороннюю библиотеку:
Точкой входа будет являться метод assertThat(), его можно импортировать вот так:
Написание тестов с использованием библиотеки AssertJ отличается от использования ключевого слова assert и базируется на цепочке методов. Такой подход называется fluent API. Давайте рассмотрим пример теста, написанного с использованием этой библиотеки:
Теперь тест превращается в связный текст на английском языке. Его можно прочитать следующим образом: Assert that a is equal to b, что дословно можно перевести как "Утверждаем, что a равно b". В случае если утверждение окажется ложным, то будет выброшено AssertionFailedError из библиотеки org.opentest4j.AssertionFailedError. Вывод тестов также будет сформулирован как связный текст на английском языке. Например, если в предыдущем примере мы возьмём String b = "Hello, world", то получим следующее сообщение об ошибке:
В первой строке мы видим сообщение о проброшенной ошибке, а далее текст, который можно перевести как: "Ожидали, что Hello, world! будет равен "Hello, world", но это оказалось не так". Ниже отдельно вынесены ещё раз "ожидание/реальность". Такой вывод об ошибках читать уже гораздо приятнее, он является куда более информативным.

