Створити JUnit Набір тестів із прикладом: @RunWith @SuiteClasses

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

JUnit Тестові набори об'єднують тестові випадки з кількох класів, щоб вони виконувалися разом за один прохід, керовані анотаціями @RunWith(Suite.class) та @SuiteClasses та запускалися через звичайний клас запуску тестів.

  • 🔘 Мета: Групуйте тести з багатьох класів в один виконуваний модуль замість того, щоб запускати кожен клас тестів окремо.
  • ☑️ Анотації: @RunWith(Suite.class) делегує виконання, тоді як @SuiteClasses перераховує всі класи, які має запустити набір.
  • Кроки: Напишіть тестові класи, додайте клас-холдер, що містить обидві анотації, а потім запустіть його з JUnitОсновний бігун.
  • 🧪 приклад: JunitTest.java групує SuiteTest1 та SuiteTest2, і консоль повідомляє про три пройдені тести.
  • 🛠️ JUnit 5: Юпітер замінює бігун на @Suite плюс @SelectClasses або @SelectPackages у рушії набору платформи.
  • 📌 Підводні камені: Порожні набори, відсутні імпорти та клас набору, що містить власні методи @Test, спричиняють більшість збоїв.

Створення JUnit набір тестів з анотаціями @RunWith та @SuiteClasses

In JUnit, набір тестів дозволяє нам агрегувати всі тестові справи з кількох класів в одному місці та запускати їх разом.

Щоб запустити тест набору, вам потрібно анотувати клас, використовуючи наведені нижче анотації:

  1. @RunWith(Suite.class)
  2. @SuiteClasses(test1.клас, test2.клас…) або @Suite.SuiteClasses({test1.клас, test2.клас…})

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

Кроки для створення набору тестів і запуску тестів

Чотири кроки нижче створюють найменший набір, який фактично виконується: два звичайні тестові класи, клас набору, який їх іменує, та виконувач, який запускає набір з методу main.

Крок 1) Створіть простий тестовий клас (наприклад, MyFirstClassTest) та додайте метод з анотацією @Тест.

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

Клас MyFirstClassTest у Eclipse оголошення анотованого @Test myFirstMethod

Крок 2) Створіть ще один тестовий клас для додавання (наприклад, MySecondClassTest) та створіть метод з анотацією @Test.

Другий клас має точно таку ж форму, тому набір має два окремі класи для агрегації:

MySecondClassТестовий клас у Eclipse оголошення анотованого @Test mySecondMethod

Крок 3) Щоб створити testSuite, спочатку потрібно анотувати клас за допомогою @RunWith(Suite.class) та @SuiteClasses(class1.class, class2.class…).

Зверніть увагу, що клас набору TestSuiteExample не оголошує власного методу тестування — дві анотації містять всю інформацію:

TestSuiteExample з анотаціями @RunWith(Suite.class) та @SuiteClasses з іменами MyFirstClassTest та MySecondClassTest

Крок 4) Створіть клас Test Runner для запуску нашого набору тестів, як зазначено нижче:

Бігун — це рівнина Java клас з основним методом, який передає клас набору до JUnitCore:

Виклик класу Test Runner JUnitCore.runClasses на TestSuiteExample та виведення списку невдач

Code Пояснення:

  • Code Лінія 8: Оголошення головного методу класу Test, який запускатиме наш JUnit тест.
  • Code Лінія 9: Виконання тестових випадків за допомогою JUnitCore.runClasses, який приймає назву тестового класу як параметр (у наведеному вище прикладі ви використовуєте TestSuiteExample.class, показаний у кроці 3).
  • Code Лінія 11: Обробка результату за допомогою циклу for та виведення невдалого результату.
  • Code Лінія 13: Роздрукування успішного результату.

вихід: Ось результат, який показує успішне проходження тесту без збоїв tracе., як зазначено нижче:

Eclipse JUnit перегляд звітності. Запуски 2/2 з нульовою кількістю помилок та нульовою кількістю збоїв для TestSuiteExample.

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

JUnit Приклад набору тестів

Розглянемо складніший приклад, у якому класи всередині набору фактично стверджувати щось замість того, щоб зберігати порожній метод.

JunitTest.java

JunitTest.java — це простий клас, анотований за допомогою @RunWith та @Suite анотації. Ви можете перерахувати будь-яку кількість класів у наборі як параметри, як зазначено нижче:

