Маркиране и филтриране на JUnit тестове

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 ни позволява да внедрим тестови пакети, чрез които можем да изпълняваме маркирани тестови случаи:

@RunWith(JUnitPlatform.class) @SelectPackages("com.baeldung.tags") @IncludeTags("UnitTest") public class EmployeeDAOUnitTestSuite { }

Сега, ако стартираме този пакет, ще бъдат изпълнени всички тестове на JUnit под етикета UnitTest . По подобен начин можем да изключим тестове с анотация ExcludeTags .

2.3. Филтриране на етикети с приставка Maven Surefire

За филтриране на тестове JUnit в различните фази на компилацията на Maven, можем да използваме приставката Maven Surefire. Приставката Surefire ни позволява да включим или изключим маркерите в конфигурацията на приставката :

 maven-surefire-plugin 2.20.1  UnitTest  

Ако сега изпълним този плъгин, той ще изпълни всички тестове, които са маркирани като UnitTest. По същия начин можем да изключим тестови случаи под име на маркер:

IntegrationTest

2.4. Филтриране на тагове с IDE

IDE вече позволяват филтриране на тестовете JUnit по тагове. По този начин можем да изпълним определен набор от маркирани тестове директно от нашата IDE.

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

Както е показано на това изображение, ние избрахме Test Kind като маркери и етикета, който ще се изпълни в израза на маркера.

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

По подобен начин Eclipse също позволява включване или изключване на маркери в конфигурациите JUnit Run / Debug:

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

3.1. Категоризиране на JUnit тестове

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

Можем да създадем колкото се може повече категории, като внедряваме интерфейси на маркери, където името на интерфейса на маркера представлява името на категорията. За нашия пример ще приложим две категории, UnitTest:

public interface UnitTest { }

и IntegrationTest:

public interface IntegrationTest { }

Сега можем да категоризираме нашия JUnit, като го анотираме с анотация на категория :

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

В нашия пример ние поставяме анотацията на категорията върху методите за тестване. По същия начин можем да добавим тази анотация към тестовия клас, като по този начин добавим всички тестове в една категория.

3.2. Категории Runner

За да изпълним 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:

 maven-surefire-plugin 2.20.1  com.baeldung.categories.UnitTest  

И по подобен начин можем да изключим категория от компилацията на Maven:

 maven-surefire-plugin 2.20.1  com.baeldung.categories.IntegrationTest  

Това е подобно на примера, който обсъдихме в предишния раздел. Единствената разлика е, че заменихме името на маркера с напълно квалифицираното име на изпълнението на категорията .

4. Filtering JUnit Tests with Maven Surefire Plugin

Both of the approaches we've discussed have been implemented with the JUnit library. An implementation agnostic way of filtering test cases is by following a naming convention. For our example, we'll use UnitTest suffix for unit tests and IntegrationTest for integration tests.

Now we'll use the Maven Surefire Plugin for executing either the unit tests or the integrations tests:

 maven-surefire-plugin 2.20.1   **/*IntegrationTest.java   

The excludes tag here filters all integration tests and executes only the unit tests. Such a configuration would save a considerable amount of build time.

Furthermore, we can execute the Surefire plugin within various Maven profiles with different exclusions or inclusions.

Въпреки че Surefire работи добре за филтриране, препоръчително е да използвате приставката Failsafe за изпълнение на интеграционни тестове в Maven.

5. Заключение

В тази статия видяхме начин за маркиране и филтриране на тестови случаи с JUnit 5. Използвахме анотацията Tag и също така видяхме различни начини за филтриране на тестовете JUnit с конкретен маркер чрез IDE или в процеса на изграждане с помощта на Maven.

Също така обсъдихме някои от филтриращите механизми преди JUnit 5.

Всички примери са достъпни в Github.