Konfiguracja Maven Jacoco - wykluczenie klas / pakietów z raportu nie działa

104

Mam wielomodułowy projekt Mavena i używam jacoco-maven do raportów pokrycia kodu. Niektórych klas nie należy zgłaszać, ponieważ są konfiguracjami Spring i nie jestem nimi zainteresowany.

Deklarowałem wtyczkę maven-jacoco w następujący sposób:

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

Problem polega na tym, że gdy mvn clean verifywykonuję jacoco, nadal raportuję klasy, które powinny zostać wykluczone, jak wskazuje moja konfiguracja xml. Jak mogę to poprawnie skonfigurować?

resilva87
źródło

Odpowiedzi:

184

Twój XML jest trochę błędny, musisz dodać wszystkie wykluczenia klas w polu wykluczającym rodzica, więc twoja powyższa konfiguracja powinna wyglądać następująco, zgodnie z dokumentacją Jacoco

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

Wartości pól wykluczeń powinny być ścieżkami klas (nie nazwami pakietów) skompilowanych klas względem katalogu docelowego / klas / przy użyciu standardowej składni symboli wieloznacznych

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

Możesz również wykluczyć pakiet i wszystkie jego elementy podrzędne / podpakiety w ten sposób:

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

Spowoduje to wykluczenie wszystkich klas w some.package, a także dzieci. Na przykład some.package.childnie zostanie uwzględniony w raportach.

Przetestowałem i mój raport raportuje o zmniejszonej liczbie klas korzystających z powyższego.

Jeśli następnie przesyłasz ten raport do Sonar, będziesz musiał powiedzieć Sonarowi, aby wykluczył te klasy na ekranie, co można zrobić w ustawieniach Sonar

Ustawienia> Ustawienia ogólne> Wykluczenia> Pokrycie kodu

Sonar Docs wyjaśnia to nieco dokładniej

Uruchomienie polecenia powyżej

mvn clean verify

Pokaże, że zajęcia zostały wykluczone

Bez wyjątków

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

Z wykluczeniami

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

Mam nadzieję że to pomoże

Andrew Kew
źródło
2
Musiałem zaktualizować wtyczkę Jacoco z wersji 0.7.5 do 0.7.6, aby wykluczenie zostało uwzględnione.
Stephane
2
Świetna wskazówka dotycząca Sonaru. Łatwo założyć, że wykluczenia JaCoCo automagicznie rozprzestrzenią się na Sonar (tak jak ja).
markdsievers
10
Jeśli wykluczę plik jacoco, pojawi się on w raporcie pokrycia z pokryciem 0%. Zasadniczo uzyskuję gorsze wyniki w porównaniu z brakiem wykluczenia. Czy można to naprawić?
Adam Arold
4
Pamiętaj, aby używać ukośnika między nazwami plików, a nie kropki. Ponadto rozszerzenie pliku to .class, a nie .java.
ThomasRS
1
Ważne jest, aby zrozumieć wpływ ** i *. Jeśli nie dodasz **, to nie przejdzie do bazowych katalogów. * Jest pojedynczym znakiem i należy go używać jako nazwy pliku.
Smart Coder
18

Chociaż Andrew już odpowiedział na pytanie ze szczegółami, podaję kod, jak wykluczyć go w 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>

Do aplikacji 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
źródło
1
Cześć Vaquar, biję się w głowę za wykluczenie pakietu przez wtyczkę jacoco maven. Nie chcę pokazywać pakietów wykluczonych na Index.html, który jest tworzony. Jeśli masz kod, możesz zrobić to samo, uprzejmie pomóż mi. Wyślij mi kod na adres [email protected]
Vrajendra Singh Mandloi
3
Wygląda na to, że ścieżka klasowa powinna być bez .classkońca , na przykład: <exclude>**/*com/test/vaquar/khan/HealthChecker</exclude>
hovenko
3
To usuwa cały pakiet z raportu dla mnie: <exclude>com/mycompany/mypackage/**/*</exclude>
Jim Tough
5

Inne rozwiązanie:

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

Należy pamiętać, że używamy "<element>PACKAGE</element>"w konfiguracji, która pomaga nam następnie wykluczyć na poziomie pakietu.

Arijit
źródło
Używam wtyczki jacoco-maven-plugin: 0.7.9. Twoje rozwiązanie poprawnie oblicza wyniki. Jednak wszystkie klasy w projekcie pojawiają się w raporcie jacoco (index.html). Czy można w raporcie pokazać, co przeanalizowała wtyczka, aby uzyskać rzeczywistą wartość wskaźnika pokrycia?
aloplop85
3

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

Oto różne notacje klas, które mamy:

  • Nazwa maszyny wirtualnej: java / util / Map $ Entry
  • Nazwa Java: java.util.Map $ Entry File
  • Nazwa: java / util / Map $ Entry.class

Parametry agenta, zadania mrówki i cel przygotowania agenta Mavena

  • obejmuje: nazwę Java (działa również nazwa maszyny wirtualnej)
  • nie obejmuje: Nazwa Java (działa również nazwa maszyny wirtualnej)
  • exclclassloader: nazwa Java

Te specyfikacje dopuszczają symbole wieloznaczne * i?, Gdzie * symbole wieloznaczne umożliwiają dowolną liczbę znaków, nawet wiele zagnieżdżonych folderów.

Cel raportu Mavena

  • zawiera: Nazwa pliku
  • nie obejmuje: Nazwa pliku

Te specyfikacje zezwalają Ant Filespec na używanie symboli wieloznacznych *, ** i?, Gdzie * symbole wieloznaczne tylko części pojedynczego elementu ścieżki.

cra6
źródło
3

Użyj właściwości sonar.coverage.excosures.

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

Powinno to wykluczyć klasy z obliczania pokrycia.

user1401472
źródło
2

możesz skonfigurować wykluczenie zasięgu we właściwościach sonaru, poza konfiguracją wtyczki 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>
....

i pamiętaj, aby usunąć ustawienia wykluczeń z wtyczki

leon cio
źródło
1

Oto próbka robocza w pom.xmlpliku.

    <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
źródło