Konfigurasi Maven Jacoco - Kecualikan kelas / paket dari laporan tidak berfungsi


103

Saya memiliki proyek multi-modul maven dan saya menggunakan jacoco-maven untuk laporan cakupan kode. Beberapa kelas tidak boleh dilaporkan, karena itu adalah konfigurasi Spring dan saya tidak tertarik padanya.

Saya telah mendeklarasikan plugin maven-jacoco sebagai berikut:

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

Masalahnya adalah ketika saya menjalankan mvn clean verifyjacoco masih melaporkan kelas yang seharusnya dikecualikan seperti yang ditunjukkan oleh konfigurasi xml saya. Bagaimana saya bisa mengkonfigurasinya dengan benar?

Jawaban:


181

XML Anda sedikit salah, Anda perlu menambahkan pengecualian kelas apa pun dalam bidang induk pengecualian, jadi konfigurasi Anda di atas akan terlihat seperti berikut sesuai dengan dokumen Jacoco

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

Nilai dari kolom exclude haruslah jalur kelas (bukan nama paket) dari kelas yang dikompilasi yang berhubungan dengan direktori target / kelas / menggunakan sintaks karakter pengganti standar

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

Anda juga dapat mengecualikan sebuah paket dan semua turunan / subpaketnya dengan cara ini:

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

Ini akan mengecualikan setiap kelas some.package, serta setiap anak. Misalnya, some.package.childtidak akan disertakan dalam laporan juga.

Saya telah menguji dan melaporkan tujuan saya pada jumlah kelas yang dikurangi menggunakan yang di atas.

Jika Anda kemudian mendorong laporan ini ke Sonar, Anda harus memberi tahu Sonar untuk mengecualikan kelas-kelas ini di tampilan yang dapat dilakukan di pengaturan Sonar

Pengaturan> Pengaturan Umum> Pengecualian> Cakupan Kode

Sonar Docs menjelaskannya sedikit lebih banyak

Menjalankan perintah Anda di atas

mvn clean verify

Akan menunjukkan kelas telah dikecualikan

Tidak ada pengecualian

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

Dengan pengecualian

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

Semoga ini membantu


2
Saya harus memutakhirkan plugin Jacoco dari versi 0.7.5 ke 0.7.6 untuk memperhitungkan pengecualian.
Stephane

2
Tip bagus tentang Sonar. Mudah untuk mengasumsikan bahwa pengecualian JaCoCo akan secara otomatis menyebar ke Sonar (seperti yang saya lakukan).
markdsievers

10
Jika saya mengecualikan bentuk file jacoco itu muncul di laporan cakupan dengan cakupan 0%. Jadi pada dasarnya saya mendapatkan hasil yang lebih buruk dibandingkan dengan tanpa pengecualian. Bisakah ini diperbaiki?
Adam Arold

4
Ingatlah untuk menggunakan garis miring antara nama file dan bukan titik. Selain itu, akhiran file adalah .class dan bukan .java.
ThomasRS

1
Penting untuk memahami dampak ** dan *. Jika Anda tidak menyertakan ** dan kemudian tidak akan masuk ke direktori yang mendasarinya. * Adalah karakter tunggal dan harus digunakan untuk tujuan nama file.
Smart Coder

18

Meskipun Andrew sudah menjawab pertanyaan dengan detail, saya memberikan kode bagaimana cara mengecualikannya di 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>

Untuk aplikasi 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
HI Vaquar, saya telah memukuli kepala saya untuk pengecualian paket melalui plugin jacoco maven. Saya tidak ingin menunjukkan paket yang dikecualikan di Index.html yang dibuat .. jika Anda memiliki kode, Anda dapat melakukan hal yang sama, tolong bantu saya. Kirimkan saya kode di imvrajendra@gmail.com
Singh Mandloi

3
Tampaknya jalur kelas harus tanpa .classakhir , seperti: <exclude>**/*com/test/vaquar/khan/HealthChecker</exclude>
hovenko

3
Ini menghapus seluruh paket dari laporan untuk saya: <exclude>com/mycompany/mypackage/**/*</exclude>
Jim Tough

4

Solusi lain:

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

Harap dicatat bahwa, kami menggunakan "<element>PACKAGE</element>"konfigurasi yang kemudian membantu kami untuk mengecualikan di tingkat paket.


Saya menggunakan jacoco-maven-plugin: 0.7.9. Dengan solusi Anda, ini menghitung hasil dengan benar. Namun, semua klas dalam proyek muncul di laporan jacoco (index.html). Apakah mungkin untuk menunjukkan dalam laporan apa yang telah dianalisis plugin untuk mendapatkan nilai riil dari rasio tertutup?
aloplop85

3

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

Ini adalah notasi berbeda untuk kelas yang kami miliki:

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

Parameter Agen, tugas Ant, dan tujuan persiapan-agen Maven

  • termasuk: Nama Java (Nama VM juga berfungsi)
  • tidak termasuk: Nama Java (Nama VM juga berfungsi)
  • exclclassloader: Nama Java

Spesifikasi ini mengizinkan karakter pengganti * dan?, Dengan * karakter pengganti sebanyak apa pun, bahkan beberapa folder bertingkat.

Maven melaporkan golnya

  • termasuk: Nama File
  • tidak termasuk: Nama File

Spesifikasi ini memungkinkan Ant Filespec seperti wildcard *, ** dan?, Di mana * wildcard bagian dari elemen jalur tunggal saja.


3

Gunakan properti sonar.coverage.exclusions.

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

Ini harus mengecualikan kelas-kelas dari perhitungan cakupan.


2

Anda dapat mengonfigurasi pengecualian cakupan di properti sonar, di luar konfigurasi 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>
....

dan jangan lupa untuk menghapus pengaturan pengecualian dari plugin


1

Berikut adalah contoh kerja dalam 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>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.