Test d'intégration avec le plugin Maven Cargo

Un besoin très courant dans le cycle de vie d'un projet est la mise en place de tests d'intégration. Heureusement, Maven a un support intégré pour ce scénario exact, avec les phases suivantes du cycle de vie de construction par défaut (à partir de la documentation Maven):

  • test de pré-intégration : effectuez les actions requises avant l'exécution des tests d'intégration. Cela peut impliquer des choses telles que la configuration de l'environnement requis.
  • intégration-test : Traitez et déployez le package si nécessaire dans un environnement où les tests d'intégration peuvent être exécutés.
  • post-intégration-test : effectuer les actions requises après l'exécution des tests d'intégration. Cela peut inclure le nettoyage de l'environnement.

Tout d'abord, le plugin maven-surefire est configuré pour que les tests d'intégration soient exclus du cycle de vie de construction standard:

 org.apache.maven.plugins maven-surefire-plugin 2.17   **/*IntegrationTest.java   

Les exclusions sont effectuées via des expressions de chemin de style ant, donc tous les tests d'intégration doivent suivre ce modèle et se terminer par «IntegrationTest.java ».

Ensuite, le plugin cargo-maven2 est utilisé, car Cargo est livré avec une prise en charge de premier ordre pour les serveurs Web intégrés. Bien entendu, si l'environnement du serveur nécessite une configuration spécifique, cargo sait également comment construire le serveur à partir d'un package archivé ainsi que le déployer sur un serveur externe.

 org.codehaus.cargo cargo-maven2-plugin 1.4.8   jetty8x embedded    8080    

Un serveur Web Jetty 8 intégré est défini, écoutant sur le port 8080.

Dans la version plus récente du fret (1.1.0 vers le haut), la valeur par défaut de l' attente drapeau a été changé à faux, pour la cargaison: commencer . Cet objectif ne doit être utilisé que pour exécuter des tests d'intégration et est lié au cycle de vie Maven; pour le développement, l' objectif cargo: run doit être exécuté à la place - qui a wait = true .

Pour que la phase maven du package génère un fichier war déployable , le package du projet doit être: war .

Ensuite, un nouveau profil d' intégration Maven est créé pour permettre d'exécuter les tests d'intégration uniquement lorsque ce profil est actif, et non dans le cadre du cycle de vie de construction standard.

  integration   ...    

C'est ce profil qui contiendra toute la configuration restante.

Désormais, le serveur Jetty est configuré pour démarrer dans la phase de test de pré-intégration et s'arrêter dans la phase de test de post-intégration .

 org.codehaus.cargo cargo-maven2-plugin  false    start-server pre-integration-test  start    stop-server post-integration-test  stop    

Cela garantit que la cargaison: objectif de départ et la cargaison: les objectifs d' arrêt s'exécuteront avant et après la phase de test d'intégration . Notez que, comme il existe deux définitions d' exécution individuelles , l' élément id doit être présent (et différent) dans les deux, afin que Maven puisse accepter la configuration.

Ensuite, la configuration de maven-surefire-plugin doit être remplacée dans le profil d' intégration , de sorte que les tests d'intégration qui ont été exclus dans le cycle de vie par défaut soient désormais inclus et exécutés:

  org.apache.maven.plugins maven-surefire-plugin   integration-test  test    none   **/*IntegrationTest.java      

Il y a quelques points à noter:

1. Le but de test du plugin maven-surefire est exécuté en phase de test d'intégration ; à ce stade, Jetty est déjà démarré avec le projet déployé, les tests d'intégration doivent donc s'exécuter sans problème.

2. Les tests d'intégration sont maintenant inclus dans l'exécution. Pour ce faire, les exclusions sont également remplacées - c'est parce que la façon dont Maven gère les configurations de plug-in de remplacement dans les profils. La configuration de base n'est pas complètement remplacée, mais plutôt augmentée avec de nouveaux éléments de configuration à l'intérieur du profil. Pour cette raison, l'original configuration, qui excluait les tests d'intégration en premier lieu, est toujours présente dans le profil et doit être remplacée, sinon elle entrerait en conflit avec le configuration et les tests ne s'exécuteraient toujours pas.

3. Notez que, puisqu'il n'y a qu'un seul élément, il n'est pas nécessaire de définir un identifiant .

Maintenant, l'ensemble du processus peut s'exécuter:

mvn clean install -Pintegration

Conclusion

La configuration étape par étape de Maven couvre l'ensemble du processus de mise en place du processus d'intégration dans le cadre du cycle de vie du projet.

Habituellement, il est configuré pour s'exécuter dans un environnement d'intégration continue, de préférence après chaque validation. Si le serveur CI a déjà un serveur en cours d'exécution et consommant des ports, la configuration de la cargaison devra faire face à ce scénario, que je couvrirai dans un prochain article.

Pour une configuration entièrement en cours d'exécution de ce mécanisme, consultez le projet REST GitHub.

Consultez également cet article pour connaître les meilleures pratiques de structuration d'un projet et d'organisation des tests unitaires et d'intégration.