web-dev-qa-db-fra.com

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

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?

59
resilva87

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

107
Andrew Kew

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>
6
vaquar khan

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

Ce sont les différentes notations pour les classes que nous avons:

  • Nom de la machine virtuelle: Entrée Java/util/Map $ 
  • Nom Java: Fichier d'entrée Java.util.Map $
  • Nom: Java/util/Map $ Entry.class

Paramètres de l'agent, tâches Ant et objectif Maven prepare-agent

  • inclut: Nom Java (Le nom de la machine virtuelle fonctionne également)
  • exclude: nom Java (le nom de la machine virtuelle fonctionne également)
  • exclclassloader: Nom Java

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

  • comprend: Nom du fichier
  • exclut: Nom du 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.

3
cra6

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.

2
Arijit

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.

2
user1401472

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

1
leon cio

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>
0
divyanayan