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.
Тази анотация означава, че методът е тестов метод. Имайте предвид, че тази анотация не приема никакви атрибути.
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; class JUnit5Test {
@Test
void helloJUnit5() {
assertEquals(10, 5+5);
} }
Параметризираните тестове дават възможност за провеждане на тест няколко пъти с различни аргументи. Те са декларирани точно като обикновени @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'));
} }
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
, тестът преминава, в противен случай се проваля.
Тестовите класове и тестовите методи могат да декларират персонализирани имена на дисплея, които ще се показват от тестовите бегачи и тестовите отчети.
Пример:
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
анотацията означава, че анотираният метод трябва да се изпълнява преди всеки тестов метод, аналогично на 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
Тази анотация означава, че анотираният метод трябва да се изпълнява след всеки тестов метод, аналогично на 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
Тази анотация изпълнява метод преди всички тестове. Това е аналог на 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
анотацията е полезна, когато искаме да създадем тестов пакет с избрани тестове.
Пример:
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() {
} }