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();
        }
 }
}

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