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

⚡ Умное резюме

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

  • 🔘 Цель: Вместо того чтобы запускать каждый тестовый класс по отдельности, объединяйте тесты из разных классов в один исполняемый модуль.
  • ☑️ аннотации: Аннотация @RunWith(Suite.class) делегирует выполнение, а аннотация @SuiteClasses перечисляет все классы, которые должен запустить набор тестов.
  • Шаги: Напишите тестовые классы, добавьте класс-держатель, содержащий обе аннотации, а затем запустите их из... JUnitОсновной бегун.
  • 🧪 Пример: В файле JunitTest.java объединены тесты SuiteTest1 и SuiteTest2, и в консоли отображаются три успешно пройденных теста.
  • 🇧🇷 JUnit 5: В Jupiter вместо аннотации @Suite используется @SelectClasses или @SelectPackages в движке пакета платформ.
  • 📌 Подводные камни: Большинство ошибок вызваны пустыми наборами тестов, отсутствующими импортами и классом набора тестов, содержащим собственные методы с аннотацией @Test.

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

In JUnitНабор тестов позволяет нам объединить все контрольные примеры Из нескольких классов в одном месте и запускайте их одновременно.

Для запуска набора тестов необходимо аннотировать класс, используя указанные ниже аннотации:

  1. @RunWith(Suite.class)
  2. @SuiteClasses(test1.class, test2.class…) или @Suite.SuiteClasses({test1.class, test2.class…})

С помощью указанных выше аннотаций все тестовые классы в наборе начнут выполняться один за другим. Сам класс набора остается пустым: он служит лишь хранилищем для аннотаций, а исполнитель тестов считывает эти аннотации, чтобы решить, что выполнять.

Шаги по созданию набора тестов и средства выполнения тестов

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

Шаг 1) Создайте простой тестовый класс (например, MyFirstClassTest) и добавьте метод, аннотированный с помощью @Контрольная работа.

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

Класс MyFirstClassTest в Eclipse объявление метода myFirstMethod с аннотацией @Test

Шаг 2) Создайте еще один тестовый класс для добавления (например, MySecondClassTest) и создайте метод, аннотированный @Test.

Второй класс имеет точно такую ​​же структуру, поэтому в наборе данных есть два отдельных класса для агрегирования:

Класс MySecondClassTest в Eclipse объявление метода mySecondMethod с аннотацией @Test

Шаг 3) Для создания набора тестов необходимо сначала аннотировать класс с помощью @RunWith(Suite.class) и @SuiteClasses(class1.class, class2.class…).

Обратите внимание, что класс TestSuiteExample не объявляет собственный тестовый метод — вся информация содержится в двух аннотациях:

Класс TestSuiteExample аннотирован аннотациями @RunWith(Suite.class) и @SuiteClasses, присвоив имена классам MyFirstClassTest и MySecondClassTest.

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

Бегун — это равнина Java класс с методом main, который передает класс набора задач JUnitCore:

Вызов класса тест-раннеров JUnitВыполнение метода Core.runClasses для TestSuiteExample и вывод списка ошибок

Code Объяснение:

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

Выход: Вот результат, подтверждающий успешное проведение теста без сбоев. trace, как указано ниже:

Eclipse JUnit Просмотр отчетов. Выполнено 2 из 2 дней без ошибок и сбоев для TestSuiteExample.

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

JUnit Пример тестового набора

Рассмотрим более сложный пример, в котором классы внутри набора фактически утверждать Вместо того чтобы хранить пустой метод, можно использовать что-то другое.

ЮнитТест.java

JunitTest.java — это простой класс, аннотированный с помощью @Бежать с и @Люкс аннотации. В качестве параметров можно указать любое количество классов из набора, как показано ниже:

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В этом классе есть тестовый метод для вывода сообщения, как показано ниже. Вы будете использовать этот класс в качестве члена набора тестов. ЮнитТест.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);							
    }		

}		

Результат

После выполнения ЮнитТест.java, который содержит набор файлов, включающих SuiteTest1.java и SuiteTest2.javaВ результате вы получите приведенный ниже вывод. В консоли отображаются сообщения, созданные обоими классами:

Eclipse Консоль отображает сообщения, выведенные обоими классами набора тестов после завершения JUnitTest.

JUnit Просмотрите записи о выполнении одного и того же теста, используя три успешно прошедших тестовых метода, сгруппированных в класс suite:

Eclipse JUnit Просмотр отчетов. Пройдено 3 из 3 тестов без ошибок для модульных тестов с развернутыми наборами тестов SuiteTest1 и SuiteTest2.

Примечание: В этом примере метки консоли перечеркнуты — строка, выводимая SuiteTest1, читается как «Suite Test 2», а строка, выводимая SuiteTest2, читается как «Suite Test 1». Исходные записи воспроизводятся без изменений, поэтому метки остаются такими, какими их написал автор; имя класса можно прочитать в JUnit При сопоставлении выходных данных с исходными данными используйте в качестве ориентира текст, а не печатную этикетку.

Как создать набор тестов в JUnit 5

