it-swarm.com.de

Wie kann ich meine Maven-Integrationstests ausführen lassen?

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

156
Peter Delaney

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>
92
serg10

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 .

226
Kief

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!

59
HDave

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.

Definiere eine Markierungsschnittstelle



public interface IntegrationTest {}

Markieren Sie Ihre Testklassen

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 {
    }

}

Maven Unit Tests konfigurieren



<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.

Maven-Integrationstests konfigurieren



<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.

25
John Dobie

Versuchen Sie es mit maven failsafe plugin . Sie können festlegen, dass bestimmte Tests eingeschlossen werden sollen.

15
James Kingsbery

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.

13
cletus

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.

9
Jorge

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
1
Dherik