Три дня назад мной был опубликован перевод: JUnit — создание отчетов в формате HTML
В комментарии к нему LeshaRB задал вопрос: "Это будет перевод всех статей цикла Junit5 - https://howtodoinjava.com/junit5/ или просто одна?"
В качестве ответа - эта публикация.
В этом туториале по JUnit 5 рассказывается о том, как JUnit адаптировал стиль кодирования Java 8 и некоторые другие функции. Узнайте, чем JUnit 5 отличается от JUnit 4.
JUnit 5 - наиболее широко используемая среда тестирования для приложений Java. JUnit долгое время отлично справлялся со своей задачей.
Между тем, JDK 8 привнес в java интересные функции и, в первую очередь, лямбда-выражения. JUnit 5 был нацелен на адаптацию стиля программирования Java 8; вот почему Java 8 является минимально необходимой версией для создания и выполнения тестов в JUnit 5 (хотя можно запускать тесты, написанные с помощью JUnit 3 или JUnit 4 для обратной совместимости).
Оглавление
Архитектура JUnit 5
Установка
Аннотации JUnit 5
Написание тестов
Написание наборов тестов
Утверждения
Предположения
Обратная совместимость для JUnit 4
Заключение
1. Архитектура JUnit 5
По сравнению с JUnit 4, JUnit 5 состоит из нескольких разных модулей из трех разных подпроектов:
JUnit 5 = Платформа JUnit + JUnit Jupiter + JUnit Vintage
JUnit Jupiter: включает новые модели программирования и расширения для написания тестов. В нем есть все новые аннотации junit и
TestEngine
реализация для запуска тестов, написанных с этими аннотациями.Платформа JUnit: чтобы иметь возможность запускать тесты junit, IDE, инструменты сборки или плагины должны включать и расширять API платформы. Он определяет
TestEngine
API для разработки новых фреймворков тестирования, работающих на платформе. Он также предоставляет средство запуска консоли для запуска платформы из командной строки и создания подключаемых модулей для Gradle и Maven.JUnit Vintage: его основная цель - поддерживать выполнение письменных тестов JUnit 3 и JUnit 4 на платформе JUnit 5. Это есть обратная совместимость.
2. Установка
Вы можете использовать JUnit 5 в своем проекте Maven или Gradle, включив как минимум следующие зависимости:
junit-jupiter-api: это основной модуль, в котором расположены все основные аннотации, такие как @Test, аннотации и утверждения метода жизненного цикла.
junit-jupiter-engine: он имеет реализацию тестового движка, которая требуется во время выполнения для выполнения тестов.
junit-platform-suite: поддержка @Suite, предоставляемая этим модулем, чтобы сделать средство запуска JUnitPlatform устаревшим.
pom.xml
<properties>
<junit.jupiter.version>5.8.1</junit.jupiter.version>
<junit.platform.version>1.8.1</junit.platform.version>
</properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>${junit.platform.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
build.gradle
build.gradledependencies {
testRuntime("org.junit.jupiter:junit-jupiter-api:5.8.1")
testRuntime("org.junit.jupiter:junit-jupiter-engine:5.8.1")
testRuntime("org.junit.jupiter:junit-jupiter-params:5.8.1")
testRuntime("org.junit.platform:junit-platform-suite:1.8.1")
}
test {
useJUnitPlatform()
}
Подробнее: пример Maven | Пример Gradle
3. Аннотации JUnit 5
JUnit 5 предлагает следующие аннотации для написания тестов.
Аннотации | Описание |
---|---|
| Аннотированный метод будет запускаться перед каждым тестовым методом в тестовом классе. |
| Аннотированный метод будет запускаться после каждого тестового метода в тестовом классе. |
| Аннотированный метод будет запущен перед всеми тестовыми методами в тестовом классе. Этот метод должен быть статическим. |
| Аннотированный метод будет запущен после всех тестовых методов в тестовом классе. Этот метод должен быть статическим. |
| Он используется, чтобы пометить метод как тест junit. |
| Используется для предоставления любого настраиваемого отображаемого имени для тестового класса или тестового метода |
| Он используется для отключения или игнорирования тестового класса или тестового метода из набора тестов. |
| Используется для создания вложенных тестовых классов |
| Пометьте методы тестирования или классы тестов тегами для обнаружения и фильтрации тестов. |
| Отметить метод - это тестовая фабрика для динамических тестов. |
4. Написание тестов
Между JUnit 4 и JUnit 5 нет больших различий в стилях написания тестов. Вот образцы тестов с их методами жизненного цикла.
Обратите внимание, что все аннотации взяты из пакета org.junit.jupiter.api.
JUnit 5 Tests
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import com.howtodoinjava.junit5.examples.Calculator;
public class AppTest {
@BeforeAll
static void setup(){
System.out.println("@BeforeAll executed");
}
@BeforeEach
void setupThis(){
System.out.println("@BeforeEach executed");
}
@Tag("DEV")
@Test
void testCalcOne()
{
System.out.println("======TEST ONE EXECUTED=======");
Assertions.assertEquals( 4 , Calculator.add(2, 2));
}
@Tag("PROD")
@Disabled
@Test
void testCalcTwo()
{
System.out.println("======TEST TWO EXECUTED=======");
Assertions.assertEquals( 6 , Calculator.add(2, 4));
}
@AfterEach
void tearThis(){
System.out.println("@AfterEach executed");
}
@AfterAll
static void tear(){
System.out.println("@AfterAll executed");
}
}
5. Написание наборов тестов
Используя наборы тестов JUnit 5, вы можете запускать тесты, распределенные по нескольким тестовым классам и различным пакетам. JUnit 5 предоставляет эти аннотации для создания наборов тестов.
@Suite
@SelectClasses
@SelectPackages
@IncludePackages
@ExcludePackages
@IncludeClassNamePatterns
@ExcludeClassNamePatterns
@IncludeTags
@ExcludeTags
Для выполнения пакета вам необходимо использовать @Suite
аннотацию и включить модуль junit-platform-suite в зависимости проекта.
@Suite
@SelectPackages("com.howtodoinjava.junit5.examples")
public class JUnit5TestSuiteExample
{
}
6. Assertions
Assertions (утверждения) позволяют сравнить ожидаемый результат с фактическим результатом теста.
Для того чтобы держать вещи простыми, все утверждения JUnit Jupiter являются static
методы в класса org.junit.jupiter.Assertions, например assertEquals()
, assertNotEquals()
.
void testCase()
{
//Test will pass
Assertions.assertNotEquals(3, Calculator.add(2, 2));
//Test will fail
Assertions.assertNotEquals(4, Calculator.add(2, 2), "Calculator.add(2, 2) test failed");
//Test will fail
Supplier<String> messageSupplier = () -> "Calculator.add(2, 2) test failed";
Assertions.assertNotEquals(4, Calculator.add(2, 2), messageSupplier);
}
Подробнее: JUnit 5 Assertions
7. Assumptions
Класс Assumptions (предположения) предоставляет static
методы для поддержки выполнения условного теста на основе предположений. Неуспешное предположение приводит к прерыванию теста.
Предположения обычно используются всякий раз, когда нет смысла продолжать выполнение данного метода тестирования. В отчете о тестировании эти тесты будут отмечены как пройденные.
Предположения класс имеет три таких методов: assumeFalse()
, assumeTrue()
и assumingThat()
public class AppTest {
@Test
void testOnDev()
{
System.setProperty("ENV", "DEV");
Assumptions.assumeTrue("DEV".equals(System.getProperty("ENV")), AppTest::message);
}
@Test
void testOnProd()
{
System.setProperty("ENV", "PROD");
Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
}
private static String message () {
return "TEST Execution Failed :: ";
}
}
Подробнее: JUnit 5 Assumptions
8. Обратная совместимость с JUnit 4
JUnit 4 существует уже довольно давно, и на junit 4 написано множество тестов. JUnit Jupiter также должен поддерживать эти тесты. Для этого был разработан подпроект JUnit Vintage.
JUnit Vintage предоставляет TestEngine
реализацию для запуска тестов на основе JUnit 3 и JUnit 4 на платформе JUnit 5.
9. Заключение
JUnit 5 кажется таким захватывающим и многофункциональным. И теперь он открыт для расширения сторонними инструментами и API. Как автор тестов, вы можете не чувствовать очень большой разницы, но, когда вы используете расширение или попытаетесь разработать плагин для IDE, вы его оцените.
Вы также можете рассмотреть возможность добавления тестовых шаблонов в Eclipse IDE, чтобы повысить скорость разработки как разработчика.
Хорошего изучения!!!
Скачать исходный код