1. Обзор
В этом руководстве мы собираемся запустить тесты на новой платформе JUnit 5 с помощью инструмента сборки Gradle.
Мы настроим проект, который поддерживает как старую, так и новую версию.
Не стесняйтесь читать Руководство по JUnit 5 для получения дополнительной информации о новой версии. Или Введение в Gradle для получения подробной информации об инструменте сборки.
2. Настройка Грейдла
Во-первых, мы проверяем, установлена ли версия 4.6 или более поздняя версия инструмента сборки, поскольку это самая ранняя версия, которая работает с JUnit 5.
Самый простой способ — просто запустить команду gradle -v
:
$> gradle -v
------------------------------------------------------------
Gradle 4.10.2
------------------------------------------------------------
И, при необходимости, мы можем выполнить шаги установки , чтобы получить нужную версию.
После того, как мы все установили, нам нужно настроить Gradle с помощью файла build.gradle
.
Мы можем начать с предоставления платформы модульного тестирования инструменту сборки:
test {
useJUnitPlatform()
}
Теперь, когда мы указали платформу, нам нужно предоставить зависимости JUnit. Здесь мы видим заметную разницу между JUnit 5 и более ранними версиями.
Видите ли, в более ранних версиях нам нужна была только одна зависимость. Однако в JUnit 5 API отделен от среды выполнения, что означает наличие двух зависимостей.
API манифестируется с помощью junit-jupiter-api
. Средой выполнения является junit-jupiter-engine
для JUnit 5 и junit-vintage-engine
для JUnit 3 или 4.
Мы добавим эти два в testImplementation
и timeRuntimeOnly
соответственно:
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}
3. Создание тестов
Давайте напишем наш первый тест. Выглядит так же, как и более ранние версии:
@Test
public void testAdd() {
assertEquals(42, Integer.sum(19, 23));
}
Теперь мы можем запустить тест, выполнив команду gradle clean test
.
Чтобы убедиться, что мы используем JUnit 5, мы можем просмотреть импорт. Импорт для @Test
и assertEquals
должен иметь пакет, начинающийся с org.junit.jupiter.api:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
Итак, в последнем примере мы создали тест со «старым» функционалом, который работал годами. Теперь мы создадим еще один пример, в котором используются некоторые новые функции JUnit 5:
@Test
public void testDivide() {
assertThrows(ArithmeticException.class, () -> {
Integer.divideUnsigned(42, 0);
});
}
assertThrows
— это новое утверждение в JUnit5, которое заменяет старый стиль @Test(expected=ArithmeticException.class).
4. Настройка тестов JUnit 5 с помощью Gradle
Далее мы рассмотрим более глубокую интеграцию между Gradle и JUnit5.
Допустим, у нас есть два типа тестов в нашем наборе: долгосрочные и краткосрочные. Мы могли бы использовать аннотацию JUnit 5 @Tag
:
public class CalculatorJUnit5Test {
@Tag("slow")
@Test
public void testAddMaxInteger() {
assertEquals(2147483646, Integer.sum(2147183646, 300000));
}
@Tag("fast")
@Test
public void testDivide() {
assertThrows(ArithmeticException.class, () -> {
Integer.divideUnsigned(42, 0);
});
}
}
Затем мы сообщаем инструменту сборки, какие из них выполнять. В нашем случае давайте просто выполним короткие (быстрые) тесты:
test {
useJUnitPlatform {
includeTags 'fast'
excludeTags 'slow'
}
}
5. Включение поддержки старых версий
Теперь все еще можно создавать тесты JUnit 3 и 4 с новым движком Jupiter. Более того, мы можем смешать их с новой версией в одном проекте, скажем, в сценарии миграции.
Для начала добавим некоторые зависимости к существующей конфигурации сборки:
testCompileOnly 'junit:junit:4.12'
testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.8.1'
Обратите внимание, что в нашем проекте теперь есть как junit-jupiter-engine
, так и junit-vintage-engine.
Теперь мы создаем новый класс и копируем созданный ранее метод testDivide .
Затем мы добавляем импорт для @Test
и assertEquals
. Однако на этот раз мы обязательно используем старые пакеты версии 4, начиная с которых org.junit:
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class CalculatorJUnit4Test {
@Test
public void testAdd() {
assertEquals(42, Integer.sum(19, 23));
}
}
6. Заключение
В этом руководстве мы интегрировали Gradle с JUnit 5. Более того, мы также добавили поддержку версий 3 и 4.
Мы видели, что инструмент сборки обеспечивает отличную поддержку старых и новых версий. Следовательно, мы можем использовать новые функции в существующем проекте без необходимости изменять все наши существующие тесты.
Полный пример кода доступен в проекте GitHub . Не стесняйтесь использовать его в качестве отправной точки для вашего собственного проекта.