Автор оригинала: Pankaj Kumar.
Учебник по JUnit 5
В этом уроке по Junit мы познакомим вас с основами JUnit 5 и его новыми функциями на примерах. В мире Java JUnit является одним из популярных фреймворков, используемых для реализации модульных тестов на Java-коде. JUnit в первую очередь помогает разработчикам самостоятельно тестировать свой код на JVM.
Архитектура JUnit 5
Платформа JUnit
- Запускает платформы тестирования на JVM
- Имеет API тестового движка, используемый для создания платформы тестирования, работающей на платформе JUnit
Юнит Юпитер
- Сочетание новой модели программирования для написания тестов и модели расширения для расширений
- Добавление новых аннотаций как
@до/|,
@после,
@после,
@дои т.д.
Джунит Винтаж
- Обеспечивает поддержку выполнения предыдущих тестов JUnit версии 3 и 4 на этой новой платформе
Зависимости JUnit Maven
Чтобы реализовать тестовые случаи на основе JUnit 5 в проекте, добавьте следующую зависимость в pom.xml файл проекта:
- Библиотека JUnit 5
- JUnit 5 maven надежный поставщик для выполнения модульных тестов, в которых среда IDE не поддерживает JUnit5 (если в среде IDE есть поддержка, этот пункт не требуется)
Новые функции JUnit 5
Для этого требуется Java 8 или выше во время выполнения. Но все равно можно протестировать код, скомпилированный с использованием предыдущих версий Java. В нем появились различные новые функции.
Аннотации JUnit
Ниже перечислены некоторые часто используемые аннотации, представленные в нем:
@Тест | Обозначает метод испытания |
@Имя дисплея | Объявляет пользовательское отображаемое имя для тестового класса или метода тестирования |
@Перед началом | Означает, что аннотированный метод должен выполняться перед каждым методом тестирования |
@После каждого | Означает, что аннотированный метод должен выполняться после каждого метода тестирования |
@Перед всем | Означает, что аннотированный метод должен выполняться перед всеми методами тестирования |
@После всего | Означает, что аннотированный метод должен выполняться после всех методов тестирования |
@Отключить | Используется для отключения тестового класса или метода тестирования |
@Вложенные | Означает, что аннотированный класс является вложенным нестатическим тестовым классом |
@Тег | Объявляйте теги для тестов фильтрации |
@Расширение с | Регистрация пользовательских расширений |
package com.journaldev; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; public class JUnit5Sample1Test { @BeforeAll static void beforeAll() { System.out.println("**--- Executed once before all test methods in this class ---**"); } @BeforeEach void beforeEach() { System.out.println("**--- Executed before each test method in this class ---**"); } @Test void testMethod1() { System.out.println("**--- Test method1 executed ---**"); } @DisplayName("Test method2 with condition") @Test void testMethod2() { System.out.println("**--- Test method2 executed ---**"); } @Test @Disabled("implementation pending") void testMethod3() { System.out.println("**--- Test method3 executed ---**"); } @AfterEach void afterEach() { System.out.println("**--- Executed after each test method in this class ---**"); } @AfterAll static void afterAll() { System.out.println("**--- Executed once after all test methods in this class ---**"); } }
Мы можем запустить выше тестовый класс JUnit в Eclipse -> Запуск от имени -> Тест JUnit .
Утверждения JUnit
Каждый метод тестирования должен быть оценен на соответствие условию true с использованием утверждений, чтобы тест мог продолжать выполняться. Утверждения JUnit Jupiter хранятся в классе org.junit.jupiter.api.Утверждения. Все методы статичны.
Критерии утверждения(ожидаемые, фактические) | Сбой, когда ожидаемое не равно фактическому |
assertFalse(выражение) | Сбой, если выражение не является ложным |
assertNull(фактический) | Сбой, когда фактическое значение не равно нулю |
assertNotNull(фактический) | Сбой, когда фактическое значение равно нулю |
утверждать Все() | Сгруппируйте множество утверждений, и каждое утверждение будет выполнено, даже если одно или несколько из них завершатся неудачей |
Утверждение(выражение) | Не удается, если выражение неверно |
assertThrows() | Ожидается, что тестируемый класс выдаст исключение |
@Test void testAssertEqual() { assertEquals("ABC", "ABC"); assertEquals(20, 20, "optional assertion message"); assertEquals(2 + 2, 4); } @Test void testAssertFalse() { assertFalse("FirstName".length() == 10); assertFalse(10 > 20, "assertion message"); } @Test void testAssertNull() { String str1 = null; String str2 = "abc"; assertNull(str1); assertNotNull(str2); } @Test void testAssertAll() { String str1 = "abc"; String str2 = "pqr"; String str3 = "xyz"; assertAll("numbers", () -> assertEquals(str1,"abc"), () -> assertEquals(str2,"pqr"), () -> assertEquals(str3,"xyz") ); //uncomment below code and understand each assert execution /*assertAll("numbers", () -> assertEquals(str1,"abc"), () -> assertEquals(str2,"pqr1"), () -> assertEquals(str3,"xyz1") );*/ } @Test void testAssertTrue() { assertTrue("FirstName".startsWith("F")); assertTrue(10 { throw new IllegalArgumentException("Illegal Argument Exception occured"); }); assertEquals("Illegal Argument Exception occured", exception.getMessage()); }
Импорт JUnit5
Его тестовые классы нуждаются в org.junit.jupiter.api.Проверьте
оператор импорта, а не org.junit.Тест
. Кроме того, методы тестирования не обязательно должны быть общедоступным и локальным пакетом.
import org.junit.jupiter.api.Test;
Предположения JUnit5
Предположения-это статические методы в классе org.junit.jupiter.api.Предположения
. Они выполнят тест только тогда, когда будет выполнено указанное условие, в противном случае тест будет прерван. Прерванный тест не приведет к сбою сборки. Когда предположение не выполняется, org.opentest4j.Исключение Прерывания теста
выбрасывается, и тест пропускается.
Предположим, что | Выполните тело lamda, когда положительное условие удержания теста будет пропущено |
предположим, что Ложно | Выполните тело lamda, когда отрицательное условие удержания, иначе тест будет пропущен |
предполагая, Что | Часть метода тестирования будет выполнена, если предположение верно, и все, что последует за лямбдой, будет выполнено независимо от предположения в предположении, что() выполняется |
@Test void testAssumeTrue() { boolean b = 'A' == 'A'; assumeTrue(b); assertEquals("Hello", "Hello"); } @Test @DisplayName("test executes only on Saturday") public void testAssumeTrueSaturday() { LocalDateTime dt = LocalDateTime.now(); assumeTrue(dt.getDayOfWeek().getValue() == 6); System.out.println("further code will execute only if above assumption holds true"); } @Test void testAssumeFalse() { boolean b = 'A' != 'A'; assumeFalse(b); assertEquals("Hello", "Hello"); } @Test void testAssumeFalseEnvProp() { System.setProperty("env", "prod"); assumeFalse("dev".equals(System.getProperty("env"))); System.out.println("further code will execute only if above assumption hold"); } @Test void testAssumingThat() { System.setProperty("env", "test"); assumingThat("test".equals(System.getProperty("env")), () -> { assertEquals(10, 10); System.out.println("perform below assertions only on the test env"); }); assertEquals(20, 20); System.out.println("perform below assertions on all env"); }
Вложенные тестовые классы JUnit
Вложенные тесты позволяют создавать вложенные классы и выполнять все его методы тестирования. Внутренние классы должны быть нестатическими. Просто аннотируйте внутренние классы с помощью @Nested, и все методы тестирования внутри него будут выполнены.
@BeforeAll static void beforeAll() { System.out.println("**--- JUnit5Sample4Test :: beforeAll :: Executed once before all test methods ---**"); } @BeforeEach void beforeEach() { System.out.println("**--- JUnit5Sample4Test :: beforeEach :: Executed before each test method ---**"); } @AfterEach void afterEach() { System.out.println("**--- JUnit5Sample4Test :: afterEach :: Executed after each test method ---**"); } @AfterAll static void afterAll() { System.out.println("**--- JUnit5Sample4Test :: afterAll :: Executed after all test method ---**"); } @Nested class InnerClass { @BeforeEach void beforeEach() { System.out.println("**--- InnerClass :: beforeEach :: Executed before each test method ---**"); } @AfterEach void afterEach() { System.out.println("**--- InnerClass :: afterEach :: Executed after each test method ---**"); } @Test void testMethod1() { System.out.println("**--- InnerClass :: testMethod1 :: Executed test method1 ---**"); } @Nested class InnerMostClass { @BeforeEach void beforeEach() { System.out.println("**--- InnerMostClass :: beforeEach :: Executed before each test method ---**"); } @AfterEach void afterEach() { System.out.println("**--- InnerMostClass :: afterEach :: Executed after each test method ---**"); } @Test void testMethod2() { System.out.println("**--- InnerMostClass :: testMethod2 :: Executed test method2 ---**"); } } }
Исключение из теста JUnit
Существуют ситуации, в которых ожидается, что методы выдадут исключение при определенном условии. assertThrows не пройдет тест, если данный метод не вызовет указанное исключение.
Throwable exception = assertThrows(IllegalArgumentException.class, () -> { throw new IllegalArgumentException("Illegal Argument Exception occured"); }); assertEquals("Illegal Argument Exception occured", exception.getMessage());
Выполнение теста JUnit
Модульные тесты могут выполняться многими способами, два из которых следующие:
- Используйте выпуск Eclipse IDE Oxygen.3a (4.7.3 a) и откройте тестовый файл для выполнения. Щелкните правой кнопкой мыши на файле и выберите опцию Запуск, за которой следует тест JUnit
- Используйте команду mvn test в командной строке Windows
Резюме
Мы рассмотрели JUnit 5 и его новые функции на нескольких примерах. Мы также рассмотрели, как мы можем использовать аннотации JUnit, утверждения, предположения, исключения и писать вложенные тестовые классы.