JUnit Анотація тестових випадків @Before @BeforeClass

⚡ Розумний підсумок

JUnit є найпоширенішим фреймворком для модульного тестування Java, а його анотації тестових фікстур контролюють, що саме відбувається до та після виконання кожного тестового методу всередині тестового класу.

  • 🔘 Кріплення: Тестовий фікстурний елемент — це фіксований контекст об'єктів та ресурсів, у яких виконується тестовий випадок.
  • ☑️ Установка: @Before виконується перед кожним тестовим методом, тоді як @BeforeClass виконується один раз перед усім класом.
  • Зрив: @After виконується після кожного тесту, навіть якщо тест викидає відповідну інформацію або твердження не вдається.
  • 🧪 замовлення: Спочатку виконується суперклас @Before, потім підклас @Before, @Test, а потім кожен @After.
  • 🛠️ Бігун: JUnitCore.runClasses() виконує тестові класи та повертає об'єкт Result, який містить кожну помилку.
  • 📊 JUnit 5: @Before, @After, @BeforeClass та @AfterClass стають @BeforeEach, @AfterEach, @BeforeAll та @AfterAll.

JUnit тестовий фікстур з анотаціями @Before та @BeforeClass

JUnit є найпопулярнішою одиницею Тестування каркас в Java. Це однозначно рекомендовано для Unit Testing. JUnit не потребує сервера для тестування веб-застосунку, що пришвидшує процес тестування.

Команда JUnit фреймворк також дозволяє швидко та легко створювати тестові випадки та тестові дані. The org.junit пакет складається з багатьох інтерфейсів та класів для JUnit тестування, таке як Test, Assert, After та Before. Ширше JUnit сім'я будується на цих самих будівельних блоках.

Що таке випробувальний пристрій?

Перш ніж ми зрозуміємо, що таке тестовий фікстур, давайте вивчимо код нижче.

Цей код призначений для виконання двох тестів на простому файлі.

public class OutputFileTest {
    private File output; 
    output = new File(...);
    output.delete(); 
public void testFile1(){
        //Code to verify Test Case 1
}
    output.delete();
    output = new File(...);
public void testFile2(){
        //Code to verify Test Case 2
}
 output.delete(); 
}

Тут кілька питань

  • Код не читається.
  • Код непросто підтримувати.
  • Якщо набір тестів складний, код може містити логічні проблеми.

Порівняйте той самий код за допомогою JUnit.

public class OutputFileTest		
{
    private File output; 
    @Before public void createOutputFile() 
    { 
       output = new File(...);
    }
  
	@After public void deleteOutputFile() 
    {
        output.delete(); 
    } 
     
    @Test public void testFile1() 
    {
       // code for test case objective
    } 
	@Test public void testFile2() 
    {
       // code for test case objective
    }
}

Код набагато легше читається та підтримується. Наведена вище структура коду є випробувальне пристосування.

Тестовий прилад – це контекст, де a JUnit Тестовий випадок біжить. Як правило, тестові прилади включають:

  • Об’єкти або ресурси, доступні для будь-якого тесту.
  • Необхідні дії, які роблять ці об'єкти та ресурси доступними.
  • Ці заходи є
    1. розподіл (установка)
    2. де-розподіл (розрив).

Налаштування та демонтаж

Розклад матчів важливий, тому що JUnit запускає ці гачки навколо кожного тесту.

  • Зазвичай є кілька повторюваних завдань, які необхідно виконати перед кожним тестом. приклад: створити підключення до бази даних.
  • Так само в кінці кожного тесту можуть бути повторювані завдання. приклад: щоб очистити після завершення виконання тесту.
  • JUnit надає анотації, які допомагають у налаштуванні та демонтажі. Це гарантує, що ресурси вивільняються, а тестова система готова до наступного тестового випадку.

Ці JUnit Анотації обговорюються нижче.

Setup

@Раніше анотація в JUnit використовується в методі, що містить Java код, який потрібно виконувати перед кожним тестовим випадком, тобто він виконується перед кожним виконанням тесту.

Розбирання (незалежно від вироку)

@Після анотація використовується для методу, що містить Java код для виконання після кожного тестового випадку. Ці методи працюватимуть, навіть якщо в тестовому випадку будуть викинуті будь-які винятки або у випадку невдалих тверджень.

