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
метод.
Это особенно полезно при тестировании пользовательского интерфейса с помощью 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
аннотация означает, что аннотированный метод должен выполняться перед каждым тестовым методом, аналогично 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 @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() {
} }