Java: Автоматическое тестирование

Теория: JUnit

Когда тестов и файлов с тестами становится много, возникают новые вопросы. Как группировать тесты? Как запустить на выполнение все тесты из одной директории? Если их очень много и они долгие, можно ли запустить их параллельно?

Для решения этих вопросов используют специальные тестовые фреймворки. Они помогают организовать структуру тестов и дают много полезного, например, удобный вывод. С большинством из этих возможностей мы познакомимся далее по курсу. В Java мире наиболее популярен фреймворк JUnit. К слову, с помощью него мы тестируем все ваши решения на этом курсе.

А что с AssertJ?

AssertJ - отличная библиотека для тестов, но это именно библиотека. Она предоставляет большое количество классов и методов, с помощью которых вы можете делать проверки. Однако точкой входа в вашу программу и тесты останется всё тот же метод main(). То есть тестирование с AssertJ, в общем случае, становится неотъемлемой и неотделимой частью программы. Это просто методы, которые вызываются по ходу выполнения программы.

JUnit - это уже фреймворк. Он обладает своей собственной точкой входа (классом/методом, с которого начинается выполнение тестов), что делает его фактически второй программой, которая живёт отдельно от вашего основного кода. Это позволяет, в частности, не включать тесты в итоговую сборку проекта. Кроме того, JUnit обладает целым рядом дополнительных преимуществ, например:

  • параллельный запуск тестов
  • подготовка данных
  • создание динамических тестов
  • и многое, многое другое

Подключение

JUnit интегрирован в процесс создания проекта на Gradle. Во время инициализации проекта, Gradle попросит выбрать тестовый фреймворк:

Select test framework:
  1: JUnit 4
  2: TestNG
  3: Spock
  4: JUnit Jupiter # Нужно выбрать этот вариант. Это JUnit 5
Enter selection (default: JUnit Jupiter) [1..4]

Полный процесс инициализации Gradle-проекта описан тут. В результате получится такая структура.

Теперь можно создавать классы и тестировать их. Создадим класс SomeClass со статическим методом sum(), который находит сумму двух чисел:

class SomeClass {
    public static int sum(int a, int b) {
        return a + b;
    }
}

Класс SomeClassTest.java с тестами для метода sum будет выглядеть следующим образом:

import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;

class SomeClassTest {

    @Test
    public void testSum() {
        var expected = 5;
        var actual = SomeClass.sum(3, 2);
        assertEquals(expected, actual);
    }
}

Аннотация @Test "показывает" фреймворку, что этот метод является тестом, а класс Assertions является основным для большинства тестовых методов.

Этого достаточно, чтобы создать простейший Gradle-проект с JUnit5 в качестве тестового фреймворка. Создайте подобный проект на своём компьютере и наберите ./gradlew test в терминале для запуска тестов. JUnit5 сам найдёт все методы помеченные аннотацией @Test и, если хотя бы в одном из них тесты не пройдут, то выполнение завершится с ошибкой.

Рекомендуемые программы