JavaRush /Курсы /JSP & Servlets /Популярные аннотации в JUnit

Популярные аннотации в JUnit

JSP & Servlets
3 уровень , 6 лекция
Открыта

7.1 Аннотация @Suite

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

Тесты можно объединять в группы. Для этого есть специальная аннотация @Suite. Пример:


@Suite @SuiteDisplayName("JUnit Platform Suite Demo") @SelectPackages("com.javarush.test") @IncludeClassNamePatterns(".*Tests")
class SuiteDemo {
}

В данном случае аннотация @Suite работает в паре с другими аннотациями.

  • SuiteDisplayName – задает имя группы тестов в логе;
  • SelectPackages – задает список пакетов, где искать классы-тесты;
  • IncludeClassNamePatterns – задает шаблон имен классов-тестов.

Зачем такие сложности? Ну представь, что все тесты проекта выполняются, скажем, 50 часов. И выполнять их после каждого коммита очень накладно. В таком случае полезно создать некоторые отдельные сценарии тестирования и настроить тестирование гораздо гибче.

7.2 Аннотация @Order

Еще одна часто встречающаяся аннотация – @TestMethodOrder. Она позволяет задать порядок вызова тестовых методов в тестовом классе. Бывает очень полезна, когда вы знаете, что вызовы методов влияют друг на друга, но при определенном порядке все должно работать, как нужно. Используется довольно часто.

Во-первых, можно задать вызов методов в алфавитном порядке:


@TestMethodOrder(MethodOrderer.MethodName.class)
public class AlphanumericOrderUnitTest {
 
}

Во-вторых, у каждого метода можно расставить специальную аннотацию с его порядковым номером.


@TestMethodOrder(OrderAnnotation.class)
public class OrderAnnotationUnitTest {
   
 @Test @Order(1)   
    public void firstTest() {
    }
   
 @Test @Order(2)   
    public void secondTest() {
    }
}

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


@TestMethodOrder(CustomOrder.class)
public class CustomOrderUnitTest {
 
}
 
//сортируем имена методов по алфавитному порядку, но игнорируя регистр
public class CustomOrder implements MethodOrderer {
    public void orderMethods(MethodOrdererContext context) {
        context.getMethodDescriptors().sort(
        (MethodDescriptor m1, MethodDescriptor m2)->
           m1.getMethod().getName().compareToIgnoreCase(m2.getMethod().getName()));
    }
}

7.3 Аннотация @DisplayName

И наконец, каждому тесту можно задавать его имя. Бывает удобно, если тестов очень много и вы создаете специальные сценарии (подмножества) тестов. Для этого есть специальная аннотация @DisplayName.

Пример:


@DisplayName("Понятное имя для теста")
public class DisplayNameCustomTest {
 
 @Test @DisplayName("Проверка входных данных")
    void inputData() {
    }
 
 @DisplayName("Проверка критических ситуаций") @Test
    void criticalCases() {
    }
}

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


@DisplayNameGeneration(DisplayNameGeneratorUnitTest.ReplaceCamelCase.class)
class DisplayNameGeneratorUnitTest {
 
 @Test
    void camelCaseName() {
    }
 
 static class ReplaceCamelCase extends DisplayNameGenerator.Standard {
        @Override
 public String generateDisplayNameForClass(Class 
    testClass) { return super.generateDisplayNameForClass(testClass).toUpperCase(); } }
}

Видите, как все просто :)

Комментарии (11)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Мая Уровень 82
21 августа 2025
ну и как понять этот пример? @DisplayNameGeneration(DisplayNameGeneratorUnitTest.ReplaceCamelCase.class) class DisplayNameGeneratorUnitTest { @Test void camelCaseName() { } static class ReplaceCamelCase extends DisplayNameGenerator.Standard { @Override public String generateDisplayNameForClass(Class testClass) { return super.generateDisplayNameForClass(testClass).toUpperCase(); } } }
Денис Уровень 68
2 мая 2025
"Видите, как все просто :)" Нет, вижу, как всё сложно..
Дмитрий Саргаев Уровень 76 Expert
1 сентября 2023
Забыли написать, что для @Suite нужно добавить junit-platform-suite-engine в dependency, потому что его нет в стандартном junit-jupiter-api/engine/params ...
Realtrac Уровень 6
29 августа 2023
В начале обещалось упомянуть TestNG и хорошо бы сравнить их
Anonymous #3129578 Уровень 108
12 марта 2023
@Order это антипаттерн. Если тесты зависят друг от друга или от условий, это плохие тесты
Станислав Уровень 83 Expert
30 апреля 2024
Привет. Что тогда можно применить в таком случае, если я в партнёрском API сначала должен сделать расчёт стоимости договора одним методом, а следующим методом заключение договора, а я хотел бы весь процесс протестировать?
Адам Уровень 80 Expert
2 июля 2024
А вы можете пожалуйста сами дать правильный ответ свой вопрос ? (если знаете)
Станислав Уровень 83 Expert
5 июля 2024
Если это ко мне вопрос, то мне на тот момент казалось @Order подходящим решением.
20 ноября 2024
Интеграционное тестирование
Андраник Мамиконян Уровень 108 Expert
23 июня 2022
/* Комментарий удален */
(delta)Roman_Sula Уровень 108 Expert
17 июля 2022
https://javarush.com/quests/lectures/questservlets.level03.lecture01