JUnit В версии 5 полностью удалены средства запуска тестов, поэтому аннотация @RunWith(Suite.class) отсутствует в пакетах org.junit.jupiter. Наборы тестов перемещены в... JUnit Платформа, которая поставляет их в отдельном артефакте, называемом junit-platform-suite-engineДобавьте эту зависимость, затем аннотируйте класс с помощью аннотации `@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 Класс suite может объявлять методы `@BeforeSuite` и `@AfterSuite`, которые выполняются один раз для всего набора данных, и JUnit Пример 4 выше по-прежнему выполняется. JUnit Благодаря использованию винтажного движка, исходный код этой страницы не требует переписывания для обеспечения его работоспособности.

Преимущества и ограничения JUnit Наборы тестов

Номер люкс — это группаping механизм, а не тестовая среда Оно самодостаточно, и это определяет как его сильные стороны, так и то, где оно перестаёт быть полезным.

Преимущества

  • Один запуск объединяет смежные классы, например, дымовой зал или... регресс Запуск системы осуществляется одной командой.
  • В представлении результатов все классы объединены в один узел набора тестов, что упрощает обнаружение общих ошибок.
  • Список участников хранится в коде, поэтому он проверяется и версионируется, как и любой другой исходный файл.
  • Один и тот же набор тестов можно запустить из IDE, из средства выполнения, например, JUnitИз ядра или из инструмента сборки.

Ограничения

  • @SuiteClasses — это жёстко заданный список, поэтому новый тестовый класс незаметно исключается из списка до тех пор, пока кто-нибудь не отредактирует набор тестов.
  • Данный пакет программ не гарантирует сохранение порядка следования элементов, за исключением того, в каком именно порядке они перечислены.
  • Между группами участников ничего не является общим, поэтому номер люкс не заменяет собой матч или базовый класс.
  • Инструменты сборки уже обнаруживают тестовые классы по соглашению об именовании, что делает набор тестов избыточным во многих проектах.

Распространенные ошибки при создании JUnit Тестирование

Большинство проблем с программным обеспечением выдают короткое и бесполезное сообщение. В таблице показано, с какими сообщениями вы, скорее всего, столкнетесь, каковы их причины и способы решения.

Сообщение или симптом Вызывать фиксированный
initializationError: No runable methods Этот класс запускается как обычный тестовый класс, но содержит только аннотации. Добавьте аннотацию @RunWith(Suite.class), чтобы средство запуска тестов пакета перехватывало управление вместо средства запуска по умолчанию.
Не удалось найти символ: класс Suite Отсутствует импорт пакета Suite. Импортируйте org.junit.runners.Suite вместе с org.junit.runner.RunWith.
Занятие проводится, но урок пропущен. Данный класс так и не был добавлен в список @SuiteClasses. Добавьте класс явно или переместите его в аннотацию @SelectPackages. JUnit 5.
Компилятор не принимает имя класса. @Runwith или @suiteClasses были введены с неправильным регистром. Java Аннотации чувствительны к регистру: пишите @RunWith и @SuiteClasses точно так, как указано.
Тесты, находящиеся непосредственно в классе набора тестов, никогда не запускаются. В контейнер для тестовых наборов был добавлен метод `@Test`. Оставьте поле пустым и переместите тестовый метод в класс-член.

Напишите весь пакет документов один раз и продолжайте.ping Настоящая работа заключается в точности. Если список отклоняется от классов на диске, пакет программ выдает зеленый результат, в то время как часть модульный тест Команда set вообще не выполняется, это один из самых незаметных режимов сбоя. тестирование программного обеспечения.

Часто задаваемые вопросы (FAQ)

Пакет программ выполняет классы в том порядке, в котором они перечислены, но JUnit не дает никаких гарантий относительно порядка выполнения методов внутри каждого класса. Тесты, зависящие от выполнения предыдущего теста, являются ненадежными и должны быть переписаны таким образом, чтобы быть самодостаточными.

Да. Класс набора тестов — это обычный класс с точки зрения исполнителя, поэтому присвоение ему имени внутри другого списка @SuiteClasses приводит к вложенности наборов тестов. Вложенность полезна для набора тестов регрессионного анализа верхнего уровня, построенного из более мелких модульных наборов тестов.

Искусственный интеллект-ассистенты считывают тестовые классы с диска, сравнивают их со списком @SuiteClasses и помечают классы, которые так и не были добавлены. Они также кластеризуют повторяющиеся ошибки. traces по первопричине, что сокращает время сортировки пациентов после того, как в одном из кабинетов одновременно обнаруживается множество проблем.

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 Задача тестирования уже обнаруживает тестовые классы по шаблону именования и запускает их все. Создание набора тестов целесообразно, если вам нужно именованное подмножество, например, набор тестов для дымовой обработки, которое меньше, чем полный набор тестов.

Программа запуска сообщает об ошибке инициализации для этого члена класса, указывая, что не найдено ни одного исполняемого метода, и весь набор тестов помечен как неудачный. Удалите запись или добавьте метод с аннотацией @Test к классу.

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

Подведем итог этой публикации следующим образом: