Tests de saut dans certains modules de 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 je voudrais généralement les exclure; et parfois les allumer.

Question : Comment faire?

je sais pour -Dmaven.test.skip=true , mais ça éteint tous les tests unitaires.

je sais aussi sauter des tests d'intégration, décrit ici . Mais je n'ai pas avoir des tests d'intégration, juste des tests unitaires, et je n'ai pas d'appels explicites pour le maven-surefire-plugin. (J'utilise Maven 2 avec le plugin Eclipse-Maven).

58
demandé sur A_Di-Matteo 2009-04-21 18:02:43

5 réponses

pourquoi ne sauter les tests que 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 lancez mvn clean package , il effectuera tous les tests. Si vous lancez mvn clean package -DnoTest=true , il n'exécutera pas les tests pour ce module.

67
répondu romaintaz 2017-09-28 08:26:46

je pense que c'est plus facile, et a également l'avantage de travailler pour des tests non-surefire (dans mon cas, FlexUnitTests)

<profile>
   <id>noTest</id>
    <properties>
       <maven.test.skip>true</maven.test.skip>
    </properties>
 </profile>
29
répondu Luiz Henrique Martins Lins Rol 2017-04-26 10:49:23

si vous avez un grand projet multi-modules et que vous souhaitez sauter les tests uniquement dans certains modules sans avoir à changer chacun des modules pom.xml fichier avec configuration et profilage personnalisés, vous pouvez ajouter ce qui suit Au Fichier parent pom.xml :

<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 êtes dans un certain module ou non pendant la construction, via la propriété project.artifactId (pointant vers chaque module artifactId pendant la construction), le regex chercherait alors la correspondance pour certaines valeurs (les noms de modules pour lesquels vous voulez sauter les tests) et remplirait la propriété maven.test.skip en conséquence (la mettant à true ).

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

L'avantage de cette approche est celle de l'dynamique et centralisé (dans le parent pom.xml ) donc mieux pour la maintenance: vous pourriez ajouter ou supprimer des modules à tout moment simplement en changeant le regex simple ci-dessus.

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


vous pouvez aussi aller plus loin et avoir un comportement dynamique basé sur votre entrée:

<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 sommes en train de remplacer la valeur regex par une propriété, test.regex , avec une valeur par défaut à none (ou quoi que ce soit qui ne correspondrait à aucun nom de module ou, aussi, les correspondances par défaut requises).

puis de la ligne de commande nous aurions pu

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'à l'exécution vous décidez, sans avoir besoin de changer le fichier pom.xml ou d'activer un profil.

2
répondu A_Di-Matteo 2016-09-19 07:58:50

j'avais un besoin légèrement différent de cette question qui pourrait s'avérer utile. Je voulais exclure de la ligne de commande quelques tests différents de différents paquets, donc un seul Joker ne le ferait pas.

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

ainsi, ma pomme ressemblait à ceci:

<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, le principal ingrédient était d'obtenir un tas de tests dans une propriété maven dans une seule déclaration d'exclusion.

2
répondu Austin 2016-12-08 22:48:56

en utilisant 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 exclura tous les tests qui contiennent excludedString .

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

NB2 une attention particulière doit être accordée aux projets dans lesquels la version multiple du plugin surefire est utilisée. Les Versions de surefire plus anciennes que 2.19 n'exécuteront aucun test car elles ne supportent pas les expressions régulières.

gestion de Version (il pourrait être une bonne idée d'ajouter ceci 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 /

2
répondu artBCode 2018-06-14 10:28:11