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

Що таке 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 клас детально:
- Розглянемо метод 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()) має повернути істину.
- У результаті тестовий приклад буде проходити.
- Розглянемо метод 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 мс.
- Розглянемо метод 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.
Оскільки всі тестові випадки пройдено, це призводить до успішного виконання тесту.
Фактичний результат
Оскільки у наведеному вище прикладі є три тестові випадки, всі тестові випадки будуть виконуватися один за одним. Дивіться скріншот консолі нижче:

Нижче наведені заяви для друку, які можна побачити на консолі:
Використання @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. | попередження про статичний тест (рядкове повідомлення) | Цей метод повертає тест, який завершується невдачею, і записує попереджувальне повідомлення. |
