
Etape 3 : Test - Exécuter les tests unitaires (exemple conceptuel, ex: `mvn test` ou `npm test`)
Explorez l'étape de test dans Jenkins. Apprenez à exécuter vos tests unitaires avec des exemples comme `mvn test` ou `npm test` pour assurer la qualité du code.
La validation de la qualité : l'importance cruciale de l'étape de test
Après avoir récupéré le code source (Checkout) et l'avoir transformé en un produit potentiellement livrable (Build), l'étape suivante et non moins critique d'un pipeline CI est l'étape de Test. C'est le moment où la qualité et la conformité du code construit sont activement vérifiées. Dans un contexte d'intégration continue, l'accent est souvent mis, au minimum, sur l'exécution des tests unitaires. Ces tests, écrits par les développeurs, valident les plus petites portions de code (fonctions, méthodes, classes) de manière isolée pour s'assurer qu'elles se comportent comme attendu.
L'intégration des tests automatisés dans le pipeline est un pilier fondamental de la philosophie DevOps et de l'intégration continue. Elle offre une boucle de rétroaction rapide aux développeurs : si une modification introduit une régression ou un bug détecté par les tests, le pipeline échoue, signalant immédiatement le problème. Cela permet de corriger les erreurs au plus tôt, lorsque le contexte du changement est encore frais dans l'esprit du développeur, réduisant ainsi considérablement le coût de la correction et améliorant la qualité globale du logiciel.
Un pipeline qui n'inclut pas une phase de test automatisé robuste ne remplit qu'une partie de sa mission. Sans cette validation, on ne fait qu'automatiser la construction d'un produit potentiellement défectueux. L'étape de test est donc un garde-fou essentiel, garantissant que seules les versions du code qui passent un certain niveau de contrôle qualité peuvent progresser vers les étapes ultérieures, comme le déploiement ou la publication d'artefacts.
Exécuter les tests unitaires : exemples avec Maven et npm
Comme pour l'étape de build, l'exécution des tests dans Jenkins est généralement réalisée en invoquant les commandes spécifiques à l'outil de construction ou au framework de test utilisé par le projet. L'agent Jenkins qui exécute cette étape doit, bien entendu, avoir accès à ces outils et à l'environnement nécessaire pour leur exécution (par exemple, une base de données de test si les tests d'intégration sont également inclus).
Pour un projet Java géré avec Maven, la commande standard pour exécuter les tests unitaires (par exemple, ceux écrits avec JUnit ou TestNG) est mvn test. Maven s'occupera de compiler les tests, de les exécuter, et de générer des rapports. Voici un exemple d'intégration dans un Jenkinsfile :
pipeline {
agent any // L'agent doit avoir Maven et JDK.
stages {
stage('Checkout') {
steps {
git url: 'https://votre-depot.git/votre-projet-java.git', branch: 'main'
}
}
stage('Build') {
steps {
sh 'mvn clean package'
}
}
stage('Test') {
steps {
echo 'Exécution des tests unitaires avec Maven...'
sh 'mvn test'
}
}
// Autres étapes potentielles (ex: Analyse de code, Déploiement)
}
post {
always {
// Publier les résultats des tests, même si le build échoue après
junit 'target/surefire-reports/*.xml'
}
}
}Notez l'utilisation de la directive post et du step junit. Jenkins peut lire les rapports de tests générés par Maven (au format XML) et afficher une vue agrégée des résultats, des tendances, et faciliter la navigation vers les tests échoués. C'est une fonctionnalité extrêmement utile pour le suivi de la qualité.
Pour un projet Node.js, la commande pour exécuter les tests dépend du framework de test utilisé (Jest, Mocha, Jasmine, etc.) et de la configuration dans le fichier package.json. Typiquement, un script nommé test est défini dans la section scripts du package.json. La commande est alors simplement npm test. Voici un exemple :
pipeline {
agent any // L'agent doit avoir Node.js et npm.
stages {
stage('Checkout') {
steps {
git url: 'https://votre-depot.git/votre-projet-node.git', branch: 'main'
}
}
stage('Build') {
steps {
sh 'npm install'
// sh 'npm run build' // Si applicable
}
}
stage('Test') {
steps {
echo 'Exécution des tests avec npm...'
sh 'npm test'
}
}
}
post {
always {
// Exemple pour Jest, qui peut générer des rapports JUnit XML
// Pour cela, Jest doit être configuré avec un reporter JUnit.
// Exemple : jest --reporters=default --reporters=jest-junit
// Et package.json : "test": "jest --reporters=default --reporters=jest-junit"
junit 'junit.xml' // Le nom du fichier peut varier selon la configuration du reporter
}
}
}Comme pour Maven, de nombreux frameworks de test JavaScript peuvent générer des rapports au format JUnit XML, permettant à Jenkins de les interpréter et de les afficher graphiquement. La configuration exacte pour la génération de ces rapports dépendra du framework de test spécifique (Jest, Mocha avec un reporter approprié, etc.).
Au-delà des tests unitaires : couverture et qualité du code
L'étape de test ne se limite pas toujours aux seuls tests unitaires. Elle peut également inclure la génération de rapports de couverture de code (code coverage). Ces rapports indiquent quelle proportion du code source est effectivement exercée par les tests. Des outils comme JaCoCo pour Java ou Istanbul/nyc pour JavaScript peuvent être intégrés dans le processus de test pour mesurer cette couverture. Jenkins, via des plugins spécifiques (par exemple, le plugin "Code Coverage API"), peut ensuite afficher ces métriques, aidant les équipes à identifier les zones du code moins testées.
Il est crucial que l'échec d'un test unitaire entraîne l'échec du build Jenkins. C'est le comportement par défaut de la plupart des outils de build et de test : une commande comme mvn test ou npm test retournera un code de sortie non nul si des tests échouent, ce que Jenkins interprète comme un échec de l'étape sh. Cela stoppe le pipeline (sauf configuration contraire), empêchant la propagation d'un code défectueux.
En résumé, l'étape de Test est un investissement indispensable pour la robustesse de votre application. Automatiser l'exécution des tests unitaires via Jenkins vous assure que chaque modification est validée rapidement et de manière cohérente, constituant une base solide pour des pratiques de développement agiles et de haute qualité.