Рубрики
Без рубрики

Учебник по JUnit 5

Учебник по JUnit, учебник по Junit 5, зависимость Junit maven, пример теста JUnit, пример junit, модульный тест java, аннотации JUnit, исключение теста junit, утверждение JUnit, Junit 5, Затмение JUnit, предположения JUnit, вложенный класс Junit

Автор оригинала: 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, утверждения, предположения, исключения и писать вложенные тестовые классы.