Configuração Maven Jacoco - Excluir classes / pacotes do relatório que não funcionam

103

Eu tenho um projeto de vários módulos maven e estou usando jacoco-maven para relatórios de cobertura de código. Algumas classes não devem ser relatadas, pois são configurações do Spring e não estou interessado nelas.

Eu declarei o plugin maven-jacoco da seguinte maneira:

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

O problema é que quando eu executo o mvn clean verifyjacoco ainda relata classes que deveriam ter sido excluídas conforme minha configuração xml indica. Como posso configurá-lo corretamente?

resilva87
fonte

Respostas:

181

Seu XML está um pouco errado, você precisa adicionar quaisquer exclusões de classe dentro de um campo pai excludes , então sua configuração acima deve ser parecida com a seguinte, de acordo com os documentos Jacoco

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

Os valores dos campos de exclusão devem ser caminhos de classe (não nomes de pacote) das classes compiladas em relação ao diretório de destino / classes / usando a sintaxe curinga padrão

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

Você também pode excluir um pacote e todos os seus filhos / subpacotes desta forma:

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

Isso excluirá todas as classes some.package, bem como todas as crianças. Por exemplo, some.package.childtambém não seria incluído nos relatórios.

Eu testei e meus relatórios de metas de relatório em um número reduzido de classes usando o acima.

Se você estiver enviando esse relatório para o Sonar, precisará dizer ao Sonar para excluir essas classes da exibição, o que pode ser feito nas configurações do Sonar

Configurações> Configurações gerais> Exclusões> Cobertura de código

Sonar Docs explica um pouco mais

Executando seu comando acima

mvn clean verify

Irá mostrar que as classes foram excluídas

Sem exclusões

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

Com exclusões

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

Espero que isto ajude

Andrew Kew
fonte
2
Tive que atualizar o plugin Jacoco da versão 0.7.5 para 0.7.6 para que a exclusão fosse levada em consideração.
Stephane
2
Ótima dica sobre o Sonar. É fácil assumir que as exclusões JaCoCo irão se propagar automaticamente para o Sonar (como eu fiz).
markdsievers de
10
Se eu excluir um arquivo do jacoco, ele aparecerá no relatório de cobertura com 0% de cobertura. Então, basicamente, obtenho resultados piores em comparação com a não exclusão. Isso pode ser corrigido?
Adam Arold
4
Lembre-se de usar uma barra entre os nomes dos arquivos e não um ponto. Além disso, a terminação do arquivo é .class e não .java.
ThomasRS
1
É importante entender o impacto de ** e *. Se você não incluir **, ele não irá para os diretórios subjacentes. O * é um único caractere e deve ser usado para fins de nome de arquivo.
Smart Coder
18

Embora Andrew já tenha respondido a pergunta com detalhes, estou fornecendo o código de como excluí-lo no 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 aplicativo 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
fonte
1
HI Vaquar, tenho batido na minha cabeça por exclusão de pacote via plugin jacoco maven. Não quero mostrar os pacotes excluídos em Index.html que é criado .. se você tem o código com você pode fazer o mesmo, por favor me ajude com isso. Envie-me o código em [email protected]
Vrajendra Singh Mandloi
3
Parece que o caminho da classe deve ser sem .classfim , como: <exclude>**/*com/test/vaquar/khan/HealthChecker</exclude>
hovenko
3
Isso remove todo o pacote do relatório para mim: <exclude>com/mycompany/mypackage/**/*</exclude>
Jim Tough
4

Outra solução:

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

Observe que estamos usando "<element>PACKAGE</element>"na configuração que nos ajuda a excluir no nível do pacote.

Arijit
fonte
Estou usando o plugin jacoco-maven: 0.7.9. Com sua solução, ele calcula os resultados corretamente. No entanto, todas as classes do projeto aparecem no relatório jacoco (index.html). É possível mostrar no relatório apenas o que o plugin analisou para ter o valor real da razão coberta?
aloplop85
3

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

Estas são as diferentes notações para as classes que temos:

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

Parâmetros do agente, tarefas Ant e objetivo de preparação do agente Maven

  • inclui: Nome Java (o nome da VM também funciona)
  • exclui: Nome Java (o nome da VM também funciona)
  • exclclassloader: Nome Java

Essas especificações permitem curingas * e?, Onde * curingas qualquer número de caracteres, até mesmo várias pastas aninhadas.

Maven relatório objetivo

  • inclui: Nome do arquivo
  • exclui: Nome do arquivo

Essas especificações permitem Ant Filespec como curingas *, ** e?, Onde * curingas são partes de um único elemento de caminho apenas.

cra6
fonte
3

Use a propriedade sonar.coverage.exclusions.

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

Isso deve excluir as classes do cálculo de cobertura.

user1401472
fonte
2

você pode configurar a exclusão de cobertura nas propriedades do sonar, fora da configuração do 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 lembre-se de remover as configurações de exclusão do plugin

leônio
fonte
1

Aqui está o exemplo de trabalho em pom.xmlarquivo.

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