Configurazione Maven Jacoco - Esclude classi / pacchetti dal report non funzionante


103

Ho un progetto multimodulo maven e sto usando jacoco-maven per i rapporti sulla copertura del codice. Alcune classi non dovrebbero essere segnalate, poiché sono una configurazione Spring e non mi interessano.

Ho dichiarato il plugin maven-jacoco come segue:

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

Il problema è che quando mvn clean verifyeseguo jacoco riporta ancora le classi che avrebbero dovuto essere escluse come indica la mia configurazione xml. Come posso configurarlo correttamente?

Risposte:


181

Il tuo XML è leggermente sbagliato, devi aggiungere eventuali esclusioni di classi all'interno di un campo genitore esclude, quindi la tua configurazione sopra dovrebbe essere simile alla seguente come da documenti Jacoco

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

I valori dei campi di esclusione dovrebbero essere percorsi di classe (non nomi di pacchetto) delle classi compilate relative alla directory di destinazione / classi / utilizzando la sintassi jolly standard

*   Match zero or more characters
**  Match zero or more directories
?   Match a single character

Puoi anche escludere un pacchetto e tutti i suoi figli / sottopacchetti in questo modo:

<exclude>some/package/**/*</exclude>

Ciò escluderà tutte le classi some.packagee tutti i bambini. Ad esempio, some.package.childnon verrebbero nemmeno inclusi nei rapporti.

Ho testato e il mio obiettivo di report riporta su un numero ridotto di classi utilizzando quanto sopra.

Se stai quindi inserendo questo rapporto in Sonar, dovrai quindi dire a Sonar di escludere queste classi nel display che può essere fatto nelle impostazioni del sonar

Impostazioni> Impostazioni generali> Esclusioni> Copertura codice

Sonar Docs lo spiega un po 'di più

Esegui il tuo comando sopra

mvn clean verify

Mostrerà che le classi sono state escluse

Nessuna esclusione

[INFO] --- jacoco-maven-plugin:0.7.4.201502262128:report (post-test) @ ** ---
[INFO] Analyzed bundle '**' with 37 classes

Con esclusioni

[INFO] --- jacoco-maven-plugin:0.7.4.201502262128:report (post-test) @ ** ---
[INFO] Analyzed bundle '**' with 34 classes

Spero che questo ti aiuti


2
Ho dovuto aggiornare il plugin Jacoco dalla versione 0.7.5 alla 0.7.6 per prendere in considerazione l'esclusione.
Stephane

2
Ottimo suggerimento per quanto riguarda Sonar. È facile presumere che le esclusioni JaCoCo si propagheranno automaticamente a Sonar (come ho fatto io).
markdsievers

10
Se escludo un file da jacoco, viene visualizzato nel report di copertura con una copertura dello 0%. Quindi sostanzialmente ottengo risultati peggiori rispetto a non escludere. Può essere risolto?
Adam Arold

4
Ricorda di usare una barra tra i nomi dei file e non un punto. Inoltre, il file che termina è .class e non .java.
ThomasRS

1
È importante comprendere l'impatto di ** e *. Se non includi ** e quindi non attraverserà le directory sottostanti. * È un carattere singolo e deve essere utilizzato per scopi di nome file.
Smart Coder

18

Sebbene Andrew abbia già risposto alla domanda con i dettagli, sto fornendo il codice per escluderlo in 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>

Per l'applicazione 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>

1
Ciao Vaquar, ho battuto la testa per l'esclusione del pacchetto tramite il plugin jacoco maven. Non voglio mostrare i pacchetti esclusi su Index.html che è stato creato .. se hai il codice con puoi fare lo stesso, gentilmente aiutami con esso. Inviami il codice a imvrajendra@gmail.com
Vrajendra Singh Mandloi

3
Sembra che il percorso di classe debba essere senza .classfine , ad esempio: <exclude>**/*com/test/vaquar/khan/HealthChecker</exclude>
hovenko

3
Questo rimuove l'intero pacchetto dal rapporto per me: <exclude>com/mycompany/mypackage/**/*</exclude>
Jim Tough

4

Un'altra soluzione:

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

Si prega di notare che stiamo usando "<element>PACKAGE</element>"nella configurazione che quindi ci aiuta a escludere a livello di pacchetto.


Sto usando jacoco-maven-plugin: 0.7.9. Con la tua soluzione, calcola correttamente i risultati. Tuttavia, tutte le classi nel progetto vengono visualizzate nel rapporto jacoco (index.html). È possibile mostrare nel report proprio ciò che il plugin ha analizzato per avere il valore reale del rapporto coperto?
aloplop85

3

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

Queste sono le diverse notazioni per le classi che abbiamo:

  • Nome VM: java / util / Map $ Entry
  • Nome Java: java.util.Map $ Entry File
  • Nome: java / util / Map $ Entry.class

Parametri agente, attività Ant e obiettivo di preparazione dell'agente Maven

  • include: Java Name (funziona anche il nome VM)
  • esclude: Java Name (funziona anche VM Name)
  • exclclassloader: nome Java

Queste specifiche consentono caratteri jolly * e?, Dove * caratteri jolly un numero qualsiasi di caratteri, anche più cartelle nidificate.

Obiettivo del rapporto Maven

  • include: Nome file
  • esclude: Nome file

Queste specifiche consentono ad Ant Filespec come i caratteri jolly *, ** e?, Dove * i caratteri jolly sono solo parti di un singolo elemento del percorso.


3

Usa la proprietà sonar.coverage.exclusions.

mvn clean install -Dsonar.coverage.exclusions=**/*ToBeExcluded.java

Ciò dovrebbe escludere le classi dal calcolo della copertura.


2

è possibile configurare l'esclusione di copertura nelle proprietà del sonar, al di fuori della configurazione del 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>
....

e ricorda di rimuovere le impostazioni di esclusione dal plugin


1

Ecco l'esempio funzionante nel pom.xmlfile.

    <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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.