Unit- und Integrationstests mit Maven- und JUnit-Kategorien

Dieses Beispiel zeigt, wie Einheiten- und Integrationstests mithilfe der Kategorien Maven und JUnit aufgeteilt werden.

Es ist besonders nützlich für vorhandene Testsuiten und kann in wenigen Minuten implementiert werden.

Mein vorheriger Beitrag hat gezeigt, wie wir ein Maven-Profil verwenden, um Einheiten- und Integrationstests aufzuteilen.

//johndobie.blogspot.co.uk/2011/06/seperating-maven-unit-integration-tests.html

Dies war ein sehr gut gelesener Beitrag und ich mag, wie es separate Verzeichnisse verwendet. Dieses Beispiel zeigt jedoch eine viel einfachere Technik, die leicht auf ältere Testsuiten angewendet werden kann.

Es bietet die meisten Vorteile des Originals und sitzt bequemer in der Maven-Welt.

Der Code für das Beispiel ist hier.

svn co //designbycontract.googlecode.com/svn/trunk/examples/maven/categor... mvn clean install 

Ab JUnit 4.8 können Sie eigene Kategorien für Tests definieren. Auf diese Weise können Sie Tests kennzeichnen und gruppieren.

Dieses Beispiel zeigt, wie einfach es ist, Einheiten- und Integrationstests mithilfe der Annotation @Catgegory zu trennen.

//kentbeck.github.com/junit/javadoc/latest/org/junit/experimental/categories/Categories.html

Der erste Schritt beim Gruppieren eines Tests anhand von Kategorien besteht darin, eine Markierungsschnittstelle zu erstellen.

Diese Schnittstelle wird verwendet, um alle Tests, die Sie ausführen möchten, als Integrationstests zu markieren.

public interface IntegrationTest {} 

Fügen Sie die Kategorieanmerkung oben in Ihrer Testklasse hinzu. Es nimmt den Namen Ihrer neuen Schnittstelle an.

import org.junit.experimental.categories.Category; @Category(IntegrationTest.class) public class ExampleIntegrationTest{ @Test public void longRunningServiceTest() throws Exception { } } 

Kategorien können verwendet werden, um Klassen oder Methoden zu markieren. Wirklich meiner Meinung nach sollten Sie nur eine Klasse markieren.

Wenn Sie sowohl Unit- als auch Integrationstests in einer Klasse haben, teilen Sie diese auf.

Das Schöne an dieser Lösung ist, dass sich für den Unit-Test nichts wirklich ändert.

Wir fügen dem Maven Surefire-Plugin einfach eine Konfiguration hinzu, damit Integrationstests ignoriert werden.

 org.apache.maven.plugins maven-surefire-plugin 2.11   org.apache.maven.surefire surefire-junit47 2.12     **/*.class  com.test.annotation.type.IntegrationTest   

Es gibt 2 sehr wichtige Teile. Die erste besteht darin, todsicher zu konfigurieren, um alle Integrationstests auszuschließen.

com.test.annotation.type.IntegrationTest 

Surefire führt alle Ihre Tests aus, mit Ausnahme derjenigen, die als Integrationstest gekennzeichnet sind.

Der andere wichtige Teil ist, sicherzustellen, dass das todsichere Plugin den richtigen JUnit-Anbieter verwendet. Der JUnit47-Anbieter wird benötigt, um die Kategorien korrekt zu erkennen.

  org.apache.maven.surefire surefire-junit47 2.12   

Um sicherzustellen, dass dies korrekt funktioniert, können wir die Unit-Tests durchführen

mvn clean test 

Sie können der folgenden Ausgabe entnehmen, dass der Komponententest ausgeführt wird, nicht jedoch der Integrationstest.

------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.test.EmptyUnitTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ 

Auch hier ist die Konfiguration sehr einfach.

Wir verwenden das ausfallsichere Standard-Plugin und konfigurieren es so, dass nur die Integrationstests ausgeführt werden.

 maven-failsafe-plugin 2.12   org.apache.maven.surefire surefire-junit47 2.12    com.test.annotation.type.IntegrationTest     integration-test    **/*.class      

Die Konfiguration verwendet ein Standardausführungsziel, um das ausfallsichere Plugin während der Integrationstestphase des Builds auszuführen.

Die folgende Konfiguration stellt sicher, dass nur die Integrationstests ausgeführt werden.

com.test.annotation.type.IntegrationTest 

Und wieder muss der JUnit-Provider korrekt konfiguriert sein.

  org.apache.maven.surefire surefire-junit47 2.12   

Das ist es!

Wir können jetzt den gesamten Build ausführen.

mvn clean install 

Dieses Mal werden neben dem Unit-Test die Integrationstests während der Integrationstestphase ausgeführt.

------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.test.AnotherEmptyIntegrationTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.016 sec Running com.test.EmptyIntegrationTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Results : Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 

Schauen Sie sich diesen Link an, um zu sehen, wie einfach es ist, dieser Methode Codeabdeckung hinzuzufügen.

//johndobie.blogspot.co.uk/2012/05/easy-unit-and-integration-code-coverage.html

Für ein vollständigeres Beispiel, das Tomcat und eine Datenbank verwendet, wird gestartet.

svn co //designbycontract.googlecode.com/svn/trunk/examples/maven/code-co... mvn clean install -Ptomcat-embedded 

Es basiert auf diesem Beispiel

//johndobie.blogspot.com/2011/10/maven-integration-testing-and-spring.html

Diese Geschichte "Unit- und Integrationstests mit Maven- und JUnit-Kategorien" wurde ursprünglich von JavaWorld veröffentlicht.