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

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

1. обзор

В этом руководстве мы собираемся запустить тесты на новой платформе JUnit 5 с помощью инструмента сборки Gradle.

Мы настроим проект, поддерживающий как старую, так и новую версию.

Не стесняйтесь читатьA Guide to JUnit 5 для получения дополнительной информации о новой версии. ИлиIntroduction to Gradle для получения подробной информации об инструменте сборки.

2. Настройка Gradle

Во-первых, мы проверяем, установлена ​​ли версия 4.6 или выше инструмента сборки, поскольку это самая ранняя версия, которая работает с JUnit 5.

Самый простой способ - просто запустить командуgradle -v:

$> gradle -v
------------------------------------------------------------
Gradle 4.10.2
------------------------------------------------------------

И, при необходимости, мы можем выполнить шагиinstallation, чтобы получить нужную версию.

После того, как мы все установили, нам нужно настроить Gradle с помощью файлаbuild.gradle.

Мы можем начать с предоставления платформы модульного тестирования для инструмента сборки:

test {
    useJUnitPlatform()
}

Теперь, когда мы указали платформу, нам нужно предоставить зависимости JUnit. Именно здесь мы видим заметную разницу между JUnit 5 и более ранними версиями.

Видите ли, с более ранними версиями нам нужна была только одна зависимость. In JUnit 5, though, the API is separated from the runtime, meaning two dependencies.с

API проявляется какjunit-jupiter-api. Время выполнения -junit-jupiter-engine для JUnit 5 иjunit-vintage-engine для JUnit 3 или 4.

Мы введем эти два значения вtestImplementation andtimeRuntimeOnly соответственно:

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.3.1'
}

3. Создание тестов

Напишем наш первый тест. Это выглядит так же, как более ранние версии:

@Test
public void testAdd() {
    assertEquals(42, Integer.sum(19, 23));
}

Теперьwe can run the test by executing the gradle clean test command.

Чтобы убедиться, что мы используем JUnit 5, мы можем посмотреть импорт. The imports for @Test and assertEquals should have a package starting with 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);
        });
    }
}

Then, we tell the build tool which ones to execute. В нашем случае давайте просто выполним краткосрочные (быстрые) тесты:

test {
    useJUnitPlatform {
        includeTags 'fast'
        excludeTags 'slow'
    }
}

5. Включение поддержки старых версий

Now, it’s still possible to create JUnit 3 and 4 tests with the new Jupiter engine. Более того, мы можем смешивать их с новой версией в том же проекте, например, в сценарии миграции.

Для начала добавим некоторые зависимости в существующую конфигурацию сборки:

testCompileOnly 'junit:junit:4.12'
testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.3.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 project. Не стесняйтесь использовать его как отправную точку для вашего собственного проекта.