JUnit Підручник з анотацій із прикладом: що таке @Test і @After

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

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

  • 🔘 @Тест: Позначає публічний метод void, який JUnit виконується як один тестовий випадок.
  • ☑️ Життєвий цикл: @Before та @After огортають кожен тест, тоді як @BeforeClass та @AfterClass огортають клас.
  • КОНТРОЛЬ: @Ignore пропускає тест, @Test(timeout) обмежує час виконання, @Test(expected) генерує виняток.
  • 🧪 Твердження: org.junit.Assert надає assertEquals, assertTrue, assertNull, assertSame та fail().
  • 🛠️ Спадщина: TestCase, TestResult та TestSuite належать до старішого пакету junit.framework.
  • 📊 JUnit 5: Юпітер перейменовує їх на @BeforeEach, @AfterEach, @BeforeAll, @AfterAll та @Disabled.

JUnit Посібник з анотацій, що охоплює @Test, @Before та @After

Що таке JUnit Анотації?

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

Маючи практичне знання цих анотацій, можна легко вивчити та впровадити JUnit тест. Нижче наведено важливі та часто використовувані JUnit список анотацій із JUnit 5 (Юпітер) еквівалент поруч із кожним:

S.No. Анотації Опис JUnit 5 еквівалентів
1. @Тест Ця анотація є заміною junit.framework.TestCase та вказує на те, що публічний метод void, до якого вона приєднана, може бути виконаний як тестовий випадок. @Test (org.junit.jupiter.api)
2. @Раніше Ця анотація використовується, якщо ви хочете виконати певний оператор, наприклад передумови, перед кожним тестом. @BeforeEach
3. @BeforeClass Ця анотація використовується, якщо ви хочете виконати деякі оператори перед усіма тестовими випадками, наприклад, тестове з'єднання, яке має бути відкрите перед усіма тестовими випадками. @BeforeAll
4. @Після Цю анотацію можна використовувати, якщо ви хочете виконати деякі оператори після кожного Тестовий випадок, наприклад, скидання змінних або видалення тимчасових файлів. @AfterEach
5. @Після занять Цю анотацію можна використовувати, якщо потрібно виконати деякі оператори після всіх тестових випадків, наприклад, звільнити ресурси після виконання всіх тестових випадків. @AfterAll
6. @Ігнорувати Цю анотацію можна використовувати, якщо ви хочете ігнорувати деякі оператори під час виконання тесту, наприклад, вимкнути деякі тестові випадки під час виконання тесту. @Вимкнено
7. @Test(timeout=500) Цю анотацію можна використовувати, якщо ви хочете встановити певний тайм-аут під час виконання тесту, наприклад, якщо ви працюєте за SLA (угодою про рівень обслуговування) і тести потрібно завершити протягом заданого часу. @Timeout або assertTimeout
8. @Test(expected=IllegalArgumentException.class) Цю анотацію можна використовувати, якщо потрібно обробити певний виняток під час виконання тесту. Наприклад, якщо потрібно перевірити, чи певний метод викидає вказаний виняток, чи ні. assertThrows

JUnit Приклад анотацій

Давайте створимо клас, який охоплює важливі JUnit анотації за допомогою простих інструкцій друку та виконайте їх за допомогою класу виконання тестів:

Крок 1) Розгляньте наведене нижче Java клас, що має різні методи, що додаються до вищезазначених анотацій:

JunitAnnotationsExample.java

package guru99.junit;		

import static org.junit.Assert.assertEquals;				
import static org.junit.Assert.assertFalse;				

import java.util.ArrayList;		

import org.junit.After;		
import org.junit.AfterClass;		
import org.junit.Before;		
import org.junit.BeforeClass;		
import org.junit.Ignore;		
import org.junit.Test;		

public class JunitAnnotationsExample {				

    private ArrayList<String> list;					

    @BeforeClass		
    public static void m1() {							
        System.out.println("Using @BeforeClass , executed before all test cases ");					
    }		

    @Before		
    public void m2() {					
        list = new ArrayList<String>();					
        System.out.println("Using @Before annotations ,executed before each test cases ");					
    }		

    @AfterClass		
    public static void m3() {							
        System.out.println("Using @AfterClass ,executed after all test cases");					
    }		

    @After		
    public void m4() {					
        list.clear();			
        System.out.println("Using @After ,executed after each test cases");					
    }		

    @Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

    @Ignore		
    public void m6() {					
        System.out.println("Using @Ignore , this execution is ignored");					
    }		

    @Test(timeout = 10)			
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

    @Test(expected = NoSuchMethodException.class)					
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					

    }		

}		

Крок 2) Давайте створимо клас запуску тестів для виконання вищезазначеного тесту:

