Configuration Maven Jacoco - Exclure les classes / packages du rapport ne fonctionne pas

103

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 une configuration Spring et elles ne m'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 mvn clean verifyj'exécute, jacoco signale toujours des classes qui auraient dû être exclues comme le souligne ma configuration xml. Comment puis-je le configurer correctement?

resilva87
la source

Réponses:

181

Votre XML est légèrement erroné, vous devez ajouter des exclusions de classe dans un champ parent d'exclusion, donc votre configuration ci-dessus devrait ressembler à ce qui suit, selon les documents Jacoco

<configuration>
    <excludes>
        <exclude>**/*Config.*</exclude>
        <exclude>**/*Dev.*</exclude>
    </excludes>
</configuration>

Les valeurs des champs d'exclusion doivent être des chemins de classe (pas des noms de package) des classes compilées par rapport au répertoire target / classes / en utilisant la syntaxe générique standard

*   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.childne serait pas non plus inclus dans les rapports.

J'ai testé et mon objectif de rapport rapporte un nombre réduit de classes en utilisant ce qui précède.

Si vous poussez ensuite ce rapport dans Sonar, vous devrez alors dire à Sonar d'exclure ces classes de l'affichage, ce qui peut être fait dans les paramètres Sonar.

Paramètres> Paramètres généraux> Exclusions> Couverture du code

Sonar Docs l' explique un peu plus

Exécuter votre commande ci-dessus

mvn clean verify

Montrera que les classes ont été exclues

Aucune exclusion

[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

Andrew Kew
la source
2
J'ai dû mettre à jour le plugin Jacoco de la version 0.7.5 à 0.7.6 pour que l'exclusion soit prise en compte.
Stéphane
2
Bonne astuce concernant Sonar. Il est facile de supposer que les exclusions JaCoCo se propageront automatiquement à Sonar (comme je l'ai fait).
markdsievers
10
Si j'exclus un formulaire de fichier jacoco, il apparaît dans le rapport de couverture avec une couverture de 0%. Donc, fondamentalement, j'obtiens de pires résultats par rapport à aucune exclusion. Cela peut-il être corrigé?
Adam Arold
4
N'oubliez pas d'utiliser une barre oblique entre les noms de fichiers et non un point. De plus, la fin du fichier est .class et non .java.
ThomasRS
1
Il est important de comprendre l'impact de ** et *. Si vous n'incluez pas ** et qu'il ne traversera pas les répertoires sous-jacents. Le * est un caractère unique et doit être utilisé à des fins de nom de fichier.
Smart Coder
18

Bien qu'Andrew ait déjà répondu à la question avec des détails, je donne le 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>

Pour l'application Springboot

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>sonar-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.sonarsource.scanner.maven</groupId>
                <artifactId>sonar-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                       <!-- Exclude class from test coverage -->
                        <exclude>**/*com/khan/vaquar/Application.class</exclude>
                        <!-- Exclude full package from test coverage -->
                        <exclude>**/*com/khan/vaquar/config/**</exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
vaquar khan
la source
1
Salut Vaquar, j'ai battu ma tête pour l'exclusion de paquet via le plugin jacoco maven. Je ne veux pas afficher les packages exclus sur Index.html qui est créé .. si vous avez le code avec vous pouvez faire de même, veuillez m'aider avec lui. Envoyez-moi le code à [email protected]
Vrajendra Singh Mandloi
3
Il semble que le chemin de classe devrait être sans .classfin , tel que: <exclude>**/*com/test/vaquar/khan/HealthChecker</exclude>
hovenko
3
Cela supprime le paquet entier du rapport pour moi: <exclude>com/mycompany/mypackage/**/*</exclude>
Jim Tough
4

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 package.

Arijit
la source
J'utilise jacoco-maven-plugin: 0.7.9. Avec votre solution, il calcule correctement les résultats. Cependant, toutes les classes du projet apparaissent dans le rapport jacoco (index.html). Est-il possible de montrer dans le rapport exactement ce que le plugin a analysé afin d'avoir la valeur réelle du ratio couvert?
aloplop85
3

https://github.com/jacoco/jacoco/issues/34

Voici les différentes notations pour les classes que nous avons:

  • Nom de la VM: java / util / Map $ Entry
  • Nom Java: java.util.Map $ Entry File
  • Nom: java / util / Map $ Entry.class

Paramètres de l'agent, tâches Ant et objectif de préparation de l'agent Maven

  • comprend: Java Name (VM Name fonctionne également)
  • exclut: Java Name (VM Name fonctionne également)
  • exclclassloader: nom Java

Ces spécifications autorisent les caractères génériques * et?, Où * les caractères génériques peuvent contenir n'importe quel nombre de caractères, même plusieurs dossiers imbriqués.

Objectif du rapport Maven

  • comprend: Nom de fichier
  • exclut: Nom de fichier

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 d'accès.

cra6
la source
3

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.

user1401472
la source
2

vous pouvez configurer l'exclusion de couverture dans les propriétés du sondeur, 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

leon cio
la source
1

Voici l'exemple de travail dans le pom.xmlfichier.

    <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>
divyanayan
la source