71 votes

Sauter des tests dans certains modules dans Maven

J'aimerais que mes constructions Maven exécutent la plupart des tests unitaires. Mais il y a des tests unitaires dans un projet qui sont plus lents et j'aimerais les exclure en général, et les activer occasionnellement.

Question : Comment je fais ?

Je suis au courant -Dmaven.test.skip=true mais cela désactive tous les tests unitaires.

Je sais aussi qu'il faut sauter les tests d'intégration, décrits ici . Mais je n'ai pas de tests d'intégration, seulement des tests unitaires, et je n'ai pas d'appels explicites au maven-surefire-plugin. (J'utilise Maven 2 avec le plugin Eclipse-Maven).

86voto

romaintaz Points 32120

Qu'en est-il de la possibilité de sauter des tests uniquement dans ce module ?

Dans le pom.xml de ce module :

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.4.2</version>
        <configuration>
          <skipTests>true</skipTests>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

Éventuellement, vous pouvez créer un profil qui désactivera les tests (toujours le pom.xml du module) :

<project>
  [...]
  <profiles>
    <profile>
      <id>noTest</id>
      <activation>
        <property>
          <name>noTest</name>
          <value>true</value>
        </property>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.4.2</version>
            <configuration>
              <skipTests>true</skipTests>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
  [...]
</project>

Avec cette dernière solution, si vous exécutez mvn clean package il exécutera tous les tests. Si vous exécutez mvn clean package -DnoTest=true il n'exécutera pas les tests pour ce module.

1 votes

Merci, ça a marché. Le premier extrait de code ne tient pas compte du test ; j'utiliserai peut-être plus tard votre autre suggestion pour définir un autre profil. Ma confusion venait du fait que mon pom invoquait surefire implicitement. Il n'y avait aucune mention du plugin surefire dans mon pom.xml. Néanmoins, le code pour configurer correctement le plugin surefire le faisait.

2 votes

Pour les autres, une autre option consiste à sauter le module entier jusqu'à ce que vous vouliez le construire et le vérifier : stackoverflow.com/a/5542779/543935

2 votes

Et voici comment créer un profil maven qui n'exécutera les tests que s'il est activé : stackoverflow.com/questions/34334257/

37voto

Je pense que c'est plus facile, et a également l'avantage de fonctionner pour les tests non infaillibles (dans mon cas, FlexUnitTests).

<profile>
   <id>noTest</id>
    <properties>
       <maven.test.skip>true</maven.test.skip>
    </properties>
 </profile>

0 votes

Cela ne sautera pas les tests ici, avec ou sans -DnoTest=true

4 votes

C'est parce que vous devez utiliser -PnoTest au lieu de -DnoTest=true.

1 votes

Mettre maven.test.skip à true a aussi pour effet de sauter la compilation des tests, alors que skipTests compile toujours les tests mais ne les exécute pas.

12voto

A. Di Matteo Points 6655

Si vous avez un grand projet multi-module et que vous souhaitez sauter des tests uniquement dans certains modules sans avoir à modifier chacun des modules pom.xml avec une configuration et un profilage personnalisés, vous pourriez ajouter ce qui suit au fichier parent pom.xml fichier :

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.12</version>
            <executions>
                <execution>
                    <id>regex-property</id>
                    <goals>
                        <goal>regex-property</goal>
                    </goals>
                    <configuration>
                        <name>maven.test.skip</name>
                        <value>${project.artifactId}</value>
                        <regex>(module1)|(module3)</regex>
                        <replacement>true</replacement>
                        <failIfNoMatch>false</failIfNoMatch>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
<modules>
    <module>module1</module>
    <module>module2</module>
    <module>module3</module>
</modules>

Grâce à la build-helper-maven-plugin vous vérifiez dynamiquement si vous vous trouvez dans un certain module ou non pendant la construction, par le biais de la commande project.artifactId (pointant sur chaque artifactId pendant la construction), l'expression rationnelle chercherait alors à trouver une correspondance pour certaines valeurs (les noms de modules pour lesquels vous voulez ignorer les tests) et remplirait le module maven.test.skip en conséquence (en lui donnant la valeur true ).

Dans ce cas, les tests seront ignorés pour les éléments suivants module1 et module3 tout en fonctionnant correctement pour module2 c'est-à-dire, comme exprimé par la regex.

L'avantage de cette approche est qu'elle est dynamique et centralisée (dans l'entreprise mère). pom.xml ) donc meilleur pour la maintenance : vous pouvez ajouter ou supprimer des modules à tout moment en modifiant simplement la simple expression rationnelle ci-dessus.

Évidemment, si ce n'est pas le comportement par défaut de la compilation (cas recommandé), vous pouvez toujours envelopper l'extrait ci-dessus dans une balise profil maven .


Vous pouvez également aller plus loin et avoir un comportement dynamique basé sur vos données :

<properties>
    <test.regex>none</test.regex>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.12</version>
            <executions>
                <execution>
                    <id>regex-property</id>
                    <goals>
                        <goal>regex-property</goal>
                    </goals>
                    <configuration>
                        <name>maven.test.skip</name>
                        <value>${project.artifactId}</value>
                        <regex>${test.regex}</regex>
                        <replacement>true</replacement>
                        <failIfNoMatch>false</failIfNoMatch>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Ici, nous remplaçons en fait la valeur regex par une propriété, test.regex La valeur par défaut est de none (ou tout ce qui ne correspondrait à aucun nom de module ou, également, les correspondances par défaut de saut requises).

Puis, à partir de la ligne de commande, nous pourrions avoir

mvn clean test -Dtest.regex="(module1)" > will skip tests only for module1
mvn clean test -Dtest.regex="(module1)|(module2)" > will skip tests on module1 and module2
mvn clean test -Dtest.regex="(module1)|(module2)|(module3)" > will skip the three module tests
mvn clean test -Dtest.regex=".+" > will skip all module tests
mvn clean test > would not skip anything (or fall back on default behavior)

C'est-à-dire qu'au moment de l'exécution, vous décidez, sans qu'il soit nécessaire de modifier l'architecture de l'entreprise, de mettre en place un système de gestion de la qualité. pom.xml ou l'activation d'un profil.

2voto

artBCode Points 187

Avec Surefire Plugin 2.19, vous pouvez simplement exclure les tests que vous ne voulez pas en utilisant des expressions régulières :

mvn '-Dtest=!%regex[.*excludedString.*]' test

La commande ci-dessus va exclure tous les tests qui contiennent excluString .

NB1 Si le guillemet double (") est utilisé à la place de l'apostrophe ('), la commande ne sera pas interprétée correctement et produira des résultats inattendus. (Testé avec bash 3.2.57)

NB2 Une attention particulière doit être portée aux projets dans lesquels plusieurs versions du plugin surefire sont utilisées. Les versions de surefire antérieures à 2.19 n'exécuteront aucun test car elles ne supportent pas les expressions régulières.

Gestion des versions (ce serait une bonne idée de l'ajouter dans le fichier pom parent) :

<build>
  <pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.19.1</version>
      </plugin>
    </plugins>
  </pluginManagement>
</build>

Exemples de commandes de construction qui sautent les tests : https://artbcode.wordpress.com/2016/11/28/how-to-skip-a-subset-of-the-unit-tests/

2voto

Austin Points 90

J'avais un besoin légèrement différent de cette question qui peut s'avérer utile. Je voulais exclure de la ligne de commande plusieurs tests différents provenant de différents paquets, et un seul caractère générique n'aurait pas suffi.

J'ai trouvé dans les règles de la documentation Maven Failsafe pour les exclusions que vous pouvez spécifier une liste séparée par des virgules d'exclusions regex ou wildcard : https://maven.apache.org/surefire/maven-failsafe-plugin/examples/inclusion-exclusion.html

Donc mon pomfile ressemblait à ça :

<excludes>
    <exclude>${exclude.slow.tests}</exclude>
</excludes>

et ma ligne de commande incluait ceci :

mvn install "-Dexclude.slow.tests=**/SlowTest1.java, **/package/ofslowtests/*.java, **/OtherSlowTest.java"

Pour moi, l'ingrédient clé a été de rassembler un ensemble de tests dans une propriété maven en une seule déclaration d'exclusion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X