Примітка:

  • Дозволено мати будь-яку кількість анотацій, перелічених вище.
  • Усі методи, анотовані с @Раніше in JUnit виконуватимуться перед кожним тестом, але вони можуть виконуватися в будь-якому порядку.
  • Ви можете успадкувати методи @Before та @After від суперкласу. Виконання відбувається наступним чином, і це стандартний процес виконання в JUnit.
  1. Виконайте JUnit Методи @Before у суперкласі
  2. Виконайте методи @Before у цьому класі
  3. Виконайте метод @Test у цьому класі
  4. Виконайте методи @After у цьому класі
  5. Виконайте методи @After у суперкласі

JUnit Примітка за 5 рік: ці анотації є JUnit 4 (org.junit). JUnit 5 перейменували їх на org.junit.jupiter.api, А JUnit 4 код нижче все ще працює під вінтажним движком.

JUnit 4 анотації JUnit 5 (Юпітер) еквівалент Runs
@Раніше @BeforeEach Перед кожним методом випробування
@Після @AfterEach Після кожного методу випробування
@BeforeClass @BeforeAll Один раз перед усім класом
@Після занять @AfterAll Один раз після всього класу
@Ігнорувати @Вимкнено Пропускає анотований тест

Приклад: Створення класу з файлом як тестовим фікстурою

public class OutputFileTest		
{
    private File output; 
    @Before	public void createOutputFile() 
    { 
       output = new File(...);
    }
  
	@After public void deleteOutputFile() 
    {
        output.delete(); 
    } 
     
    @Test public void testFile1() 
    {
       // code for test case objective
    } 
	@Test public void testFile2() 
    {
       // code for test case objective
    }
}

У наведеному вище прикладі ланцюг виконання буде таким. Діаграма tracодин цикл створення-тестування-видалення на кожен метод тестування.

JUnit @Before та @After виконання ланцюжком об'єднує два методи тестування

  1. createOutputFile()
  2. testFile1()
  3. deleteOutputFile()
  4. createOutputFile()
  5. testFile2()
  6. deleteOutputFile()

Припущення:

testFile1() виконується перед testFile2(), що не гарантовано.

Одноразове налаштування

  • Метод можна запустити лише один раз для всього тестового класу перед виконанням будь-якого з тестів і перед будь-яким @Раніше метод(и).
  • «Одноразове налаштування» корисне для запуску серверів, відкриття зв’язків та подібної роботи. Закриття та повторне відкриття ресурсів для кожного тесту займає багато часу.
  • Це можна зробити за допомогою анотації @BeforeClass in JUnit.
@BeforeClass public static void Method_Name() {	
    // class setup code here	
 }	

Метод має бути public static void, Так як JUnit викликає його до появи будь-якого тестового екземпляра.

Один раз знести

  • Подібно до одноразового налаштування, також доступний метод одноразового очищення. Він виконується після всіх методів тестового випадку та @Після виконано анотації.
  • Це корисно для зупинкиping сервери та закриття каналів зв'язку.
  • Це можна зробити за допомогою @Після занять анотація
 @AfterClass public static void Method_Name()	
 {	
    // class cleanup code here	
 }	

JUnit Набори тестів

Після встановлення фіксуючих елементів пов'язані тестові класи зазвичай групуються та запускаються разом.

Якщо ми хочемо виконати кілька тестів у певному порядку, це можна зробити, об'єднавши всі тести в одному місці. Це місце називається набором тестів. Докладніше про те, як виконувати набори тестів та як вони використовуються в JUnit охоплені цим підручник.

JUnit Тестовий бігун

JUnit надає інструмент для виконання ваших тестів.

  • JUnitCore клас використовується для виконання цих тестів.
  • Метод під назвою runClasses надаються org.junit.runner.JUnitCore використовується для запуску одного або кількох тестових класів.
  • Тип повернення цього методу - Результат об'єкт (org.junit.runner.Result), який використовується для доступу до інформації про тести. Дивіться наступний приклад коду для кращої наочності.
public class Test {				
			public static void main(String[] args) {									
       		Result result = JUnitCore.runClasses(CreateAndSetName.class);					
			for (Failure failure : result.getFailures()) {							
         		System.out.println(failure.toString());					
      }		
      System.out.println(result.wasSuccessful());					
   }		
}      

