FAQ
Les questions qui me viennent à l'esprit depuis cette époque sont devenues folles avec jacoco.
Mon serveur d'application (jBoss, Glassfish..) est situé en Irak, en Syrie, etc. Est-il possible d'obtenir une couverture multi-modules en exécutant des tests d'intégration sur ce serveur ? Jenkins et Sonar sont également sur des serveurs différents.
Oui, vous devez utiliser agent jacoco qui fonctionne en mode output=tcpserver
, jacoco ant lib. En gros, deux jar
s. Vous obtiendrez ainsi un taux de réussite de 99 %.
Comment fonctionne l'agent jacoco ?
Vous ajoutez une chaîne de caractères
-javaagent:[your_path]/jacocoagent.jar=destfile=/jacoco.exec,output=tcpserver,address=*
à votre serveur d'application JAVA_OPTS et redémarrez-le. Dans cette chaîne, seul [your_path]
doit être remplacé par le chemin vers jacocoagent.jar, stocké (stockez-le !) sur votre VM où tourne le serveur d'application. A partir du moment où vous démarrez le serveur d'application, toutes les applications déployées seront surveillées dynamiquement et leur activité (c'est à dire l'utilisation du code) sera prête à être récupérée au format jacocos .exec par une requête tcl.
Puis-je réinitialiser l'agent jacoco pour qu'il ne collecte les données d'exécution qu'à partir du moment où mon test a commencé ?
Oui, pour cela vous avez besoin de jacocoant.jar et ant build script situés dans votre espace de travail jenkins.
En fait, ce dont j'ai besoin à http://www.eclemma.org/jacoco/, c'est de jacocoant.jar situé dans mon workspace jenkins, et de jacocoagent.jar situé sur mon serveur d'applications VM ?
C'est exact.
Je ne veux pas utiliser ant, j'ai entendu dire que le plugin jacoco maven peut faire tout cela aussi.
Ce n'est pas exact, le plugin jacoco maven peut collecter les données des tests unitaires et certaines données des tests d'intégration (voir Arquillian Jacoco ), mais si vous avez par exemple des tests assurés par rest comme un build séparé dans jenkins, et que vous voulez montrer la couverture multi-module, je ne vois pas comment le plugin maven peut vous aider.
Que produit exactement l'agent jacoco ?
Seules les données de couverture en .exec
format. Sonar peut alors le lire.
Est-ce que jacoco a besoin de savoir où se trouvent mes classes java ?
Non, le sonar le fait, mais pas le jacoco. Lorsque vous faites mvn sonar:sonar
Le chemin vers les classes entre en jeu.
Qu'en est-il de la fourmi script ?
Il doit être présenté dans votre espace de travail jenkins. Le mien est script, je l'ai appelé jacoco.xml
ressemble à cela :
<project name="Jacoco library to collect code coverage remotely" xmlns:jacoco="antlib:org.jacoco.ant">
<property name="jacoco.port" value="6300"/>
<property name="jacocoReportFile" location="${workspace}/it-jacoco.exec"/>
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath path="${workspace}/tools/jacoco/jacocoant.jar"/>
</taskdef>
<target name="jacocoReport">
<jacoco:dump address="${jacoco.host}" port="${jacoco.port}" dump="true" reset="true" destfile="${jacocoReportFile}" append="false"/>
</target>
<target name="jacocoReset">
<jacoco:dump address="${jacoco.host}" port="${jacoco.port}" reset="true" destfile="${jacocoReportFile}" append="false"/>
<delete file="${jacocoReportFile}"/>
</target>
</project>
Deux paramètres obligatoires que vous devez passer lorsque vous invoquez ce script. -Dworkspace=$WORKSPACE
utilisez-le pour pointer vers votre espace de travail jenkins et -Djacoco.host=yourappserver.com
hôte sans http://
Remarquez également que j'ai mis mon jacocoant.jar
vers ${workspace}/tools/jacoco/jacocoant.jar
Que dois-je faire ensuite ?
Avez-vous démarré votre serveur d'application avec jacocoagent.jar ?
Avez-vous mis ant script et jacocoant.jar dans votre workspace jenkins ?
Si oui, la dernière étape est de configurer un build jenkins. Voici la stratégie :
- Invoquer la cible de la fourmi
jacocoReset
pour réinitialiser toutes les données collectées précédemment.
- Exécutez vos tests
- Invoquer la cible de la fourmi
jacocoReport
pour obtenir un rapport
Si tout va bien, vous verrez it-jacoco.exec
dans votre espace de travail.
Regardez la capture d'écran, j'ai aussi ant
installé dans mon espace de travail en $WORKSPACE/tools/ant
mais vous pouvez en utiliser un qui est installé dans votre Jenkins.
Comment pousser ce rapport dans le sonar ?
Maven sonar:sonar
fera le travail (n'oubliez pas de le configurer), pointez-le vers le pom.xml principal pour qu'il s'exécute à travers tous les modules. Utiliser sonar.jacoco.itReportPath=$WORKSPACE/it-jacoco.exec
pour indiquer au sonar où se trouve votre rapport de test d'intégration. Chaque fois qu'il analysera de nouvelles classes de modules, il recherchera des informations sur la couverture dans le fichier it-jacoco.exec
.
J'ai déjà jacoco.exec dans mon répertoire `target`, `mvn sonar:sonar` l'ignore/le supprime.
Par défaut mvn sonar:sonar
fait clean
et supprime votre répertoire cible, utilisez sonar.dynamicAnalysis=reuseReports
pour l'éviter.