2

Je travaille sur un grand projet Maven multi-module. Chaque module a des tests unitaires rapides (en utilisant le plugin Surefire), de nombreux modules ont des tests d'intégration lents (en utilisant le plugin Failsafe). Je souhaite accélérer le retour d'erreurs de construction «simples» (erreurs de compilation et échecs de test unitaire) en exécutant des tests d'intégration de tous les modules après que tous les modules ont été construits et testés.Comment puis-je exécuter des tests d'intégration après avoir construit tous les modules dans un projet Maven multi-module?

Pouvez-vous suggérer un bon moyen d'y parvenir?

Répondre

0

Voici une solution qui fait exactement ce que je veux: utiliser le plugin Failsafe pour exécuter uniquement les tests d'intégration sans avoir à déplacer les tests hors de leur lieu naturel ou à les recompiler pour exécuter les tests.

mvn install -DskipITs 
mvn failsafe:integration-test 

Nous demandons à Maven de publier les artefacts du projet dans un répertoire local. Nous pouvons ensuite l'utiliser comme dépôt pour la deuxième étape. Dans cette deuxième étape, nous invoquons alors exactement le but dont nous avons besoin et il récupère les artefacts du référentiel local.

La même chose fonctionne pour Surefire (mvn surefire:test) si vous devez exécuter des tests unitaires séparément.

Je dois admettre que je ne comprends pas complètement le modèle Maven et donc pourquoi cela fonctionne. L'internet semble unanimement penser que ce genre de chose ne peut pas être fait (voir d'autres réponses ici), mais cela fonctionne vraiment pour moi.

+0

Cela n'exécute pas non plus de tests unitaires, n'est-ce pas? Si vous le faites de cette façon, il peut être préférable d'ignorer les tests d'intégration par défaut (configurez la configuration du plugin dans le POM parent) et de les exécuter manuellement à tout moment. –

+1

@VivekChavda Merci. J'ai corrigé les instructions pour utiliser '-DskipITs' à la place. –

0

La réponse courte est probablement de déplacer le failsafe-plugin dans un profil.

Depuis maven lui-même ne vient pas avec un default mapping for the failsafe plugin je suppose qu'il est activé dans votre parent pom ou (pire?) Le parent société pom.

La méthode consiste à créer un profil pour activer les tests d'intégration et activer uniquement ce profil en cas de besoin. Pour éviter ce gaspillage, ce profil pourrait désactiver les tests surefire pour ne pas les ré-exécuter. Si elles sont rapides de toute façon, cela pourrait ne pas être un problème. Dans ce cas, ré-exécutez-les pour le démarrage. Je pense que c'est ok pour extraire ceci dans un profil. Ma règle générale pour les profils maven est qu'ils ne sont pas autorisés à changer l'artefact résultant (ils le peuvent, mais cela devient généralement salissant). Dans ce cas, vous ajoutez une autre étape d'exécution. Donc ça ne devrait pas faire de mal. Assurez-vous que le profil est activé lors de la coupe d'une libération :)

+0

Mais dans ce cas, nous recompilerions lors de l'exécution des tests d'intégration - est-ce correct (ou, au moins, exécuter toutes les vérifications pour voir si le téléchargement de compilation et de dépendance est nécessaire)? Je vais vérifier pour voir combien de temps cela ajoute à la construction. Merci. –

+0

oui toutes les phases jusqu'à l'intégration-test seront exécutées à nouveau. donc compiler aussi (génération de code, gestion des ressources). Si cela prend du temps pour une raison quelconque, j'irais avec l'autre réponse :) (rappelez-vous que la mesure de la couverture de code pour l'informatique est un peu compliquée lorsque les tests sont ailleurs que le code lui-même) – wemu

1

l'exécution des tests d'intégration de tous les modules après tous les modules ont été construits et l'unité testée

Pour répondre à cette exigence une solution possible est de avoir un module supplémentaire (facultatif) fournissant des tests d'intégration, c'est-à-dire que tous les tests d'intégration doivent être déplacés vers ce module, ce qui pourrait être ajouté à la construction par défaut via un profil.

<profiles> 
    <profile> 
     <id>it</id> 
     <modules> 
     ... 
     <module>it-module</module> 
     </modules> 
    </profile> 
</profiles> 

Afin d'avoir comme dernière étape de la construction du Maven Reactor, ce module devrait aussi dépendre de tous les autres modules (probablement il serait déjà implicitement le cas).

Ce module serait en fait le seul à fournir la configuration et les paramètres maven-failsafe-plugin. De plus, il pourrait devenir plus significatif en cas d'utilisation d'un serveur embarqué à tester (ie Jetty): le serveur sera créé et éteint seulement pendant la construction de ce module et non dans chaque module le nécessitant, accélérant cette phase d'intégration. En tant que dernier module de la compilation, vous vous assurez qu'il ne sera atteint qu'en cas d'échec des tests unitaires sur les modules précédents et uniquement lorsque le profil it sera actif (par exemple pendant les générations CI).

+0

Je ne suis pas un grand fan de cette idée car la plupart de nos tests d'intégration sont naturellement limités à un seul module (ou un petit sous-ensemble d'entre eux), plutôt que d'être des tests de bout en bout qui exercent tous les modules. Nous pourrions, je suppose, introduire des modules parallèles - un module de test d'intégration pour chaque module existant; mais je serais réticent à ajouter autant de complexité à la construction. –