TestRunner.java

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(JunitAnnotationsExample.class);					
			for (Failure failure : result.getFailures()) {							
         System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      	

Очікуваний результат

  • Усі тестові випадки будуть виконуватися один за одним, а всі оператори друку можна буде побачити на консолі.
  • Як обговорювалося у таблиці вище, @Before та @BeforeClass у JUnit [методи m2() та m1()] будуть виконані перед кожним тестовим випадком та перед усіма тестовими випадками відповідно.
  • Так само, як і @After та @AfterClass у JUnit (методи m4() та m3()) будуть виконані після кожного тестового випадку та після всіх тестових випадків відповідно. @Ignore (метод m6()) буде трактуватися як ігнорування тесту.

Давайте проаналізуємо тестові випадки, використані вище Java клас детально:

  1. Розглянемо метод m5(), як наведено нижче:
	@Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

У вищезгаданому методі, коли ви додаєте рядок до змінної «список»:

  • list.isEmpty() поверне false.
  • assertFalse(list.isEmpty()) має повернути істину.
  • У результаті тестовий приклад буде проходити.

Оскільки ви додали до списку лише один рядок, розмір дорівнює одиниці.

  • list.size() має повертати цілочисельне значення «1».
  • So assertEquals(1, list.size()) має повернути істину.
  • У результаті тестовий приклад буде проходити.
  1. Розглянемо метод m7(), як наведено нижче:
@Test(timeout = 10)		
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

Як зазначено вище, @Test(час очікування = 10) використовується для забезпечення тайм-ауту в тестовому випадку. Значення вказано в мілісекундах, тому m7() має завершитися протягом 10 мс.

  1. Розглянемо метод m8(), як наведено нижче:
@Test(expected = NoSuchMethodException.class)				
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					
    
    }		

Як зазначено вище, @Test(очікується) перевірятиме наявність зазначеного винятку під час свого виконання, тому метод m8() викине помилку «No Such Method Exception». В результаті тест буде виконано з винятком.

Примітка щодо точності: m8() друкує лише рядок, тому оголошений виняток насправді ніколи не викидається, і JUnit 4 повідомляє про невдачу тесту. Вирівняйте очікуваний тип з тим, що метод фактично видає. JUnit 5 пише це з assertThrows.

Оскільки всі тестові випадки пройдено, це призводить до успішного виконання тесту.

Фактичний результат

Оскільки у наведеному вище прикладі є три тестові випадки, всі тестові випадки будуть виконуватися один за одним. Дивіться скріншот консолі нижче:

Eclipse вивід консолі, що показує оператори друку @BeforeClass, @Before, @After та @AfterClass
Вивід консолі, створений JunitAnnotationsExample

Нижче наведені заяви для друку, які можна побачити на консолі:

Використання @BeforeClass, виконується перед усіма тестами

Використання анотацій @Before, які виконуються перед кожним тестом

Використання @After, виконується після кожного тесту

Використання анотацій @Before, які виконуються перед кожним тестом

Використовуючи @Test(timeout), його можна використати для примусового встановлення часу очікування JUnit4 тестовий приклад

Використання @After, виконується після кожного тесту

Використання анотацій @Before, які виконуються перед кожним тестом

Використовуючи @Test(expected), він перевірятиме наявність вказаного винятку під час виконання

Використання @After, виконується після кожного тесту

Використання @AfterClass, виконується після всіх тестів

JUnit Стверджувати клас

Анотації визначають, коли метод виконується; методи assert визначають, чи він проходить випробування.

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

Як ви бачили раніше, у таблиці нижче описано важливі методи Assert та їх опис:

