Основы JUnit 5 - Предварительный просмотр

1. Обзор

JUnit - одна из самых популярных платформ модульного тестирования для Java, поэтому в сообществе разработчиков появляются большие проблемы, когда выходят новые основные версии. Альфа-версия JUnit 5 была выпущена в начале февраля и содержит ряд интересных нововведений.

В этой статье будут рассмотрены новые функции этого выпуска и основные отличия от предыдущих версий.

2. Зависимости и настройка

Установка JUnit 5 довольно проста. Просто добавьте следующую зависимость в ваш pom.xml :

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.1.0</version>
    <scope>test</scope>
</dependency>

Однако на данный момент ни одна среда IDE не поддерживает JUnit 5, поэтому вам также придется указать скрипт сборки:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19.1</version>
    <dependencies>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-surefire-provider</artifactId>
            <version>1.0.2</version>
        </dependency>
    </dependencies>
</plugin>

Важно отметить, что эта версия требует Java 8 для работы .

При создании теста убедитесь, что вы импортировали org.junit.jupiter.api.Test

3. Что нового

JUnit 5 пытается в полной мере воспользоваться новыми возможностями Java 8, особенно лямбда-выражениями.

3.1. Утверждения

Утверждения были перемещены в org.junit.jupiter.api.Assertions и значительно улучшены. Как упоминалось ранее, теперь вы можете использовать лямбда-выражения в утверждениях:

@Test
void lambdaExpressions() {
    assertTrue(Stream.of(1, 2, 3)
      .stream()
      .mapToInt(i -> i)
      .sum() > 5, () -> "Sum should be greater than 5");
}

Хотя приведенный выше пример является тривиальным, одно из преимуществ использования лямбда-выражения для сообщения подтверждения состоит в том, что оно лениво оценивается, что может сэкономить время и ресурсы, если построение сообщения является дорогостоящим.

Также теперь возможно группировать утверждения с помощью assertAll () , который сообщит о любых неудачных утверждениях в группе с помощью MultipleFailuresError :

 @Test
 void groupAssertions() {
     int[]numbers = {0, 1, 2, 3, 4};
     assertAll("numbers",
         () -> assertEquals(numbers[0], 1),
         () -> assertEquals(numbers[3], 3),
         () -> assertEquals(numbers[4], 1)
     );
 }

Это означает, что теперь безопаснее делать более сложные утверждения, поскольку вы сможете точно определить точное местоположение любого отказа.

3.2. Предположения

Допущения используются для запуска тестов только при соблюдении определенных условий.

Это обычно используется для внешних условий, которые необходимы для правильной работы теста, но которые не имеют прямого отношения к тому, что тестируется.

Вы можете объявить предположение с помощью assumeTrue () , assumeFalse () и assumingThat () .

@Test
void trueAssumption() {
    assumeTrue(5 > 1);
    assertEquals(5 + 2, 7);
}

@Test
void falseAssumption() {
    assumeFalse(5 < 1);
    assertEquals(5 + 2, 7);
}

@Test
void assumptionThat() {
    String someString = "Just a string";
    assumingThat(
        someString.equals("Just a string"),
        () -> assertEquals(2 + 2, 4)
    );
}

Если предположение не выполняется, генерируется TestAbortedException и тест просто пропускается.

Предположения также понимают лямбда-выражения.

3.3. Исключения

JUnit 5 улучшает поддержку исключений. Был добавлен метод assertThrows () , который проверяет, что выражение выбрасывает выражение данного типа:

@Test
void shouldThrowException() {
    Throwable exception = assertThrows(UnsupportedOperationException.class, () -> {
      throw new UnsupportedOperationException("Not supported");
    });
    assertEquals(exception.getMessage(), "Not supported");
}

Как показывает пример, JUnit 5 предлагает больший контроль над генерируемыми исключениями, чем JUnit 4. Наиболее очевидным выводом является то, что теперь можно легко получить любую информацию, которая может нам понадобиться об исключении, как мы сделали в нашем примере, изучив сообщение об исключении.

3.4. Вложенные тесты

Вложенные тесты были добавлены, чтобы позволить разработчикам выражать сложные отношения между различными группами тестов. Синтаксис довольно прост - все, что вам нужно сделать, это аннотировать внутренний класс с помощью @Nested.

Документация JUnit предлагает подробный example , иллюстрирующий одно из возможных применений.

3.5. Отключение тестов

Теперь тесты можно отключить с помощью аннотации @ Disabled .

@Test
@Disabled
void disabledTest() {
    assertTrue(false);
}

Этот тест не будет запущен. Аннотация @ Disabled может быть применена либо к тестовому примеру, либо к тестовому методу и эквивалентна @ Ignore из JUnit 4.

3.6. Пометка

Теги являются заменой Categories из JUnit 4. Теги могут применяться с аннотацией @ Tag Это позволяет разработчикам группировать и фильтровать тесты.

@Tag("Test case")
public class TaggedTest {

    @Test
    @Tag("Method")
    void testMethod() {
        assertEquals(2+2, 4);
    }
}

4. Заключение

В обзоре был краткий обзор изменений, которые появятся в JUnit 5.

Важно отметить, что на момент написания статьи была доступна только сборка Alpha, поэтому некоторые вещи могут еще измениться до выпуска.

Примеры, используемые в этой статье, можно найти в linked проекте GitHub .