package guru99.junit;		
import org.junit.runner.RunWith;		
import org.junit.runners.Suite;		

@RunWith(Suite.class)				
@Suite.SuiteClasses({				
  SuiteTest1.class,
  SuiteTest2.class,  			
})		

public class JunitTest {				
			// This class remains empty, it is used only as a holder for the above annotations		
}

SuiteTest1.java

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

package guru99.junit;		

import static org.junit.Assert.assertEquals;				

import org.junit.Test;		

public class SuiteTest1 {				

    public String message = "Saurabh";							

    JUnitMessage junitMessage = new JUnitMessage(message);							

    @Test(expected = ArithmeticException.class)					
    public void testJUnitMessage() {					

        System.out.println("Junit Message is printing ");					
        junitMessage.printMessage();			

    }		

    @Test		
    public void testJUnitHiMessage() {					
        message = "Hi!" + message;							
        System.out.println("Junit Hi Message is printing ");					
        assertEquals(message, junitMessage.printHiMessage());					
        System.out.println("Suite Test 2 is successful " + message);							
    }		
}		

SuiteTest2.java

SuiteTest2.java це ще один клас тестів, подібний до SuiteTest1.java, маючи тестовий метод для виведення повідомлення, як зазначено нижче. Ви будете використовувати цей клас як член набору в JunitTest.java.

package guru99.junit;		

import org.junit.Assert;		
import org.junit.Test;		

public class SuiteTest2 {				
   	

    @Test		
    public void createAndSetName() {					
        		

        String expected = "Y";					
        String actual = "Y";					

        Assert.assertEquals(expected, actual);					
        System.out.println("Suite Test 1 is successful " + actual);							
    }		

}		

Вихід

Після виконання JunitTest.java, який містить набір файлів SuiteTest1.java та SuiteTest2.java, ви отримаєте вивід, наведений нижче. Консоль виводить повідомлення, створені обома класами:

Eclipse Консоль, що показує надруковані повідомлення з обох класів набору після завершення JunitTest

Команда JUnit перегляд записує той самий запуск, що й три успішно виконані методи тестування, згруповані в класі набору:

Eclipse JUnit перегляд звітності. Виконується 3/3 зеленого кольору для JunitTest з розгорнутими SuiteTest1 та SuiteTest2.

Примітка: Мітки консолі в цьому прикладі перекреслені — рядок, виведений SuiteTest1, має вигляд «Suite Test 2», а рядок, виведений SuiteTest2, — «Suite Test 1». Оригінальні списки відтворюються без змін, тому мітки залишаються такими, як їх написав автор; прочитайте назву класу в JUnit вигляд, а не друкована етикетка, коли ви зіставляєте вивід із джерелом.

Як створити набір тестів у JUnit 5

JUnit У версії 5 повністю видаляються бігуни, тому @RunWith(Suite.class) не існує в пакетах org.junit.jupiter. Набори переміщено до JUnit Платформа, яка відправляє їх в окремому артефакті під назвою двигун-пакету-платформи-junitДодайте цю залежність, а потім анотуйте клас за допомогою @Suite та однієї з анотацій селектора.

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;

@Suite
@SuiteDisplayName("Guru99 suite")
@SelectClasses({ SuiteTest1.class, SuiteTest2.class })
public class JunitTest {
    // Empty holder, exactly as in JUnit 4
}

Анотації селекторів замінюють єдиний список @SuiteClasses невеликим набором опцій:

Анотація Що воно вибирає
@SelectClasses Окремі тестові класи з іменами один за одним, пряма заміна @SuiteClasses.
@SelectPackages Кожен тестовий клас у названому пакеті та у всіх його підпакетах.
@IncludeClassNamePatterns Фільтр регулярних виразів, застосований поверх виділення.
@SuiteDisplayName Читабельне ім'я, що відображається у звіті замість назви класу.

На практиці важливі ще дві відмінності. А JUnit Клас 5-го набору може оголошувати методи @BeforeSuite та @AfterSuite, які виконуються один раз для всього набору, а також JUnit 4 приклад вище все ще виконується на JUnit Платформа працює на старовинному движку, тому оригінальний код на цій сторінці не потрібно переписувати, щоб він продовжував працювати.

Переваги та обмеження JUnit Набори тестів

Люкс – це групаping механізм, а не тестовий фреймворк власного, і це формує як те, що воно робить добре, так і те, де воно перестає бути корисним.

