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

157

J'ai une version Maven dans laquelle j'utilise le plugin SureFire pour exécuter des tests unitaires et le plugin 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 différents profils ou quoi que ce soit dans le pom, car c'est une construction multimodule et je ne veux pas avoir à modifier le pom de chaque module.

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

Alors, y a-t-il un indicateur de ligne de commande pour Maven comme skipITs, mais à la place avec la fonctionnalité de "onlyITs"?

Matthew Gilliard
la source
Avez-vous essayé maven.test.skipou skipTests?
Thomas
1
@khmarbaise en théorie, oui. Mais dans la plupart des projets dans lesquels j'ai travaillé, les "tests unitaires" où en fait des tests d'intégration avec une base de données en mémoire (si vous avez eu de la chance)
Sean Patrick Floyd
9
@khmarbaise Beaucoup de tests unitaires. Ils prennent quelques minutes à fonctionner et nous n'en avons pas besoin pour fonctionner dans ces circonstances. Plus précisément, nous exécutons des tests unitaires avant de créer l'artefact (bien sûr), mais nous voulons exécuter les TI dans plusieurs environnements. Aucun point de réexécution des tests unitaires à ce stade.
Matthew Gilliard
2
Salut @khmarbaise, dans ma configuration skipTestsne saute que les tests infaillibles, pas le test de sécurité! C'est peut-être une nouvelle fonctionnalité?
danidemi
2
Pour info: skipTests est désormais obsolète dans Failsafe Plugin 3.0.0-M3 ( SUREFIRE-1611 )
Guillaume Husta

Réponses:

171

J'ai trouvé que le moyen le plus simple de ne sauter que les tests infaillibles est de configurer surefire ( mais pas à sécurité intégrée ) 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.testset seuls les tests infaillibles, et non infaillibles, 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 exécutera également l' verifyobjectif qui est nécessaire pour échouer réellement votre build maven si vos tests d'intégration échouent.

Notez que cela redéfinit la propriété utilisée pour spécifier que les tests doivent être ignorés, donc si vous fournissez le canonical -DskipTests=true, surefire l'ignorera mais la sécurité la respectera, ce qui peut être inattendu, surtout si vous avez déjà des builds / utilisateurs spécifiant cet indicateur. Une solution de contournement simple semble être de choisir par défaut skip.surefire.testsla valeur de skipTestsdans votre <properties>section 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à 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 des tests d'intégration, je l'exécuterais la testphase au lieu de la verifyphase. Vos expériences peuvent varier!

Ces skip.(surefire|failsafe).testspropriétés devraient probablement être intégrées dans le code sûr / sécurisé lui-même, mais je ne suis pas sûr de savoir à quel point cela violerait l'éthos «ils sont exactement le même plugin, sauf pour une petite différence».

bacar
la source
4
En utilisant cette solution, j'ai pu configurer mon framework afin que -DskipUnitTests ignore le plugin infaillible, -DskipIntegrationTests ignore le plugin de sécurité et DskipTests saute les deux. Exactement ce qu'il fallait!
Alex Jansen
2
mon IDE se plaint du "impossible de résoudre le symbole" skipTests "" la solution était d'ajouter une ligne <skipTests>false</skipTests>qui fonctionne toujours avec n'importe quelle combinaison de -DskipTests ou -Dskip.surefire.tests car les arguments de ligne de commande semblent écraser les propriétés stackoverflow.com/questions/13708738 /… Vous voudrez peut-être ajouter cela à votre solution
globalworming
<skipTests>${skip.surefire.tests}</skipTests>ne fonctionne pas avec la maven-surefire-pluginversion 3.0.0-M3. Tous les tests infaillibles sont toujours en cours. Quelqu'un d'autre a trouvé ça? La solution ci-dessous de Sean Patrick Floyd fonctionne cependant.
John Meyer le
120

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:

Sean Patrick Floyd
la source
1
La deuxième suggestion a fonctionné pour moi. Le test de pré-intégration a été appelé avec succès
Lawrence Tierney
7
Est-ce une bonne idée? Cela n'entraînera-t-il pas le succès de votre build même si vos tests d'intégration échouent? C'est l'essence même de la sécurité intégrée, si vous n'exécutez pas également l'objectif «vérifier» . Quote: "Le plugin Failsafe n'échouera pas la construction pendant la phase de test d'intégration". Vous devez exécuter l'objectif de vérification pour vous dire si les tests d'intégration ont réussi ou non!
bacar le
2
@bacar a raison, mais utilisez simplement à la verifyplace de integration-testdans la 2ème solution.
Matthew Gilliard
1
Vous devriez en fait voir la réponse @bacar pour une bien meilleure solution.
FBB
12
Si vous ajoutez failsafe:verifyà la fin du premier hack ( mvn clean test-compile failsafe:integration-test failsafe:verify), la compilation échouera si l'un des tests d'intégration échoue.
Shadow Man
73

J'utilise le code du blog Antonio Goncalves , qui fonctionne parfaitement.

Vous pouvez utiliser les propriétés suivantes:

-DskipUTs=true pour sauter des tests infaillibles.

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

-DskipTests=true pour sauter tous les tests.

Le pom.xmlest 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>
Martijn Burger
la source
2
merci, bonne approche! il est également utile de remplacer l'exécution par défaut de surefire (test par défaut) voir: stackoverflow.com/questions/11935181/...
pls
1
c'est la raison pour laquelle parfois vous devez faire défiler vers le bas et rechercher une solution de travail agréable avec toutes les informations requises. Merci pour le partage
Atul Chaudhary
Vraiment une belle solution. Cependant, la configuration de sécurité intégrée est redondante, tout comme la configuration skipITspar défaut.
timomeinen
SkipITs est une option personnalisée dans cette configuration. Vous avez droit à l'implémentation par défaut, mais ce n'était pas la question des OP.
Martijn Burger
Félicitations, vous êtes un gourou maven! Cela devrait être dans le superpom maven.
Adam
22

J'espère que cela t'aides!

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

mvn failsafe:integration-test

Et lorsque vous souhaitez utiliser uniquement SureFire (plugin pour les tests unitaires)

mvn surefire:test

ou un test à la fois avec:

mvn -Dtest=MyUnitlTest
Kati Holasz
la source
9

J'aime ça, donc toutes les phases sont normalement exécutées:

 mvn -Dtest=foo -DfailIfNoTests=false verify
Jérôme Herry
la source
1
C'est la solution la plus simple (et honnêtement la plus brillante)!
Titulum le
ne nécessite rien d'ajouter dans le pom comme l'OP l'a demandé et exécute toutes les phases comme indiqué. très bonne réponse.
jnichols959
1

Pour développer les commentaires de @danidemi et @GuillaumeHusta:

Pour info: skipTests est désormais obsolète dans Failsafe Plugin 3.0.0-M3 ( SUREFIRE-1611 )

Donc, pour sauter les tests unitaires, mais pas les tests d'intégration, vous pouvez le faire si vous utilisez la dernière version du plugin Failsafe:

mvn verify -DskipTests

(veuillez donner aux commentaires mentionnés un vote positif si cela vous aide)

meustrus
la source
-3

Essayez d'exécuter votre intégration ou vos tests unitaires dans un profil distinct. Ensuite, vous pouvez simplement activer / désactiver le profil.

Steven
la source
Peut-être ajouter un pom parent dans lequel vous définissez un profil qui n'exécute que des TI? tous les sous-modules du projet peuvent hériter de cette forme pom, vous n'avez donc pas besoin de changer chaque pom ou d'exécuter des modules avec des commutateurs spéciaux (car vous pouvez activer le profil en cas d'absence de propriété).
yoosiba le