Sie können sie sehr einfach mit JUnit-Kategorien und Maven aufteilen.
Dies wird im Folgenden sehr, sehr kurz durch Aufteilen von Einheiten- und Integrationstests gezeigt.
Definieren Sie eine Marker-Schnittstelle
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 {}
Markieren Sie Ihre Testklassen
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 {
}
}
Konfigurieren Sie Maven Unit Tests
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.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.11</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.12</version>
</dependency>
</dependencies>
<configuration>
<includes>
<include>**/*.class</include>
</includes>
<excludedGroups>com.test.annotation.type.IntegrationTest</excludedGroups>
</configuration>
</plugin>
Wenn Sie einen MVN-Bereinigungstest durchführen, werden nur Ihre nicht markierten Komponententests ausgeführt.
Konfigurieren Sie Maven-Integrationstests
Auch hier ist die Konfiguration sehr einfach.
Verwenden Sie Folgendes, um nur die Integrationstests auszuführen:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.11</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.12</version>
</dependency>
</dependencies>
<configuration>
<groups>com.test.annotation.type.IntegrationTest</groups>
</configuration>
</plugin>
Wenn Sie dies in ein Profil mit der ID einbinden IT
, können Sie nur die Schnelltests mit ausführen mvn clean install
. Verwenden Sie, um nur die Integrations- / langsamen Tests auszuführen mvn clean install -P IT
.
In den meisten Fällen möchten Sie jedoch standardmäßig die schnellen Tests und alle Tests mit ausführen -P IT
. Wenn das der Fall ist, müssen Sie einen Trick anwenden:
<profiles>
<profile>
<id>IT</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludedGroups>java.io.Serializable</excludedGroups> <!-- An empty element doesn't overwrite, so I'm using an interface here which no one will ever use -->
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
Wie Sie sehen können, schließe ich Tests aus, die mit Anmerkungen versehen sind java.io.Serializable
. Dies ist erforderlich, da das Profil die Standardkonfiguration des Surefire-Plugins erbt. Selbst wenn Sie <excludedGroups/>
oder sagen <excludedGroups></excludedGroups>
, wird der Wert com.test.annotation.type.IntegrationTest
verwendet.
Sie können es auch nicht verwenden, none
da es sich um eine Schnittstelle im Klassenpfad handeln muss (Maven überprüft dies).
Anmerkungen:
- Die Abhängigkeit von
surefire-junit47
ist nur erforderlich, wenn Maven nicht automatisch zum JUnit 4-Runner wechselt. Die Verwendung des Elements groups
oder excludedGroups
sollte den Schalter auslösen. Siehe hier .
- Der größte Teil des obigen Codes stammt aus der Dokumentation für das Maven Failsafe-Plugin. Siehe den Abschnitt "Verwenden von JUnit-Kategorien" auf dieser Seite .
- Während meiner Tests stellte ich fest, dass dies sogar funktioniert, wenn Sie
@RunWith()
Anmerkungen zum Ausführen von Suites oder Spring-basierten Tests verwenden.