web-dev-qa-db-fra.com

Sonar ne montre pas la couverture de code après la construction réussie avec le plugin Jenkins Sonar

J'essaie d'obtenir une couverture de code avec Sonar et Jenkins. Je vois que le plug-in Sonar de Jenkins exécute avec succès les cas de test JUnit et termine la construction avec succès. Mais Sonar ne montre pas les résultats de couverture de code (indique toujours 0,0% comme couverture de code) sur le projet. Mais Sonar montre "le succès des tests unitaires".

J'utilise Maven avec Jenkins et Sonar.

Je reçois le message ci-dessous dans les journaux Jenkins lors de l'exécution du plug-in Sonar:

 La couverture du projet est définie sur 0% car aucune donnée d'exécution JaCoCo n'a été vidée: .../sonar/target/jacoco.exec 

Quelqu'un peut-il m'aider à obtenir une couverture de code correcte pour tout projet Sonar?.

13
Venkat

J'ai lu https://docs.sonarqube.org/display/PLUG/Code+Coverage+by+Unit+Tests+for+Java+Project et utilisé cobertura comme plugin de couverture de code, puis je vois les affichages de couverture de code pour petits projets. Lorsque je recherche un gros projet dans sonar, je vois juste la couverture de code - cela veut dire qu’elle est vide. Dans les journaux, le rapport Cobertura n’a pas été trouvé dans le chemin /.../coverage.xml. 

coverage.xml n'a pas été généré en raison de OutOfMemeryError: heapspace. Étant donné que mon projet est un si gros projet, lorsque je règle la mémoire de tas à 2 Go et la mémoire du plug-in cobertura à 1,5 Go, le sonar affiche la couverture de code.

3
Venkat

Ce n'est pas parce que Sonar a correctement invoqué Surefire (et que vous avez reçu le message "Test d'unité") que JaCoCo a instrumenté votre code.

Essayez d’exécuter JaCoCo directement. Vous pourriez découvrir pourquoi JaCoCo échoue directement:

mvn jacoco:prepare-agent test jacoco:report

JaCoCo placera jacoco.exec ainsi que ses rapports XML/HTML dans target/jacoco . Ou cela échouera, et j'espère que vous aurez une meilleure idée de pourquoi.

Un problème très courant est que le javaagent JaCoCo ne s'exécutera pas si vous avez modifié l'argLine Surefire, car jacoco:prepare-agent définit simplement la propriété argLine qui, dans ce scénario, est simplement ignorée. Vous pouvez définir la propriété propertyName de prepare-agent sur quelque chose d'autre (comme jacocoArgLine ) et inclure que dans votre configuration d'argLine:

<argLine>-Xmx1024m ${jacocoArgLine}</argLine>

9
user847316

Selon cette blog post , vous avez probablement oublié de définir la propriété sonar.binaries dans les propriétés de votre projet

N'oubliez pas sonar.binaries, sinon, vous obtiendrez peut-être quelque chose comme «La couverture du projet est définie sur 0% car il n'y a pas de répertoires avec des classes. »Dans vos journaux.

[...]
sonar.surefire.reportsPath=target/surefire-reports
sonar.jacoco.reportPath=target/jacoco.exec
sonar.binaries=target/classes
[...]
0
Jocker

Au lieu d'utiliser le plugin sonar Jenkins pour exécuter sonar, essayez de le faire avec maven en exécutant l'objectif du sonar. C’est généralement plus facile que de configurer une étape de construction supplémentaire et de modifier tous les chemins jusqu’à ce que le sonar trouve tous les fichiers pertinents.

Dans votre cas, je suppose qu’il peut lire le rapport junit/testng, mais ne trouve pas les résultats jacoco (jacoco.exec). Les sorties du sondeur de chemin (../sonar/target/jacoco.exec) sont-elles correctes?

0
ssindelar

Votre plug-in Sonar ne trouve pas le fichier de rapport généré par Jacoco. 

Dans votre pom (parent ou enfant), recherchez la balise <destFile> sous l'exécution de jacoco/prepare-agent. Changez le nom et l'emplacement en target/jacoco.exec et vous êtes prêt à partir!

0
Tharindu Bandara