Configuración de Maven Jacoco: excluir clases / paquetes del informe que no funciona

103

Tengo un proyecto de varios módulos de maven y estoy usando jacoco-maven para informes de cobertura de código. Algunas clases no deberían ser reportadas, ya que son configuraciones de Spring y no me interesan.

He declarado el complemento maven-jacoco de la siguiente manera:

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

El problema es que cuando ejecuto mvn clean verifyjacoco todavía reporta clases que deberían haber sido excluidas como señala mi configuración xml. ¿Cómo puedo configurarlo correctamente?

resilva87
fuente

Respuestas:

181

Su XML es un poco incorrecto, debe agregar las exclusiones de clase dentro de un campo principal de exclusiones, por lo que su configuración anterior debería verse como la siguiente según el documentos de Jacoco

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

Los valores de los campos de exclusión deben ser rutas de clases (no nombres de paquetes) de las clases compiladas en relación con el directorio destino / clases / utilizando la sintaxis comodín estándar

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

También puede excluir un paquete y todos sus subpaquetes secundarios de esta manera:

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

Esto excluirá todas las clases en some.package , así como a los niños. Por ejemplo,some.package.child tampoco se incluiría en los informes.

He probado y mi objetivo de informe informa sobre un número reducido de clases utilizando lo anterior.

Si luego está enviando este informe a Sonar, deberá decirle a Sonar que excluya estas clases en la pantalla, lo que se puede hacer en la configuración de Sonar.

Configuración> Configuración general> Exclusiones> Cobertura de código

Sonar Docs explica un poco más

Ejecutando su comando arriba

mvn clean verify

Mostrará que las clases han sido excluidas

Sin exclusiones

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

Con exclusiones

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

Espero que esto ayude

Andrew Kew
fuente
2
Tuve que actualizar el complemento Jacoco de la versión 0.7.5 a la 0.7.6 para que se tuviera en cuenta la exclusión.
Stephane
2
Gran consejo sobre Sonar. Es fácil asumir que las exclusiones de JaCoCo se propagarán automáticamente a Sonar (como hice yo).
markdsievers
10
Si excluyo un archivo del formulario jacoco, aparece en el informe de cobertura con una cobertura del 0%. Así que básicamente obtengo peores resultados en comparación con no excluir. ¿Se puede arreglar esto?
Adam Arold
4
Recuerde usar una barra entre los nombres de archivo y no el punto. Además, el final del archivo es .class y no .java.
ThomasRS
1
Es importante comprender el impacto de ** y *. Si no incluye ** y luego no pasará a directorios subyacentes. El * es un solo carácter y debe usarse para fines de nombre de archivo.
Smart Coder
18

Aunque Andrew ya respondió la pregunta con detalles, estoy dando un código sobre cómo excluirlo en 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>

Para la aplicación 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
fuente
1
Hola Vaquar, me he estado golpeando la cabeza por la exclusión del paquete a través del complemento jacoco maven. No quiero mostrar paquetes excluidos en Index.html que se crea ... si tiene el código, puede hacer lo mismo, por favor ayúdeme con él. Envíame el código a [email protected]
Vrajendra Singh Mandloi
3
Parece que la ruta de clases debería ser sin .classfin , como: <exclude>**/*com/test/vaquar/khan/HealthChecker</exclude>
hovenko
3
Esto me quita todo el paquete del informe: <exclude>com/mycompany/mypackage/**/*</exclude>
Jim Tough
4

Otra solución:

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

Tenga en cuenta que estamos utilizando "<element>PACKAGE</element>"en la configuración que luego nos ayuda a excluir a nivel de paquete.

Arijit
fuente
Estoy usando jacoco-maven-plugin: 0.7.9. Con su solución, calcula los resultados correctamente. Sin embargo, todas las clases del proyecto aparecen en el informe jacoco (index.html). ¿Es posible mostrar en el informe lo que ha analizado el complemento para tener el valor real de la proporción cubierta?
aloplop85
3

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

Estas son las diferentes notaciones para las clases que tenemos:

  • Nombre de VM: java / util / Map $ Entry
  • Nombre de Java: java.util.Map $ Archivo de entrada
  • Nombre: java / util / Map $ Entry.class

Parámetros de agente, tareas de Ant y objetivo de agente de preparación de Maven

  • incluye: Nombre de Java (el nombre de VM también funciona)
  • excluye: Java Name (VM Name también funciona)
  • exclclassloader: Nombre de Java

Estas especificaciones permiten comodines * y?, Donde * comodines cualquier número de caracteres, incluso varias carpetas anidadas.

Objetivo del informe Maven

  • incluye: Nombre de archivo
  • excluye: Nombre de archivo

Estas especificaciones permiten Ant Filespec como comodines *, ** y?, Donde * comodines solo son partes de un solo elemento de ruta.

cra6
fuente
3

Utilice la propiedad sonar.coverage.exclusions.

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

Esto debería excluir las clases del cálculo de cobertura.

usuario1401472
fuente
2

puede configurar la exclusión de cobertura en las propiedades de la sonda, fuera de la configuración del complemento 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>
....

y recuerde eliminar la configuración de exclusión del complemento

leon cio
fuente
1

Aquí está la muestra de trabajo en el pom.xmlarchivo.

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