Maven Jacoco Yapılandırması - Çalışmayan rapordan sınıfları / paketleri hariç tut


104

Bir maven çoklu modül projem var ve kod kapsamı raporları için jacoco-maven kullanıyorum. Bazı sınıflar, Bahar konfigürasyonu oldukları ve onlarla ilgilenmediğim için rapor edilmemelidir.

Maven-jacoco eklentisini aşağıdaki gibi ilan ettim:

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

Sorun şu ki, mvn clean verifyjacoco'yu çalıştırdığımda xml yapılandırmamın işaret ettiği gibi dışarıda bırakılması gereken sınıfları hala rapor ediyor. Nasıl doğru şekilde yapılandırabilirim?

Yanıtlar:


184

XML'iniz biraz yanlış, bir dışlananlar üst alanı içinde herhangi bir sınıf dışlaması eklemeniz gerekiyor, bu nedenle yukarıdaki yapılandırmanız Jacoco belgelerine göre aşağıdaki gibi görünmelidir.

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

Dışlama alanlarının değerleri, standart joker karakter sözdizimi kullanılarak hedef / sınıflar / dizinine göre derlenen sınıfların sınıf yolları (paket adları değil) olmalıdır.

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

Ayrıca bir paketi ve tüm alt paketlerini / alt paketlerini şu şekilde hariç tutabilirsiniz:

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

Bu, içindeki her sınıfı ve some.packageçocukları hariç tutacaktır . Örneğin some.package.child, raporlara da dahil edilmez.

Yukarıdakileri kullanarak daha az sayıda sınıfı test ettim ve rapor hedef raporlarım.

Daha sonra bu raporu Sonar'a gönderiyorsanız, Sonar'a bu sınıfları ekranda hariç tutmasını söylemeniz gerekecektir, bu da Sonar ayarlarında yapılabilir.

Ayarlar> Genel Ayarlar> Hariç Tutmalar> Kod Kapsamı

Sonar Docs bunu biraz daha açıklıyor

Yukarıdaki komutunuzu çalıştırıyorum

mvn clean verify

Sınıfların çıkarıldığını gösterecek

Hariç tutma yok

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

Hariç tutmalarla

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

Bu yardımcı olur umarım


2
Hariç tutmanın hesaba katılması için Jacoco eklentisini 0.7.5 sürümünden 0.7.6 sürümüne yükseltmem gerekti.
Stephane

2
Sonar ile ilgili harika bir ipucu. JaCoCo istisnalarının otomatik olarak Sonar'a yayılacağını varsaymak kolaydır (benim yaptığım gibi).
markdsievers

10
Bir jacoco formunu hariç tutarsam, kapsama raporunda% 0 kapsama ile görünür. Yani temelde hariç tutmama ile karşılaştırıldığında daha kötü sonuçlar alıyorum. Bu düzeltilebilir mi?
Adam Arold

4
Dosya adları arasında eğik çizgi kullanmayı ve nokta değil kullanmayı unutmayın. Ayrıca, dosya sonu .java değil .class şeklindedir.
ThomasRS

1
** ve * tuşlarının etkisini anlamak önemlidir. ** eklemezseniz ve bu durumda temeldeki dizinlere geçmez. * Tek bir karakterdir ve dosya adı amacıyla kullanılmalıdır.
Smart Coder

18

Andrew soruyu ayrıntılarla yanıtlamış olsa da, pom'da nasıl hariç tutulacağına dair kod veriyorum

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

Springboot uygulaması için

<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
HI Vaquar, jacoco maven eklentisi aracılığıyla paketi dışlamak için kafamı dövüyordum. Dışarıda bırakılan paketleri oluşturulan Index.html'de göstermek istemiyorum .. Eğer kodunuz varsa aynısını yapabilirsiniz, lütfen bana yardımcı olun. Kodu imvrajendra@gmail.com adresinden bana gönderin
Vrajendra Singh Mandloi

3
Sınıf yolu olmalıdır görünüyor olmadan .classbiten : örneğin, <exclude>**/*com/test/vaquar/khan/HealthChecker</exclude>
hovenko

3
Bu, benim için tüm paketi rapordan kaldırıyor: <exclude>com/mycompany/mypackage/**/*</exclude>
Jim Tough

5

Başka bir çözüm:

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

Lütfen "<element>PACKAGE</element>"yapılandırmada kullandığımızı ve bu da paket düzeyinde dışlamamıza yardımcı olduğunu unutmayın .


Jacoco-maven-eklentisini kullanıyorum: 0.7.9. Sizin çözümünüz ile sonuçları doğru hesaplar. Ancak, projedeki tüm sınıflar jacoco raporunda (index.html) görünür. Raporda, kapsanan oranın gerçek değerini elde etmek için eklentinin analiz ettiği şeyi göstermek mümkün müdür?
aloplop85

3

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

Bunlar, sahip olduğumuz sınıflar için farklı gösterimler:

  • Sanal Makine Adı: java / util / Harita $ Giriş
  • Java Adı: java.util.Map $ Giriş Dosyası
  • İsim: java / util / Map $ Entry.class

Ajan Parametreleri, Karınca görevleri ve Maven ajanı hazırlama hedefi

  • şunları içerir: Java Adı (VM Adı da çalışır)
  • hariç tutar: Java Adı (VM Adı da çalışır)
  • exclclassloader: Java Adı

Bu belirtimler joker karakterlere * ve?

Maven raporu hedefi

  • içerir: Dosya Adı
  • hariç tutar: Dosya Adı

Bu özellikler, Ant Filespec'e (joker karakterler *, ** ve?) İzin verir, burada * yalnızca tek bir yol öğesinin parçalarını * joker karakter olarak kullanır.


3

Sonar.coverage.exclusions özelliğini kullanın.

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

Bu, sınıfları kapsam hesaplamasının dışında tutmalıdır.


2

jacoco eklentisinin yapılandırmasının dışında, sonar özelliklerinde kapsam dışlamayı yapılandırabilirsiniz:

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

ve eklentiden hariç tutma ayarlarını kaldırmayı unutmayın


1

İşte pom.xmldosyadaki çalışma örneği .

    <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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.