Java: Автоматическое тестирование
Теория: JUnit
Когда тестов и файлов с тестами становится много, возникают новые вопросы. Как группировать тесты? Как запустить на выполнение все тесты из одной директории? Если их очень много и они долгие, можно ли запустить их параллельно?
Для решения этих вопросов используют специальные тестовые фреймворки. Они помогают организовать структуру тестов и дают много полезного, например, удобный вывод. С большинством из этих возможностей мы познакомимся далее по курсу. В Java мире наиболее популярен фреймворк JUnit. К слову, с помощью него мы тестируем все ваши решения на этом курсе.
А что с AssertJ?
AssertJ - отличная библиотека для тестов, но это именно библиотека. Она предоставляет большое количество классов и методов, с помощью которых вы можете делать проверки. Однако точкой входа в вашу программу и тесты останется всё тот же метод main(). То есть тестирование с AssertJ, в общем случае, становится неотъемлемой и неотделимой частью программы. Это просто методы, которые вызываются по ходу выполнения программы.
JUnit - это уже фреймворк. Он обладает своей собственной точкой входа (классом/методом, с которого начинается выполнение тестов), что делает его фактически второй программой, которая живёт отдельно от вашего основного кода. Это позволяет, в частности, не включать тесты в итоговую сборку проекта. Кроме того, JUnit обладает целым рядом дополнительных преимуществ, например:
- параллельный запуск тестов
- подготовка данных
- создание динамических тестов
- и многое, многое другое
Подключение
JUnit интегрирован в процесс создания проекта на Gradle. Во время инициализации проекта, Gradle попросит выбрать тестовый фреймворк:
Полный процесс инициализации Gradle-проекта описан тут. В результате получится такая структура.
Теперь можно создавать классы и тестировать их. Создадим класс SomeClass со статическим методом sum(), который находит сумму двух чисел:
Класс SomeClassTest.java с тестами для метода sum будет выглядеть следующим образом:
Аннотация @Test "показывает" фреймворку, что этот метод является тестом, а класс Assertions является основным для большинства тестовых методов.
Этого достаточно, чтобы создать простейший Gradle-проект с JUnit5 в качестве тестового фреймворка. Создайте подобный проект на своём компьютере и наберите ./gradlew test в терминале для запуска тестов. JUnit5 сам найдёт все методы помеченные аннотацией @Test и, если хотя бы в одном из них тесты не пройдут, то выполнение завершится с ошибкой.

