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 метод.

Това е особено полезно при тестване на потребителски интерфейс със селен.


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, тестът преминава, в противен случай се проваля.

@DisplayName

Тестовите класове и тестовите методи могат да декларират персонализирани имена на дисплея, които ще се показват от тестовите бегачи и тестовите отчети.

Пример:


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’s @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

Можем да използваме тази анотация, за да декларираме тагове за филтриране на тестове, на ниво клас или метод.

@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() {
} }