Перейти к основному содержимому

Использование JUnit 5 с Gradle

· 4 мин. чтения

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 . Не стесняйтесь использовать его в качестве отправной точки для вашего собственного проекта.