J'ai un projet multi-module maven et j'utilise jacoco-maven pour les rapports de couverture de code. Certaines classes ne doivent pas être signalées, car elles sont de configuration Spring et ne les intéressent pas.
J'ai déclaré le plugin maven-jacoco comme suit:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.2.201409121644</version>
<configuration>
<outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
<exclude>some.package.*</exclude>
<exclude>**/*Config.*</exclude>
<exclude>**/*Dev.*</exclude>
<exclude>some/package/SomeClass.Java</exclude>
</configuration>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>post-unit-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
Le problème est que lorsque j'exécute mvn clean verify
, jacoco signale toujours des classes qui auraient dû être exclues comme le souligne ma configuration xml. Comment puis-je le configurer correctement?
Votre code XML est légèrement faux, vous devez ajouter les exclusions de classe dans un champ parent exclues. La configuration ci-dessus doit donc ressembler à la suivante selon la documentation de Jacoco
<configuration>
<excludes>
<exclude>**/*Config.*</exclude>
<exclude>**/*Dev.*</exclude>
</excludes>
</configuration>
Les valeurs des champs d'exclusion doivent être les chemins de classe (pas les noms de paquet) des classes compilées par rapport au répertoire target/classes/en utilisant la syntaxe standard avec un caractère générique.
* Match zero or more characters
** Match zero or more directories
? Match a single character
Vous pouvez également exclure un package et tous ses enfants/sous-packages de cette manière:
<exclude>some/package/**/*</exclude>
Cela exclura toutes les classes de some.package
, ainsi que tous les enfants. Par exemple, some.package.child
ne serait pas inclus dans les rapports non plus.
J'ai testé et mon objectif de rapport indique un nombre réduit de classes utilisant ce qui précède.
Si vous envoyez ensuite ce rapport dans Sonar, vous devrez alors demander à Sonar d’exclure ces classes de l’affichage, ce qui peut être fait dans les paramètres de Sonar.
Paramètres> Paramètres généraux> Exclusions> Couverture de code
Sonar Docs explique un peu plus
Exécuter votre commande ci-dessus
mvn clean verify
Montrera que les cours ont été exclus
Pas d'exclusions
[INFO] --- jacoco-maven-plugin:0.7.4.201502262128:report (post-test) @ ** ---
[INFO] Analyzed bundle '**' with 37 classes
Avec exclusions
[INFO] --- jacoco-maven-plugin:0.7.4.201502262128:report (post-test) @ ** ---
[INFO] Analyzed bundle '**' with 34 classes
J'espère que cela t'aides
Bien qu'Andrew ait déjà répondu à la question avec des détails, je donne au code comment l'exclure dans pom
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.9</version>
<configuration>
<excludes>
<exclude>**/*com/test/vaquar/khan/HealthChecker.class</exclude>
</excludes>
</configuration>
<executions>
<!-- prepare agent for measuring integration tests -->
<execution>
<id>jacoco-initialize</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-site</id>
<phase>package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
https://github.com/jacoco/jacoco/issues/34
Ce sont les différentes notations pour les classes que nous avons:
Paramètres de l'agent, tâches Ant et objectif Maven prepare-agent
Ces spécifications autorisent les caractères génériques * et?, Où * génèrent un nombre quelconque de caractères, même plusieurs dossiers imbriqués.
Objectif du rapport Maven
Ces spécifications autorisent Ant Filespec comme les caractères génériques *, ** et?, Où * les éléments génériques d’un seul élément de chemin.
Une autre solution:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.5.201505241946</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>default-report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>default-check</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<rule implementation="org.jacoco.maven.RuleConfiguration">
<excludes>
<exclude>com.mypackage1</exclude
<exclude>com.mypackage2</exclude>
</excludes>
<element>PACKAGE</element>
<limits>
<limit implementation="org.jacoco.report.check.Limit">
<counter>COMPLEXITY</counter>
<value>COVEREDRATIO</value>
<minimum>0.85</minimum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
</executions>
</plugin>
Veuillez noter que nous utilisons "<element>PACKAGE</element>"
dans la configuration, ce qui nous aide ensuite à exclure au niveau du paquet.
Utilisez la propriété sonar.coverage.exclusions.
mvn clean install -Dsonar.coverage.exclusions=**/*ToBeExcluded.Java
Cela devrait exclure les classes du calcul de la couverture.
vous pouvez configurer l'exclusion de couverture dans les propriétés du sonar, en dehors de la configuration du plugin jacoco:
...
<properties>
....
<sonar.exclusions>
**/generated/**/*,
**/model/**/*
</sonar.exclusions>
<sonar.test.exclusions>
src/test/**/*
</sonar.test.exclusions>
....
<sonar.Java.coveragePlugin>jacoco</sonar.Java.coveragePlugin>
<sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
<sonar.coverage.exclusions>
**/generated/**/*,
**/model/**/*
</sonar.coverage.exclusions>
<jacoco.version>0.7.5.201505241946</jacoco.version>
....
</properties>
....
et n'oubliez pas de supprimer les paramètres d'exclusion du plugin
Voici l'exemple de travail dans le fichier pom.xml
.
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco.version}</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>post-unit-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>default-check</id>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
<configuration>
<dataFile>target/jacoco.exec</dataFile>
<!-- Sets the output directory for the code coverage report. -->
<outputDirectory>target/jacoco-ut</outputDirectory>
<rules>
<rule implementation="org.jacoco.maven.RuleConfiguration">
<element>PACKAGE</element>
<limits>
<limit implementation="org.jacoco.report.check.Limit">
<counter>COMPLEXITY</counter>
<value>COVEREDRATIO</value>
<minimum>0.00</minimum>
</limit>
</limits>
</rule>
</rules>
<excludes>
<exclude>com/pfj/fleet/dao/model/**/*</exclude>
</excludes>
<systemPropertyVariables>
<jacoco-agent.destfile>target/jacoco.exec</jacoco-agent.destfile>
</systemPropertyVariables>
</configuration>
</plugin>