Переваги

  • Один запуск запускає пов'язані класи разом, тому димовий набір або регресія set запускається однією командою.
  • У результатах кожен клас групується під одним вузлом набору, що полегшує виявлення спільної помилки.
  • Список учасників зберігається в коді, тому він перевіряється та версіонується, як і будь-який інший вихідний файл.
  • Той самий клас набору можна запустити з IDE, з виконавця, такого як JUnitЯдро або з інструменту збірки.

Недоліки

  • @SuiteClasses — це жорстко закодований список, тому новий тестовий клас мовчки залишається поза кодом, доки хтось не відредагує набір.
  • Набір не гарантує впорядкування поза порядком, у якому перелічені класи.
  • Між класами-членами немає спільного елемента, тому люкс не замінює фікстуру чи базовий клас.
  • Інструменти збірки вже виявляють тестові класи за допомогою правил іменування, що робить набір зайвим у багатьох проектах.

Типові помилки під час створення JUnit Набір тестів

Більшість проблем із пакетом програмного забезпечення призводять до появи короткого, некорисного повідомлення. У таблиці зіставлено повідомлення, з якими ви, ймовірно, зіткнетеся, з їхньою причиною та способами вирішення.

Повідомлення або симптом Викликати виправляти
initializationError: Немає виконуваних методів Клас виконується як звичайний тестовий клас, але він містить лише анотації. Додайте @RunWith(Suite.class), щоб виконавець набору взяв на себе керування замість виконавця за замовчуванням.
не вдається знайти символ: клас Suite Імпорт Suite відсутній. Імпортуйте org.junit.runners.Suite разом з org.junit.runner.RunWith.
Набір працює, але заняття пропущено Клас ніколи не додавався до списку @SuiteClasses. Додайте клас явно або перемістіть його до @SelectPackages у JUnit 5.
Компілятор не приймає ім'я класу @Runwith або @suiteClasses було введено з неправильним регістром літер. Java Анотації чутливі до регістру: пишіть @RunWith та @SuiteClasses точно так само.
Тести в самому класі suite ніколи не виконуються До власника набору було додано метод @Test. Залиште тримач порожнім та перемістіть метод тестування до класу-члена.

Написавши сюїту один раз і продовжуючиping це точність і є справжньою роботою. Якщо список відхиляється від класів на диску, пакет повідомляє зеленим кольором, поки частина одиничне випробування set взагалі ніколи не виконується, один із найтихіших режимів відмови в тестування програмного забезпечення.

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

Набір виконує класи в порядку їх переліку, але JUnit не гарантує порядок методів у кожному класі. Тести, що залежать від попереднього тесту, є крихкими та повинні бути переписані самостійно.

Так. Клас набору є звичайним класом з точки зору виконавця, тому його найменування всередині іншого списку @SuiteClasses вкладає набори. Вкладеність корисна для набору регресій верхнього рівня, побудованого з менших наборів модулів.

Асистенти штучного інтелекту зчитують тестові класи з диска, порівнюють їх зі списком @SuiteClasses та позначають класи, які ніколи не були додані. Вони також кластеризують повторювані збої. tracза першопричиною, що скорочує час сортування після того, як відділення повідомляє про багато червоних повідомлень одночасно.

Copilot швидко записує пару анотацій, але вона часто змішується JUnit 4 і JUnit 5 імпортів в одному файлі. Переконайтеся, що org.junit.runners.Suite та org.junit.platform.suite.api.Suite ніколи не з'являються разом, оскільки лише один з них відповідає вашому раннеру.

Додайте junit-platform-suite-engine до області тестування. Анотації @Suite та @SelectClasses знаходяться в junit-platform-suite-api, який цей артефакт рушія отримує транзитивно, тому зазвичай достатньо однієї залежності.

Зазвичай ні. Surefire та Gradle Тестове завдання вже виявляє класи тестів, іменуючи шаблони, та запускає їх усі. Набір варто писати, коли вам потрібна іменована підмножина, така як набір smoke, яка менша за повний прогін.

Виконавець повідомляє про помилку ініціалізації для цього члена, повідомляючи, що не знайдено жодних виконуваних методів, і весь набір позначено як невдалий. Видаліть запис або додайте метод @Test до класу.

Не всередині одного списку селекторів. Зберігайте JUnit 4 класи на вінтажному двигуні та виберіть їх з JUnit 5 пакетів, тому обидва двигуни працюють під одним і тим самим JUnit Запуск платформи без змішування сімейств анотацій.

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