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 позволяет такую фильтрацию через пользовательскую конфигурацию запуска/отладки:
Как показано на этом изображении, мы выбрали вид теста в качестве тегов и тег для выполнения в выражении тега.
JUnit 5 позволяет использовать различные выражения тегов , которые можно использовать для фильтрации тегов. Например, чтобы запустить все, кроме интеграционных тестов, мы могли бы использовать !IntegrationTest
в качестве выражения тега. Или для выполнения UnitTest
и IntegrationTest
мы можем использовать UnitTest | Интеграционный тест.
Точно так же Eclipse также позволяет включать или исключать теги в конфигурациях JUnit Run/Debug:
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 .