Ich habe ein maven2-Projekt mit mehreren Modulen und in jedem meiner untergeordneten Module habe ich JUnit-Tests mit dem Namen Test.Java
und Integration.Java
für Unit-Tests bzw. Integrationstests. Wenn ich ausführe:
mvn test
alle JUnit-Tests *Test.Java
innerhalb der Kindmodule ausgeführt werden. Wenn ich ausführe
mvn test -Dtest=**/*Integration
keine von Integration.Java
Tests werden in den untergeordneten Modulen ausgeführt.
Dies scheint mir genau der gleiche Befehl zu sein, aber der mit der - Dtest =/* Integration ** funktioniert nicht. Es werden 0 Tests auf der übergeordneten Ebene ausgeführt, für die es keine Tests gibt
Sie können Maven's Surefire so einrichten, dass Unit-Tests und Integrationstests separat ausgeführt werden. In der Standard-Unit-Test-Phase führen Sie alles aus, was nicht mit einem Integrationstest übereinstimmt. Anschließend erstellen Sie eine zweite Testphase , in der nur die Integrationstests ausgeführt werden.
Hier ist ein Beispiel:
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludes>
<exclude>**/*IntegrationTest.Java</exclude>
</excludes>
</configuration>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>test</goal>
</goals>
<phase>integration-test</phase>
<configuration>
<excludes>
<exclude>none</exclude>
</excludes>
<includes>
<include>**/*IntegrationTest.Java</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
Der Maven Build Lifecycle enthält jetzt die "Integration-Test" -Phase zum Ausführen von Integrationstests, die getrennt von den Unit-Tests ausgeführt werden, die während der "Test" -Phase ausgeführt werden. Es wird nach "package" ausgeführt. Wenn Sie also "mvn verify", "mvn install" oder "mvn deploy" ausführen, werden nebenbei Integrationstests ausgeführt.
Standardmäßig führt Integrationstest Testklassen mit den Namen **/IT*.Java
, **/*IT.Java
Und **/*ITCase.Java
Aus. Dies kann jedoch konfiguriert werden.
Einzelheiten zur Verkabelung finden Sie im Failsafe-Plugin , auf der Failsafe-Verwendungsseite (nicht korrekt von der vorherigen Seite verlinkt, während ich dies schreibe) out dieser Sonatype-Blogpost .
Ich habe genau das getan, was Sie tun möchten und es funktioniert großartig. Unit-Tests "* Tests" werden immer ausgeführt, und "* IntegrationTests" werden nur ausgeführt, wenn Sie eine MVN-Überprüfung oder -Installation durchführen. Hier der Ausschnitt aus meinem POM. serg10 hatte es fast richtig .... aber nicht ganz.
<plugin>
<!-- Separates the unit tests from the integration tests. -->
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!-- Skip the default running of this plug-in (or everything is run twice...see below) -->
<skip>true</skip>
<!-- Show 100% of the lines from the stack trace (doesn't work) -->
<trimStackTrace>false</trimStackTrace>
</configuration>
<executions>
<execution>
<id>unit-tests</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<!-- Never skip running the tests when the test phase is invoked -->
<skip>false</skip>
<includes>
<!-- Include unit tests within integration-test phase. -->
<include>**/*Tests.Java</include>
</includes>
<excludes>
<!-- Exclude integration tests within (unit) test phase. -->
<exclude>**/*IntegrationTests.Java</exclude>
</excludes>
</configuration>
</execution>
<execution>
<id>integration-tests</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<!-- Never skip running the tests when the integration-test phase is invoked -->
<skip>false</skip>
<includes>
<!-- Include integration tests within integration-test phase. -->
<include>**/*IntegrationTests.Java</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
Viel Glück!
Sie können sie sehr einfach mit JUnit-Kategorien und Maven teilen.
Dies wird im Folgenden sehr, sehr kurz durch Splitting Unit- und Integrationstests gezeigt.
public interface IntegrationTest {}
Fügen Sie die Kategorieanmerkung oben in Ihre Testklasse ein. 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 {
}
}
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.11</version>
<configuration>
<includes>
<include>**/*.class</include>
</includes>
<excludedGroups>
com.test.annotation.type.IntegrationTest
</excludedGroups>
</configuration>
</plugin>
Wenn Sie ein mvn clean test
werden nur Ihre nicht markierten Komponententests ausgeführt.
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<includes>
<include>**/*.class</include>
</includes>
<groups>
com.test.annotation.type.IntegrationTest
</groups>
</configuration>
</plugin>
Die Konfiguration verwendet ein Standardausführungsziel, um das ausfallsichere Plug-in während der Integrations-Testphase des Builds auszuführen.
Sie können jetzt ein mvn clean install
.
Diesmal werden neben den laufenden Unit-Tests auch die Integrationstests in der Integrations-Test-Phase durchgeführt.
Versuchen Sie es mit maven failsafe plugin . Sie können festlegen, dass bestimmte Tests eingeschlossen werden sollen.
Standardmäßig führt Maven nur Tests aus, deren Klassenname Test enthält.
Benenne es in IntegrationTest um und es wird wahrscheinlich funktionieren.
Alternativ können Sie die Maven-Konfiguration ändern, um diese Datei einzuschließen, aber es ist wahrscheinlich einfacher und besser, Ihren Tests nur den Namen SomethingTest zu geben.
Von Einschlüsse und Ausschlüsse von Tests :
Standardmäßig enthält das Surefire-Plugin automatisch alle Testklassen mit den folgenden Platzhaltern:
- "**/Test * .Java" - Enthält das gesamte Unterverzeichnis und alle Java Dateinamen, die mit "Test" beginnen.
- "**/* Test.Java" - enthält das gesamte Unterverzeichnis und alle Java Dateinamen, die mit "Test" enden.
- "**/* TestCase.Java" - Enthält das gesamte Unterverzeichnis und alle Java Dateinamen, die auf "TestCase" enden.
Wenn die Testklassen nicht der Namenskonvention entsprechen, konfigurieren Sie das Surefire-Plug-in und geben Sie die Tests an, die Sie einschließen möchten.
Eine andere Möglichkeit, Integrationstests mit Maven durchzuführen, besteht darin, die Profilfunktion zu verwenden:
...
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>**/*Test.Java</include>
</includes>
<excludes>
<exclude>**/*IntegrationTest.Java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>integration-tests</id>
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>**/*IntegrationTest.Java</include>
</includes>
<excludes>
<exclude>**/*StagingIntegrationTest.Java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
...
Wenn Sie 'mvn clean install' ausführen, wird der Standardbuild ausgeführt. Wie oben angegeben, werden Integrationstests ignoriert. Das Ausführen von 'mvn clean install -P integration-tests' schließt die Integrationstests ein (ich ignoriere auch meine Staging-Integrationstests). Außerdem habe ich einen CI-Server, auf dem meine Integrationstests jede Nacht ausgeführt werden. Dazu gebe ich den Befehl 'mvn test -P integration-tests' aus.
Sie können der Maven-Dokumentation folgen, um die Komponententests mit dem Build auszuführen und die Integrationstests separat auszuführen.
<project>
<properties>
<skipTests>true</skipTests>
</properties>
[...]
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.20.1</version>
<configuration>
<skipITs>${skipTests}</skipITs>
</configuration>
</plugin>
</plugins>
</build>
[...]
</project>
Auf diese Weise können Sie alle Integrationstests ausführen, die standardmäßig deaktiviert sind. Um sie auszuführen, verwenden Sie diesen Befehl:
mvn install -DskipTests=false