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