web-dev-qa-db-fra.com

Comment puis-je exécuter mes tests d'intégration Maven?

J'ai un projet multi-module maven2 et, dans chacun de mes modules enfants, j'ai des tests JUnit nommés Test.Java et Integration.Java pour les tests unitaires et les tests d'intégration, respectivement. Quand j'exécute:

mvn test

tous les tests JUnit *Test.Java au sein des modules enfants sont exécutés. Quand j'exécute

mvn test -Dtest=**/*Integration

aucun des tests Integration.Java ne soit exécuté dans les modules enfants.

Celles-ci me semblent être la même commande, mais celle avec - Dtest =/* Integration ** ne fonctionne pas, elle affiche 0 tests en cours d’exécution au niveau parent, il n’y en a pas.

156
Peter Delaney

Vous pouvez configurer Surefire de Maven pour exécuter des tests unitaires et des tests d'intégration séparément. Dans la phase de test unitaire standard, vous exécutez tout ce qui ne correspond pas à un modèle de test d'intégration. Vous avez alors créer une deuxième phase de test qui exécute uniquement les tests d'intégration.

Voici un exemple:

    <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

Le cycle de vie cycle de vie de la construction Maven inclut désormais la phase "intégration-test" permettant d'exécuter des tests d'intégration, qui sont exécutés séparément des tests unitaires exécutés pendant la phase "test". Il s'exécute après "package". Par conséquent, si vous exécutez "mvn verify", "mvn install" ou "mvn deploy", des tests d'intégration seront exécutés en cours de route.

Integration-test exécute par défaut des classes de test nommées **/IT*.Java, **/*IT.Java et **/*ITCase.Java, mais cette option peut être configurée.

Pour plus de détails sur la façon de câbler tout cela, voir le plug-in Failsafe , la page d'utilisation Failsafe (pas correctement lié à partir de la page précédente car j'écris ceci), et vérifiez également out cet article de blog Sonatype .

226
Kief

J'ai fait EXACTEMENT ce que vous voulez faire et cela fonctionne très bien. Les tests unitaires "* Tests" sont toujours exécutés et "* IntegrationTests" uniquement lorsque vous effectuez une installation mvn verify ou mvn. Voici l'extrait de mon POM. serg10 a presque eu raison .... mais pas tout à fait.

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

Bonne chance!

59
HDave

Vous pouvez les scinder très facilement en utilisant les catégories JUnit et Maven.
Ceci est montré très très brièvement ci-dessous en divisant les tests unitaires et d'intégration.

Définir une interface de marqueur



public interface IntegrationTest {}

Marquez vos classes de test

Ajoutez l'annotation de la catégorie en haut de votre classe de test. Il prend le nom de votre nouvelle interface.

import org.junit.experimental.categories.Category;

@Category(IntegrationTest.class)
public class ExampleIntegrationTest{

    @Test
    public void longRunningServiceTest() throws Exception {
    }

}

Configurer les tests unitaires Maven



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

Lorsque vous faites un mvn clean test, seuls vos tests unitaires non marqués seront exécutés.

Configurer les tests d'intégration Maven



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

La configuration utilise un objectif d'exécution standard pour exécuter le plug-in de sécurité lors de la phase de test d'intégration de la construction.

Vous pouvez maintenant faire un mvn clean install.
Cette fois, de même que les tests unitaires en cours d'exécution, les tests d'intégration sont exécutés pendant la phase de test d'intégration.

25
John Dobie

Vous devriez essayer d'utiliser maven failafe plugin . Vous pouvez lui dire d'inclure un certain ensemble de tests.

15
James Kingsbery

Par défaut, Maven exécute uniquement les tests dont Test figure quelque part dans le nom de la classe.

Renommez IntegrationTest et cela fonctionnera probablement.

Sinon, vous pouvez modifier la configuration de Maven pour inclure ce fichier, mais il est probablement plus facile et mieux de nommer vos tests SomethingTest.

De Inclusions et exclusions des tests :

Par défaut, le plug-in Surefire inclura automatiquement toutes les classes de test avec les modèles de caractère générique suivants:

  • "**/Test * .Java" - inclut tout son sous-répertoire et tous les noms de fichiers Java commençant par "Test".
  • "**/* Test.Java" - inclut tout son sous-répertoire et tous les noms de fichiers Java se terminant par "Test".
  • "**/* TestCase.Java" - inclut tout son sous-répertoire et tous les noms de fichiers Java se terminant par "TestCase".

Si les classes de test ne correspondent pas à la convention de dénomination, configurez le plug-in Surefire et spécifiez les tests que vous souhaitez inclure.

13
cletus

Une autre façon d'exécuter des tests d'intégration avec Maven consiste à utiliser la fonctionnalité de profil:

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

En cours d'exécution 'mvn clean install' exécutera la construction par défaut. Comme spécifié ci-dessus, les tests d'intégration seront ignorés. En cours d'exécution 'mvn clean install -P integration-tests' inclura les tests d'intégration (j'ignore également mes tests d'intégration de transfert). De plus, j'ai un serveur CI qui exécute mes tests d'intégration toutes les nuits et pour cela, je lance la commande 'mvn test -P integration-tests'.

9
Jorge

Vous pouvez suivre la documentation maven pour exécuter les tests unitaires avec la construction et exécuter les tests d'intégration séparément.

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

Cela vous permettra de fonctionner avec tous les tests d'intégration désactivés par défaut. Pour les exécuter, vous utilisez cette commande:

mvn install -DskipTests=false
1
Dherik