Java >> Java tutorial >  >> Tag >> JUnit

Tagging og filtrering af JUnit-tests

1. Oversigt

Det er meget almindeligt at udføre alle vores JUnit-test automatisk som en del af CI-bygningen ved hjælp af Maven. Dette er dog ofte tidskrævende.

Derfor ønsker vi ofte at filtrere vores tests og udføre enten enhedstests eller integrationstests eller begge dele på forskellige stadier af byggeprocessen.

I denne øvelse vil vi se på nogle få filtreringsteknikker for testcases med JUnit 5. I de følgende afsnit vil vi også se på forskellige filtreringsmekanismer før JUnit 5.

2. JUnit 5-tags

2.1. Annotering af JUnit-tests med Tag

Med JUnit 5 kan vi filtrere tests ved at tagge en delmængde af dem under et unikt tagnavn. Antag for eksempel, at vi har implementeret både enhedstests og integrationstests ved hjælp af JUnit 5. Vi kan tilføje tags på begge sæt testcases:

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

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

Fremover kan vi udføre alle tests under et bestemt tagnavn separat . Vi kan også tagge klassen i stedet for metoder. Derved medtages alle prøver i en klasse under et tag.

I de næste par sektioner vil vi se forskellige måder at filtrere og udføre de mærkede JUnit-tests på.

2.2. Filtrering af tags med Test Suite

JUnit 5 giver os mulighed for at implementere testpakker, hvorigennem vi kan udføre taggede testcases:

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

Nu, hvis vi kører denne suite, alle JUnit-tests under tagget UnitTest ville blive udført . På samme måde kan vi ekskludere tests med ExcludeTags  annotation.

2.3. Filtrering af tags med Maven Surefire Plugin

Til filtrering af JUnit-tests inden for de forskellige faser af Maven-bygningen kan vi bruge Maven Surefire-plugin'et. Surefire-pluginnet giver os mulighed for at inkludere eller ekskludere tags i plugin-konfigurationen :

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

Hvis vi nu udfører dette plugin, vil det udføre alle test, der er tagget som UnitTest. På samme måde kan vi ekskludere testcases under et tagnavn:

<excludedGroups>IntegrationTest</excludedGroups>

2.4. Filtrering af tags med en IDE

IDE'er tillader nu filtrering af JUnit-testene efter tags. På denne måde kan vi udføre et specifikt sæt af mærkede tests direkte fra vores IDE.

IntelliJ tillader sådan filtrering gennem en tilpasset kørsel/fejlretningskonfiguration:

Som vist på dette billede valgte vi testtypen som tags og taggen, der skal udføres i tagudtrykket.

JUnit 5 tillader forskellige tag-udtryk, som kan bruges til at filtrere tags. For eksempel, til at køre alt undtagen integrationstesten, kunne vi bruge !IntegrationTest  som tag-udtrykket. Eller til at udføre begge UnitTest  og IntegrationTest,  vi kan bruge UnitTest | Integrationstest.

På samme måde tillader Eclipse også at inkludere eller ekskludere tags i JUnit Run/Debug-konfigurationerne:

3. JUnit 4-kategorier

3.1. Kategorisering af JUnit-tests

JUnit 4 giver os mulighed for at udføre en delmængde af JUnit-tests ved at tilføje dem i forskellige kategorier. Som et resultat kan vi udføre testcaserne i en bestemt kategori, mens vi ekskluderer andre kategorier.

Vi kan oprette lige så mange kategorier ved at implementere markørgrænseflader, hvor navnet på markørgrænsefladen repræsenterer navnet på kategorien. For vores eksempel implementerer vi to kategorier, UnitTest:

public interface UnitTest {
}

og Integrationstest:

public interface IntegrationTest {
}

Nu kan vi kategorisere vores JUnit ved at annotere den med Kategori anmærkning:

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

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

I vores eksempel sætter vi Kategori  anmærkning om testmetoderne. På samme måde kan vi også tilføje denne annotation på testklassen og dermed tilføje alle tests i én kategori.

3.2. Kategorier  Løber

For at udføre JUnit-tests i en kategori, skal vi implementere en testsuite-klasse:

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

Denne testpakke kan udføres fra en IDE og vil udføre alle JUnit-tests under UnitTest kategori. På samme måde kan vi også udelukke en kategori af tests i pakken:

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

3.3. Udelukke eller inkludere kategorier i Maven

Endelig kan vi også inkludere eller udelukke kategorierne af JUnit-tests fra Maven-bygningen. Således kan vi udføre forskellige kategorier af JUnit-tests i forskellige Maven-profiler.

Vi bruger Maven Surefire plugin til dette:

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

Og på samme måde kan vi ekskludere en kategori fra Maven-bygningen:

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

Dette svarer til det eksempel, vi diskuterede i det foregående afsnit. Den eneste forskel er, at vi erstattede tagnavnet med det fuldt kvalificerede navn på Kategorien  implementering.

4. Filtrering af JUnit-tests med Maven Surefire Plugin

Begge de tilgange, vi har diskuteret, er blevet implementeret med JUnit-biblioteket. En implementeringsagnostisk måde at filtrere testcases på er ved at følge en navnekonvention. Til vores eksempel bruger vi UnitTest-suffiks til enhedstest og IntegrationTest til integrationstest.

Nu vil vi bruge Maven Surefire Plugin til at udføre enten enhedstestene eller integrationstestene:

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

Det ekskluderer  tag her filtrerer alle integrationstest og udfører kun enhedstestene . En sådan konfiguration ville spare en betydelig mængde byggetid.

Desuden kan vi udføre Surefire  plugin inden for forskellige Maven-profiler med forskellige ekskluderinger eller inkluderinger.

Selvom Surefire  fungerer godt til filtrering, det anbefales at bruge Failsafe Plugin til at udføre integrationstest i Maven.

5. Konklusion

I denne artikel så vi en måde at tagge og filtrere testcases med JUnit 5. Vi brugte Tag  annotering og så også forskellige måder til at filtrere JUnit-testene med et specifikt tag gennem IDE'en eller i byggeprocessen ved hjælp af Maven.

Vi diskuterede også nogle af filtreringsmekanismerne før JUnit 5.

Alle eksempler er tilgængelige på Github.


Java tag