JUnit-Tests markieren und filtern

1. Übersicht

Es ist sehr üblich, alle unsere JUnit-Tests automatisch als Teil des CI-Builds mit Maven auszuführen. Dies ist jedoch oft zeitaufwändig.

Daher möchten wir unsere Tests häufig filtern und entweder Unit-Tests oder Integrationstests oder beides in verschiedenen Phasen des Erstellungsprozesses ausführen.

In diesem Tutorial werden einige Filtertechniken für Testfälle mit JUnit 5 vorgestellt. In den folgenden Abschnitten werden auch verschiedene Filtermechanismen vor JUnit 5 beschrieben.

2. JUnit 5 Tags

2.1. Annotieren von JUnit-Tests mit Tag

Mit JUnit 5 können wir Tests filtern, indem wir eine Teilmenge davon unter einem eindeutigen Tag-Namen markieren. Angenommen, wir haben sowohl Komponententests als auch Integrationstests mit JUnit 5 implementiert. Wir können Tags für beide Testfallgruppen hinzufügen:

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

Von nun an können wir alle Tests unter einem bestimmten Tag-Namen separat ausführen . Wir können die Klasse auch anstelle von Methoden markieren. Dabei werden alle Tests in einer Klasse unter einem Tag eingeschlossen.

In den nächsten Abschnitten werden verschiedene Möglichkeiten zum Filtern und Ausführen der markierten JUnit-Tests vorgestellt.

2.2. Tags mit Test Suite filtern

Mit JUnit 5 können wir Testsuiten implementieren, über die wir markierte Testfälle ausführen können:

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

Wenn wir diese Suite ausführen , werden jetzt alle JUnit-Tests unter dem Tag UnitTest ausgeführt . Ebenso können wir Tests mit der Annotation ExcludeTags ausschließen .

2.3. Filtern von Tags mit dem Maven Surefire Plugin

Zum Filtern von JUnit-Tests in den verschiedenen Phasen des Maven-Builds können wir das Maven Surefire-Plugin verwenden. Mit dem Surefire-Plugin können wir die Tags in der Plugin-Konfiguration ein- oder ausschließen :

 maven-surefire-plugin 2.20.1  UnitTest  

Wenn wir dieses Plugin jetzt ausführen, werden alle Tests ausgeführt, die als UnitTest gekennzeichnet sind. Ebenso können wir Testfälle unter einem Tag-Namen ausschließen:

IntegrationTest

2.4. Tags mit einer IDE filtern

IDEs ermöglichen jetzt das Filtern der JUnit-Tests nach Tags. Auf diese Weise können wir einen bestimmten Satz von markierten Tests direkt von unserer IDE aus ausführen.

IntelliJ ermöglicht eine solche Filterung über eine benutzerdefinierte Run / Debug-Konfiguration:

Wie in diesem Bild gezeigt, haben wir die Testart als Tags und das Tag ausgewählt, das im Tag-Ausdruck ausgeführt werden soll.

JUnit 5 ermöglicht verschiedene Tag-Ausdrücke, mit denen die Tags gefiltert werden können. Um beispielsweise alles außer den Integrationstests auszuführen, können wir ! IntegrationTest als Tag-Ausdruck verwenden. Oder um UnitTest und IntegrationTest auszuführen , können Sie UnitTest | verwenden Integrationstest.

In ähnlicher Weise ermöglicht Eclipse auch das Einschließen oder Ausschließen von Tags in den JUnit Run / Debug-Konfigurationen:

3. JUnit 4 Kategorien

3.1. Kategorisieren von JUnit-Tests

Mit JUnit 4 können wir eine Teilmenge von JUnit-Tests ausführen, indem wir sie in verschiedene Kategorien einfügen. Infolgedessen können wir die Testfälle in einer bestimmten Kategorie ausführen und andere Kategorien ausschließen.

Wir können so viele Kategorien erstellen, indem wir Markierungsschnittstellen implementieren, wobei der Name der Markierungsschnittstelle den Namen der Kategorie darstellt. In unserem Beispiel implementieren wir zwei Kategorien, UnitTest:

public interface UnitTest { }

und IntegrationTest:

public interface IntegrationTest { }

Jetzt können wir unsere JUnit kategorisieren, indem wir sie mit einer Kategorieanmerkung versehen :

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

In unserem Beispiel setzen wir die Kategorie- Annotation auf die Testmethoden. In ähnlicher Weise können wir diese Anmerkung auch zur Testklasse hinzufügen und so alle Tests zu einer Kategorie hinzufügen.

3.2. Kategorien Runner

Um JUnit-Tests in einer Kategorie auszuführen, müssen Sie eine Testsuite-Klasse implementieren:

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

Diese Testsuite kann über eine IDE ausgeführt werden und führt alle JUnit-Tests unter der Kategorie UnitTest aus . In ähnlicher Weise können wir auch eine Kategorie von Tests in der Suite ausschließen:

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

3.3. Kategorien in Maven ausschließen oder einschließen

Schließlich können wir auch die Kategorien von JUnit-Tests in den Maven-Build einschließen oder ausschließen. Somit können wir verschiedene Kategorien von JUnit-Tests in verschiedenen Maven-Profilen ausführen.

Wir werden das Maven Surefire Plugin dafür verwenden:

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

Ebenso können wir eine Kategorie aus dem Maven-Build ausschließen:

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

Dies ähnelt dem Beispiel, das wir im vorherigen Abschnitt besprochen haben. Der einzige Unterschied besteht darin, dass wir den Tag-Namen durch den vollständig qualifizierten Namen der Kategorie- Implementierung ersetzt haben.

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.

Obwohl Surefire gut zum Filtern geeignet ist, wird empfohlen, das Failsafe-Plugin zum Ausführen von Integrationstests in Maven zu verwenden.

5. Schlussfolgerung

In diesem Artikel haben wir eine Möglichkeit gesehen, Testfälle mit JUnit 5 zu kennzeichnen und zu filtern. Wir haben die Tag- Annotation verwendet und verschiedene Möglichkeiten zum Filtern der JUnit-Tests mit einem bestimmten Tag über die IDE oder im Erstellungsprozess mit Maven gesehen.

Wir haben auch einige der Filtermechanismen vor JUnit 5 besprochen.

Alle Beispiele sind bei Github erhältlich.