JUnit-tests labelen en filteren

1. Overzicht

Het is heel gebruikelijk om al onze JUnit-tests automatisch uit te voeren als onderdeel van de CI-build met behulp van Maven. Dit is echter vaak tijdrovend.

Daarom we willen vaak onze tests filteren en ofwel unit tests ofwel integratietests of beide uitvoeren in verschillende stadia van het bouwproces.

In deze tutorial zullen we enkele filtertechnieken bekijken voor testcases met JUnit 5. In de volgende secties zullen we ook kijken naar verschillende filtermechanismen vóór JUnit 5.

2. Combineer 5 tags

2.1. Annoteren van JUnit-tests met Label

Met JUnit 5 kunnen we tests filteren door een subset ervan te taggen onder een unieke tagnaam. Stel dat we zowel unit-tests als integratietests hebben geïmplementeerd met JUnit 5. We kunnen tags toevoegen aan beide sets testcases:

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

Voortaan kunnen we voer alle tests afzonderlijk uit onder een bepaalde tagnaam. We kunnen de klasse ook taggen in plaats van methoden. Daarbij alle tests in een klas onder een tag opnemen.

In de volgende secties zullen we verschillende manieren zien om de getagde JUnit-tests te filteren en uit te voeren.

2.2. Tags filteren met Test Suite

Met JUnit 5 kunnen we testsuites implementeren waarmee we getagde testcases kunnen uitvoeren:

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

Als we deze suite runnen, alle JUnit-tests onder de tag Hoofdstuk toets zou worden uitgevoerd. Evenzo kunnen we tests uitsluiten met ExcludeTags annotatie.

2.3. Tags filteren met Maven Surefire Plugin

Voor het filteren van JUnit-tests binnen de verschillende fasen van de Maven-build kunnen we de Maven Surefire-plug-in gebruiken. De Surefire-plug-in stelt ons in staat om de tags in de plug-in-configuratie op te nemen of uit te sluiten:

 maven-surefire-plugin 2.20.1 UnitTest 

Als we deze plug-in nu uitvoeren, voert deze alle tests uit die zijn getagd als Hoofdstuk toets. Evenzo kunnen we testgevallen uitsluiten onder een tagnaam:

Integratietest

2.4. Tags filteren met een IDE

IDE's maken het nu mogelijk om de JUnit-tests op tags te filteren. Op deze manier kunnen we een specifieke reeks getagde tests rechtstreeks vanuit onze IDE uitvoeren.

IntelliJ staat dergelijke filtering toe via een aangepaste Run / Debug-configuratie:

Zoals in deze afbeelding te zien is, hebben we de testsoort als tags geselecteerd en de tag die in de tag-expressie moet worden uitgevoerd.

JUnit 5 staat verschillende tag-expressies toe die kunnen worden gebruikt om de tags te filteren. Bijvoorbeeld, om alles uit te voeren behalve de integratietests die we kunnen gebruiken !Integratietest als de tag-expressie. Of voor het uitvoeren van beide Hoofdstuk toets en Integratietest, we kunnen gebruiken UnitTest | Integratietest.

Evenzo staat Eclipse ook het opnemen of uitsluiten van tags toe in de JUnit Run / Debug-configuraties:

3. JUnit 4 categorieën

3.1. JUnit-tests categoriseren

Met JUnit 4 kunnen we een subset van JUnit-tests uitvoeren door ze in verschillende categorieën toe te voegen. Hierdoor kunnen we de testcases in een bepaalde categorie uitvoeren terwijl we andere categorieën uitsluiten.

We kunnen zoveel categorieën maken door markeringsinterfaces te implementeren waarbij de naam van de markeringsinterface de naam van de categorie vertegenwoordigt. Voor ons voorbeeld zullen we twee categorieën implementeren, Hoofdstuk toets:

openbare interface UnitTest {}

en Integratietest:

openbare interface IntegrationTest {}

Nu kunnen we onze JUnit categoriseren door deze te annoteren met Categorie annotatie:

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

In ons voorbeeld plaatsen we de Categorie annotatie over de testmethoden. Op dezelfde manier kunnen we deze annotatie ook aan de testklasse toevoegen, waardoor alle tests in één categorie worden samengevoegd.

3.2. Categorieën Loper

Om JUnit-tests in een categorie uit te voeren, moeten we een testsuite-klasse implementeren:

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

Deze testsuite kan worden uitgevoerd vanaf een IDE en zou alle JUnit-tests uitvoeren onder de Hoofdstuk toets categorie. Evenzo kunnen we ook een categorie tests in de suite uitsluiten:

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

3.3. Categorieën uitsluiten of opnemen in Maven

Ten slotte kunnen we ook de categorieën JUnit-tests opnemen of uitsluiten van de Maven-build. We kunnen dus verschillende categorieën JUnit-tests uitvoeren in verschillende Maven-profielen.

We gebruiken hiervoor de Maven Surefire-plug-in:

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

En op dezelfde manier kunnen we een categorie uitsluiten van de Maven-build:

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

Dit is vergelijkbaar met het voorbeeld dat we in de vorige sectie hebben besproken. Het enige verschil is dat we de tagnaam hebben vervangen door de volledig gekwalificeerde naam van het Categorie implementatie.

4. JUnit-tests filteren met de Surefire-plug-in van Maven

Beide benaderingen die we hebben besproken, zijn geïmplementeerd met de JUnit-bibliotheek. Een implementatie-agnostische manier om testgevallen te filteren is door een naamgevingsconventie te volgen. Voor ons voorbeeld gebruiken we het UnitTest-achtervoegsel voor unit-tests en IntegrationTest voor integratietests.

Nu gebruiken we de Maven Surefire-plug-in voor het uitvoeren van de unit-tests of de integratietests:

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

De sluit uit tag hier filtert alle integratietests en voert alleen de unit tests uit. Een dergelijke configuratie zou een aanzienlijke hoeveelheid bouwtijd besparen.

Bovendien kunnen we het Zeker plug-in binnen verschillende Maven-profielen met verschillende uitsluitingen of insluitsels.

Hoewel Zeker werkt goed voor filteren, het wordt aanbevolen om de Failsafe-plug-in te gebruiken voor het uitvoeren van integratietests in Maven.

5. Conclusie

In dit artikel hebben we een manier gezien om testgevallen te taggen en te filteren met JUnit 5. We gebruikten de Label annotatie en zag ook verschillende manieren om de JUnit-tests met een specifieke tag te filteren via de IDE of in het buildproces met behulp van Maven.

We hebben ook enkele van de filtermechanismen besproken vóór JUnit 5.

Alle voorbeelden zijn beschikbaar op Github.