Аннотации JUnit 5 с примерами

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

Вы можете использовать как Maven, так и Gradle.

Если вы используете Maven, вам необходимо добавить следующую зависимость в свой pom.xml файл:



org.junit.jupiter
junit-jupiter-api
5.3.1
test


org.junit.jupiter
junit-jupiter-params
5.3.1
test

@JUnit 5 Аннотации

Вы заметите, что в Junit 5 одним из наиболее очевидных изменений является то, что тестовые классы и методы больше не должны быть общедоступными.

Теперь давайте рассмотрим список наиболее распространенных аннотаций JUnit 5.

@Контрольная работа

Эта аннотация означает, что метод является тестовым. Обратите внимание, что эта аннотация не принимает никаких атрибутов.



import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; class JUnit5Test {

@Test
void helloJUnit5() {
assertEquals(10, 5+5);
} }

@ParameterizedTest

Параметризованные тесты позволяют запускать тест несколько раз с разными аргументами. Они объявляются как обычные @Test методы, но используйте @ParameterizedTest аннотацию.

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

Например, в следующем примере демонстрируется параметризованный тест, в котором используется @ValueSource аннотация, чтобы указать массив String в качестве источника аргументов.

Пример:

import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import static org.junit.jupiter.api.Assertions.assertTrue; class JUnit5Test {
@ParameterizedTest
@ValueSource(strings = { 'cali', 'bali', 'dani' })
void endsWithI(String str) {
assertTrue(str.endsWith('i'));
} }

@RepeatedTest

JUnit 5 может повторять тест определенное количество раз, просто аннотируя метод с помощью @RepeatedTest и указание общего количества желаемых повторений.

Каждый вызов повторного теста ведет себя как выполнение обычного @Test метод.

Это особенно полезно при тестировании пользовательского интерфейса с помощью Selenium.

import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.RepetitionInfo; import org.junit.jupiter.api.TestInfo; import static org.junit.jupiter.api.Assertions.assertEquals; class JUnit5Test {

@RepeatedTest(value = 5, name = '{displayName} {currentRepetition}/{totalRepetitions}')
@DisplayName('RepeatingTest')
void customDisplayName(RepetitionInfo repInfo, TestInfo testInfo) {
int i = 3;
System.out.println(testInfo.getDisplayName() +

'-->' + repInfo.getCurrentRepetition()
);


assertEquals(repInfo.getCurrentRepetition(), i);
} }

Как видно из результата теста, когда i==3, тест проходит, в противном случае - нет.

@Отображаемое имя

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

Пример:

import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInfo; @DisplayName('DisplayName Demo') class JUnit5Test {
@Test
@DisplayName('Custom test name')
void testWithDisplayName() {
}
@Test
@DisplayName('Print test name')
void printDisplayName(TestInfo testInfo) {
System.out.println(testInfo.getDisplayName());
} }

@BeforeEach

@BeforeEach аннотация означает, что аннотированный метод должен выполняться перед каждым тестовым методом, аналогично JUnit 4's @Before.

Пример:

import org.junit.jupiter.api.*; class JUnit5Test {
@BeforeEach
void init(TestInfo testInfo) {
String callingTest = testInfo.getTestMethod().get().getName();
System.out.println(callingTest);
}
@Test
void firstTest() {
System.out.println(1);
}
@Test
void secondTest() {
System.out.println(2);
} }

Выход:

firstTest 1 secondTest 2

@AfterEach

Эта аннотация означает, что аннотированный метод должен выполняться после каждого тестового метода, аналогично JUnit 4's @After. Например, если тесты должны сбрасывать свойство после каждого теста, мы можем аннотировать метод с помощью @AfterEach для этой задачи.

import org.junit.jupiter.api.*; class JUnit5Test {
@Test
void firstTest() {
System.out.println(1);
}
@Test
void secondTest() {
System.out.println(2);
}
@AfterEach
void after(TestInfo testInfo) {
String callingTest = testInfo.getTestMethod().get().getName();
System.out.println(callingTest);
} }

Выход:

1 firstTest 2 secondTest

@BeforeAll

Эта аннотация выполняет метод перед всеми тестами. Это аналогично JUnit 4 @BeforeClass. @BeforeAll аннотация обычно используется для инициализации различных вещей для тестов.

Пример:

import org.junit.jupiter.api.*; class JUnit5Test {
@BeforeAll
static void init() {
System.out.println('Only run once before all tests');
}
@Test
void firstTest() {
System.out.println(1);
}
@Test
void secondTest() {
System.out.println(2);
} }

Выход:

Only run once before all tests 1 2

@После всего

@AfterAll аннотация используется для выполнения аннотированного метода только после выполнения всех тестов. Это аналогично JUnit 4's @AfterClass . Мы используем эту аннотацию, чтобы разорвать или завершить все процессы в конце всех тестов.

Пример:

import org.junit.jupiter.api.*; class JUnit5Test {
@Test
void firstTest() {
System.out.println(1);
}
@Test
void secondTest() {
System.out.println(2);
}
@AfterAll
static void after() {
System.out.println('Only run once after all tests');
} }

Выход:

1 2 Only run once after all tests

@Тег

Мы можем использовать эту аннотацию для объявления тегов для тестов фильтрации либо на уровне класса, либо на уровне метода.

@Tag аннотация полезна, когда мы хотим создать тестовый пакет с выбранными тестами.

Пример:

import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @Tag('smoke') class JUnit5Test {
@Test
@Tag('login')
void validLoginTest() {
}
@Test
@Tag('search')
void searchTest() {
} }

@Отключено

@Disabled аннотация используется для отключения или пропуска тестов на уровне класса или метода. Это аналогично JUnit 4's @Ignore.

При объявлении на уровне класса все @test методы пропускаются. Когда мы используем @Disabled на уровне метода отключен только аннотированный метод.

Пример:

@Disabled используется для отключения тестового класса:

import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @Disabled class DisabledClassDemo {
@Test
void testWillBeSkipped() {
} }

Пример:

@Disabled аннотация, используемая для отключения метода тестирования:

import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; class DisabledTestsDemo {
@Disabled
@Test
void testWillBeSkipped() {
}
@Test
void testWillBeExecuted() {
} }