S.No. Метод Опис
1. void assertEquals (логічне значення очікуване, логічне значення фактичне) Він перевіряє, чи два значення рівні, подібно до методу equals класу Object.
2. void assertFalse (булева умова) Функціональність полягає в перевірці, чи умова хибна.
3. void assertNotNull (об'єкт об'єкт) Функція «assertNotNull» полягає у перевірці того, що об’єкт не є нульовим.
4. void assertNull (об'єкт об'єкта) Функція «assertNull» полягає в тому, щоб перевірити, що об’єкт є нульовим.
5. void assertTrue (булева умова) Функція «assertTrue» призначена для перевірки істинності умови.
6. void fail() Якщо ви хочете викинути помилку твердження, fail() завжди призводить до вердикту «невдача».
7. void assertSame([Рядкове повідомлення] Функція «assertSame» полягає у перевірці того, що два об’єкти посилаються на один і той же об’єкт.
8. void assertNotSame([Рядкове повідомлення] Функція «assertNotSame» полягає у перевірці того, що два об’єкти не посилаються на той самий об’єкт.

JUnit Тестові випадки Клас

Для запуску кількох тестів доступний клас TestCase. junit.framework пакет. Анотація @Test повідомляє JUnit що цей публічний метод void (тут тестовий випадок), до якого він приєднаний, можна запустити як тестовий випадок.

Примітка до версії: Тестовий випадок, Результати тесту та TestSuite належать до спадщини junit.framework пакет від JUnit 3. Вони все ще постачаються всередині артефакту junit 4.x, але тести на основі анотацій не розширюють TestCase.

У таблиці нижче наведено деякі важливі методи, доступні в junit.framework.Тестовий випадок клас:

S.No. Метод Опис
1. int countTestCases() Цей метод використовується для підрахунку кількості тестових випадків, виконаних запустити (TestResult tr) метод.
2. TestResult createResult() Цей метод використовується для створення a Результати тесту об'єкт
3. Рядок getName() Цей метод повертає рядок, який є нічим іншим, як a Тестовий випадок ім'я.
4. TestResult run() Цей метод використовується для виконання тесту, який повертає Результати тесту об'єкт
5. недійсний запуск (результат TestResult) Цей метод використовується для виконання тесту з a Результати тесту об'єкт, який нічого не повертає.
6. void setName(ім'я рядка) Цей метод використовується для встановлення імені TestCase.
7. void setUp() Цей метод використовується для написання коду асоціації ресурсів, наприклад, створення підключення до бази даних.
8. void tearDown() Цей метод використовується для написання коду вивільнення ресурсів, наприклад, для вивільнення з'єднання з базою даних після виконання операції транзакції.

JUnit Клас TestResult

Коли ви виконуєте тест, він повертає результат (у вигляді Результати тесту Цей об'єкт TestResult можна використовувати для аналізу результуючого об'єкта. Результат тесту може бути як успішним, так і невдалим.

Дивіться таблицю нижче для важливих методів, що використовуються в класі junit.framework.TestResult:

S.No. Метод Опис
1. void addError(Тестовий тест, Throwable t) Цей метод використовується, якщо потрібно додати помилку до тесту.
2. void addFailure(Тестовий тест, AssertionFailedError t) Цей метод використовується, якщо потрібно додати збій до списку збоїв.
3. void endTest (Тестовий тест) Цей метод використовується для повідомлення про те, що тест виконано (завершено).
4. int errorCount() Цей метод використовується для виявлення помилок під час виконання тесту.
5. Перерахування помилки() Цей метод просто повертає колекцію (тут перелік) помилок.
6. int failureCount() Цей метод використовується для отримання кількості виявлених збоїв під час виконання тесту.
7. недійсний запуск (тест TestCase) Цей метод використовується для виконання тесту.
8. int runCount() Цей метод просто підраховує виконані тести.
9. void startTest (Тестовий тест) Цей метод використовується для сповіщення про початок тесту.
10. недійсна зупинка() Цей метод використовується для зупинки тестового запуску.

JUnit Клас набору тестів

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

Дивіться таблицю нижче, щоб ознайомитися з важливими методами, що використовуються в junit.framework.TestSuite клас:

S.No. Метод Опис
1. void addTest (Тестовий тест) Цей метод використовується, якщо ви хочете додати тест до набору.
2. void addTestSuite(Клас testClass) Цей метод використовується, якщо ви хочете вказати клас під час додавання тесту до набору.
3. int countTestCases() Цей метод використовується, якщо потрібно підрахувати кількість тестів.
4. Рядок getName() Цей метод використовується для отримання назви набору тестів.
5. недійсний запуск (результат TestResult) Цей метод використовується для виконання тесту та збору результатів тесту в Результати тесту об'єкт
6. void setName(ім'я рядка) Цей метод використовується для встановлення назви TestSuite.
7. Тест testAt(індекс int) Цей метод використовується, якщо потрібно повернути тест за заданим індексом.
8. int testCount() Цей метод використовується, якщо потрібно повернути кількість тестів у наборі.
9. попередження про статичний тест (рядкове повідомлення) Цей метод повертає тест, який завершується невдачею, і записує попереджувальне повідомлення.

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

Так. Метод зазвичай містить @Test разом з @Ignore або @Test з тайм-аутом та очікуваним винятком. Не можна об'єднувати дві анотації життєвого циклу, такі як @Before та @After, в одному методі.

@Ignore лише пригнічує метод JUnit вже розпізнає як тест. Без @Test поруч із ним виконавець ніколи не збирає дані методу, тому він не виконується і не відображається як пропущений.

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

Тільки через рушій Vintage. Додавання junit-vintage-engine дозволяє JUnit Платформа запускає існуючі тести org.junit без змін, але тести Jupiter повинні імпортувати org.junit.jupiter.api. Змішування обох наборів імпорту в одному класі призводить до помилки.

Тільки для обслуговування. Застарілі пакети, що розширюють TestCase та створюють об'єкти TestSuite, залишаються поширеними у старих кодових базах, тому розпізнавання API допомагає. Нові тести повинні бути засновані на анотаціях.

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

Асистенти ШІ зчитують тестований метод і пропонують, чи належить setup до @Before чи @BeforeClass, і чи шлях до відмови потребує @Test(expected) чи assertThrows. Кожну пропозицію розглядають як чернетку.

Копілот GitHub зазвичай правильно розміщує налаштування та демонтаж, але часто змішується JUnit 4 та імпортує з Jupiter в одному файлі. Перевірте блок імпорту перед запуском пакету.

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