Перейти к основному содержимому

Тегирование и фильтрация тестов JUnit

· 5 мин. чтения

1. Обзор

Очень часто все наши тесты JUnit выполняются автоматически как часть сборки CI с использованием Maven. Однако на это часто уходит много времени.

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

В этом руководстве мы рассмотрим несколько методов фильтрации для тестовых случаев с JUnit 5 . В следующих разделах мы также рассмотрим различные механизмы фильтрации до JUnit 5.

2. Теги JUnit 5

2.1. Аннотирование тестов JUnit с помощью тега

С JUnit 5 мы можем фильтровать тесты, помечая их подмножество под уникальным именем тега. Например, предположим, что у нас есть как модульные тесты, так и интеграционные тесты, реализованные с использованием JUnit 5. Мы можем добавить теги к обоим наборам тестовых случаев:

@Test
@Tag("IntegrationTest")
public void testAddEmployeeUsingSimpelJdbcInsert() {
}

@Test
@Tag("UnitTest")
public void givenNumberOfEmployeeWhenCountEmployeeThenCountMatch() {
}

Отныне мы можем выполнять все тесты под определенным именем тега отдельно . Мы также можем пометить класс вместо методов. Тем самым включая все тесты в классе под тегом.

В следующих нескольких разделах мы увидим различные способы фильтрации и выполнения помеченных тестов JUnit.

2.2. Фильтрация тегов с помощью Test Suite

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

@SelectPackages("com.foreach.tags")
@IncludeTags("UnitTest")
public class EmployeeDAOUnitTestSuite {
}

Теперь, если мы запустим этот пакет, все тесты JUnit под тегом UnitTest будут выполнены . Точно так же мы можем исключить тесты с аннотацией ExcludeTags .

2.3. Фильтрация тегов с помощью плагина Maven Surefire

Для фильтрации тестов JUnit на различных этапах сборки Maven мы можем использовать плагин Maven Surefire. Плагин Surefire позволяет нам включать или исключать теги в конфигурации плагина :

<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<groups>UnitTest</groups>
</configuration>
</plugin>

Если мы сейчас запустим этот плагин, он выполнит все тесты, помеченные как UnitTest. Точно так же мы можем исключить тестовые случаи под именем тега:

<excludedGroups>IntegrationTest</excludedGroups>

2.4. Фильтрация тегов с помощью IDE

IDE теперь позволяют фильтровать тесты JUnit по тегам. Таким образом, мы можем выполнить определенный набор тестов с тегами непосредственно из нашей IDE.

IntelliJ позволяет такую фильтрацию через пользовательскую конфигурацию запуска/отладки:

./92a0367b959eaa08cd45f1ef76b990fc.jpg

Как показано на этом изображении, мы выбрали вид теста в качестве тегов и тег для выполнения в выражении тега.

JUnit 5 позволяет использовать различные выражения тегов , которые можно использовать для фильтрации тегов. Например, чтобы запустить все, кроме интеграционных тестов, мы могли бы использовать !IntegrationTest в качестве выражения тега. Или для выполнения UnitTest и IntegrationTest мы можем использовать UnitTest | Интеграционный тест.

Точно так же Eclipse также позволяет включать или исключать теги в конфигурациях JUnit Run/Debug:

./b9d2fc41efa01a8dccfe21caacdd6693.jpg

3. Категории JUnit 4

3.1. Классификация тестов JUnit

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

Мы можем создать столько категорий, реализуя интерфейсы маркеров, где имя интерфейса маркера представляет имя категории. В нашем примере мы реализуем две категории, UnitTest:

public interface UnitTest {
}

и интеграционный тест:

public interface IntegrationTest {
}

Теперь мы можем классифицировать наш JUnit, аннотировав его аннотацией категории :

@Test
@Category(IntegrationTest.class)
public void testAddEmployeeUsingSimpelJdbcInsert() {
}

@Test
@Category(UnitTest.class)
public void givenNumberOfEmployeeWhenCountEmployeeThenCountMatch() {
}

В нашем примере мы поместили аннотацию Category на тестовые методы. Точно так же мы можем добавить эту аннотацию к тестовому классу, таким образом добавив все тесты в одну категорию.

3.2. Категории Бегун

Чтобы выполнять тесты JUnit в категории, нам нужно реализовать класс набора тестов:

@RunWith(Categories.class)
@IncludeCategory(UnitTest.class)
@SuiteClasses(EmployeeDAOCategoryIntegrationTest.class)
public class EmployeeDAOUnitTestSuite {
}

Этот набор тестов можно запустить из IDE, и он будет выполнять все тесты JUnit в категории UnitTest . Точно так же мы также можем исключить категорию тестов из набора:

@RunWith(Categories.class)
@ExcludeCategory(IntegrationTest.class)
@SuiteClasses(EmployeeDAOCategoryIntegrationTest.class)
public class EmployeeDAOUnitTestSuite {
}

3.3. Исключение или включение категорий в Maven

Наконец, мы также можем включать или исключать категории тестов JUnit из сборки Maven. Таким образом, мы можем выполнять разные категории тестов JUnit в разных профилях Maven.

Для этого мы будем использовать плагин Maven Surefire:

<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<groups>com.foreach.categories.UnitTest</groups>
</configuration>
</plugin>

Точно так же мы можем исключить категорию из сборки Maven:

<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<excludedGroups>com.foreach.categories.IntegrationTest</excludedGroups>
</configuration>
</plugin>

Это похоже на пример, который мы обсуждали в предыдущем разделе. Единственное отличие состоит в том, что мы заменили имя тега полным именем реализации категории .

4. Фильтрация тестов JUnit с помощью плагина Maven Surefire

Оба рассмотренных нами подхода были реализованы с помощью библиотеки JUnit. Независимый от реализации способ фильтрации тестовых случаев заключается в следовании соглашению об именах. В нашем примере мы будем использовать суффикс UnitTest для модульных тестов и IntegrationTest для интеграционных тестов.

Теперь мы будем использовать плагин Maven Surefire для выполнения модульных или интеграционных тестов:

<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<excludes>
**/*IntegrationTest.java
</excludes>
</configuration>
</plugin>

Тег excludes фильтрует все интеграционные тесты и выполняет только модульные тесты . Такая конфигурация сэкономит значительное количество времени на сборку.

Кроме того, мы можем запускать плагин Surefire в различных профилях Maven с различными исключениями или включениями.

Хотя Surefire хорошо работает для фильтрации, рекомендуется использовать Failsafe Plugin для выполнения интеграционных тестов в Maven.

5. Вывод

В этой статье мы увидели способ помечать и фильтровать тестовые случаи с помощью JUnit 5. Мы использовали аннотацию Tag , а также видели различные способы фильтрации тестов JUnit с помощью определенного тега через IDE или в процессе сборки с использованием Maven.

Мы также обсуждали некоторые механизмы фильтрации до JUnit 5.

Все примеры доступны на Github .