web-dev-qa-db-fra.com

Empêcher les tests unitaires mais autoriser les tests d'intégration dans Maven

J'ai une version Maven dans laquelle j'utilise le plug-in SureFire pour exécuter des tests unitaires et le plug-in FailSafe pour exécuter des tests d'intégration. Je voudrais un moyen d'exécuter uniquement les tests du plugin FailSafe.

Ce n'est pas une bonne solution pour moi d'ajouter des profils différents ou quoi que ce soit dans le pom, car c'est une version multimodule et je ne veux pas avoir à éditer le pom de chaque module.

Il y a skip.tests et maven.test.skip et skipTests qui arrêtent tous les tests et skipITs , qui arrête uniquement le plugin de sécurité.

Donc, y at-il un indicateur de ligne de commande pour Maven comme skipITs, mais avec la fonctionnalité de "onlyITs"?

130
Matthew Gilliard

J'ai trouvé le moyen le plus simple de ne passer que les tests surefire est de configurer surefire (mais pas de sécurité intrinsèque) comme suit:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.14</version>
    <configuration>
        <!-- skips surefire tests without skipping failsafe tests.
                 Property value seems to magically default to false -->
        <skipTests>${skip.surefire.tests}</skipTests>
    </configuration>
</plugin>

Cela vous permet d'exécuter mvn verify -Dskip.surefire.tests Et que les tests surefire, et non de sécurité, seront ignorés; il exécutera également toutes les autres phases nécessaires, y compris la pré-intégration et la post-intégration, et lancera également l'objectif verify qui est requis pour réellement échouez avec votre maven build si vos tests d'intégration échouent .

Notez que ceci redéfinit la propriété utilisée pour spécifier que les tests doivent être ignorés. Ainsi, si vous fournissez le canonique -DskipTests=true, Surefire l'ignorera mais que le contrôle de sécurité le respectera, ce qui peut être inattendu, en particulier si vous avez des versions existantes/les utilisateurs spécifiant déjà ce drapeau. Une solution de contournement simple semble être de faire passer par défaut skip.surefire.tests À la valeur de skipTests dans votre section <properties> Du pom:

<properties>
    <skip.surefire.tests>${skipTests}</skip.surefire.tests>
</properties>

Si vous en avez besoin, vous pouvez fournir un paramètre analogue appelé skip.failsafe.tests Pour la sécurité intégrée, mais je ne l'ai pas trouvé nécessaire - car les tests unitaires s'exécutent généralement dans une phase antérieure, et si je veux exécuter des tests unitaires mais pas Pour les tests d'intégration, je lancerais la phase test à la place de la phase verify. Vos expériences peuvent varier!

Ces propriétés skip.(surefire|failsafe).tests devraient probablement être intégrées au code surefire/failafe lui-même, mais je ne sais pas dans quelle mesure cela violerait l'ethos "elles sont exactement le même plugin, à l'exception d'une différence minuscule".

146
bacar

Une solution de contournement serait d'appeler:

mvn clean test-compile failsafe:integration-test

Certes, c'est moche, mais cela peut résoudre votre problème.


Ou (un autre hack):

mvn clean integration-test -Dtest=SomePatternThatDoesntMatchAnything -DfailIfNoTests=false

Référence:

108
Sean Patrick Floyd

J'utilise le code de Antonio Goncalves Blog , qui fonctionne parfaitement.

Vous pouvez utiliser les propriétés suivantes:

-DskipUTs=true pour ignorer les tests infaillibles.

-DskipITs=true pour ignorer les tests de sécurité.

-DskipTests=true pour ignorer tous les tests.

Le pom.xml est comme suit:

<properties>
    <skipTests>false</skipTests>
    <skipITs>${skipTests}</skipITs>
    <skipUTs>${skipTests}</skipUTs>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <skipTests>${skipUTs}</skipTests>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.19.1</version>
            <executions>
                <execution>
                    <id>run-integration-tests</id>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <skipTests>${skipTests}</skipTests>
                <skipITs>${skipITs}</skipITs>
            </configuration>
        </plugin>
    </plugins>
</build>
54
Martijn Burger

J'espère que cela t'aides!

Essayez d’exécuter le test uniquement avec FailSafe (plugin pour integration-test - il ne vous permettra d’exécuter que des tests d’intégration portant ce nom, par défaut: * / IT. Java, **/IT.Java, */* ITCase.Java;, mais vous pouvez facilement changer cela à partir d'un fichier pom)

mvn failsafe:integration-test

Et lorsque vous souhaitez utiliser uniquement SureFire (plug-in pour le test unitaire)

mvn surefire:test

ou un test à la fois avec:

mvn -Dtest=MyUnitlTest
19
Kati Holasz

Je fais comme ça alors toutes les phases sont normalement exécutées:

 mvn -Dtest=foo -DfailIfNoTests=false verify
7
Jérôme Herry