У наведеному вище коді об'єкт "result" обробляється для отримання невдалих та успішних результатів тестових випадків, які ми виконуємо. Допоміжні функції, такі як assertEquals підняти ці невдачі, водночас @Ігнорувати пропускає тест.

JUnit Примітка за 5 рік: JUnitCore є JUnit 4 бігун. JUnit 5 замінює його на JUnit платформа гранатомет API, зазвичай запускається IDE, Gradle або Maven Surefire.

Ім’я JUnit програма

Достатнє знання SDLC, Java програмування та основи тестування програмного забезпечення процес допомагає зрозуміти JUnit програма, як і знання того, як одиничні тести відрізняються від інтеграційних тестів.

Давайте розглянемо модульне тестування на практичному прикладі. Нам потрібно створити клас тестів з методом тестування, анотованим за допомогою @Тест як зазначено нижче:

MyFirstClassTest.java

package guru99.JUnit;		

import static org.junit.Assert.*;				

import org.junit.Test;		

public class MyFirstClassTest {				

    @Test		
    public void myFirstMethod(){					
        String str= "JUnit is working fine";					
        assertEquals("JUnit is working fine",str);					
    }
}		

TestRunner.java

Щоб виконати наш метод тестування (вище), нам потрібно створити тестовий раннер. У тестовому раннері нам потрібно додати клас test як параметр у JUnitМетод runClasses() у Core. Він поверне результат тесту, залежно від того, чи тест пройдено, чи ні.

Більш детальну інформацію про це дивіться в коді нижче:

package guru99.JUnit;		

import org.junit.runner.JUnitCore;		
import org.junit.runner.Result;		
import org.junit.runner.notification.Failure;		

public class TestRunner {				
			public static void main(String[] args) {									
            Result result = JUnitCore.runClasses(MyFirstClassTest.class);					
			for (Failure failure : result.getFailures()) {							
              System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      	

Вихід

Коли образ і голос TestRunner.java виконує наші методи тестування, ми отримуємо вихідні дані як «не вдалося» або «пройшло». Нижче наведено пояснення вихідних даних:

  1. У цьому прикладі після виконання MyFirstClassTest.java, тест пройдено, і результат відображається зеленим кольором.
  2. Якби це сталося, результат би відображався червоним кольором, і невдачу можна було б спостерігати у збій. tracе. Див. JUnit Графічний інтерфейс нижче:

Eclipse JUnit вигляд із зеленою смугою проходження для MyFirstClassTest

Поширені запитання

JUnit створює новий екземпляр тестового класу для кожного тестового методу, тому екземпляр не існує, коли має виконуватися код рівня класу. Оголошення методу static дозволяє JUnit викликати його безпосередньо.

Ні. Порядок методів навмисно не визначено. JUnit 4 пропозиції @FixMethodOrder та JUnit 5 пропонує @TestMethodOrder, але залежно від сигналів порядку, пов'язані тести.

Метод тестування ніколи не викликається та повідомляється як помилка, а не збій. Будь-який метод @After все ще виконується, тому очищення має толерувати частково зібраний фікстур.

Нові проекти повинні додавати JUnit 5 агрегатних артефактів org.junit.jupiter:junit-jupiter. Команди, що зберігають застарілу версію JUnit 4 пакети додають junit-vintage-engine, щоб обидва працювали на одній платформі.

Фікстура (фікстура) — це весь підготовлений контекст навколо тесту, включаючи реальні файли або з'єднання. Макет (мокет) — це один замінник зі скриптовою поведінкою, часто створений фікстурою.

Так, через @BeforeClass у JUnit 4 або @BeforeAll в JUnit 5. Спільні фікстури швидші, але мають витік стану, тому зарезервуйте їх для дорогих ресурсів лише для читання.

Асистенти ШІ зчитують клас, визначають необхідних йому співавторів та складають чернетку налаштувань @Before з відповідним очищенням @After. Завжди самостійно перевіряйте згенеровані твердження.

Копілот GitHub створює тестовий клас із сигнатури методу, включаючи анотації життєвого циклу. Часто за замовчуванням використовується JUnit 4 імпорти, тому переконайтеся, що пакет відповідає вашому двигуну.

Підсумуйте цей пост за допомогою: