Cấu hình Maven Jacoco - Loại trừ các lớp / gói khỏi báo cáo không hoạt động


103

Tôi có một dự án đa mô-đun maven và tôi đang sử dụng jacoco-maven cho các báo cáo về mức độ mã. Một số lớp không nên được báo cáo, vì chúng là cấu hình Spring và tôi không quan tâm đến chúng.

Tôi đã khai báo plugin maven-jacoco như sau:

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

Vấn đề là khi tôi thực thi mvn clean verifyjacoco vẫn báo cáo các lớp lẽ ra đã bị loại trừ khi cấu hình xml của tôi chỉ ra. Làm cách nào để cấu hình nó đúng cách?

Câu trả lời:


181

XML của bạn hơi sai, bạn cần thêm bất kỳ loại trừ lớp nào trong trường mẹ loại trừ, vì vậy cấu hình ở trên của bạn sẽ trông giống như sau theo tài liệu Jacoco

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

Giá trị của các trường loại trừ phải là đường dẫn lớp (không phải tên gói) của các lớp được biên dịch liên quan đến mục tiêu thư mục / các lớp / sử dụng cú pháp ký tự đại diện chuẩn

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

Bạn cũng có thể loại trừ một gói và tất cả các gói con / gói con của nó theo cách này:

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

Điều này sẽ loại trừ mọi lớp học some.packagecũng như mọi trẻ em. Ví dụ: some.package.childcũng sẽ không được đưa vào báo cáo.

Tôi đã thử nghiệm và mục tiêu báo cáo của tôi báo cáo về một số lớp giảm bằng cách sử dụng ở trên.

Nếu sau đó bạn đang đẩy báo cáo này vào Sonar, thì bạn sẽ cần yêu cầu Sonar loại trừ các lớp này trong màn hình, điều này có thể được thực hiện trong cài đặt Sonar

Cài đặt> Cài đặt chung> Loại trừ> Phạm vi mã

Sonar Docs giải thích thêm một chút

Chạy lệnh của bạn ở trên

mvn clean verify

Sẽ hiển thị các lớp đã bị loại trừ

Không loại trừ

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

Với các loại trừ

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

Hi vọng điêu nay co ich


2
Tôi đã phải nâng cấp plugin Jacoco từ phiên bản 0.7.5 lên 0.7.6 để tính đến loại trừ.
Stephane

2
Mẹo hay về Sonar. Dễ dàng cho rằng các loại trừ JaCoCo sẽ tự động đề xuất với Sonar (như tôi đã làm).
markdsievers

10
Nếu tôi loại trừ một biểu mẫu tệp jacoco, nó sẽ hiển thị trong báo cáo mức độ phù hợp với mức độ phù hợp là 0%. Vì vậy, về cơ bản tôi nhận được kết quả kém hơn so với không loại trừ. Điều này có thể được sửa chữa?
Adam Arold

4
Hãy nhớ sử dụng dấu gạch chéo giữa các tên tệp và không được dấu chấm. Ngoài ra, phần cuối của tệp là .class chứ không phải .java.
ThomasRS

1
Điều quan trọng là phải hiểu tác động của ** và *. Nếu bạn không bao gồm ** và thì nó sẽ không đi qua các thư mục cơ bản. Dấu * là một ký tự đơn và nên được sử dụng cho mục đích đặt tên tệp.
Smart Coder

18

Mặc dù Andrew đã trả lời câu hỏi với các chi tiết, tôi đang cung cấp mã làm thế nào để loại trừ nó trong 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>

Đối với ứng dụng 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, tôi đã rất lo lắng về việc loại trừ gói thông qua plugin jacoco maven. Tôi không muốn hiển thị các gói Bị loại trừ trên Index.html được tạo .. nếu bạn có mã, bạn có thể làm như vậy, vui lòng giúp tôi với. Gửi cho tôi mã tại imvrajendra@gmail.com
Vrajendra Singh Mandloi

3
Có vẻ như con đường lớp nên không có .classkết thúc , chẳng hạn như: <exclude>**/*com/test/vaquar/khan/HealthChecker</exclude>
hovenko

3
Thao tác này sẽ xóa toàn bộ gói khỏi báo cáo cho tôi: <exclude>com/mycompany/mypackage/**/*</exclude>
Jim Tough

4

Giải pháp khác:

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

Xin lưu ý rằng, chúng tôi đang sử dụng "<element>PACKAGE</element>"trong cấu hình, sau đó giúp chúng tôi loại trừ ở cấp độ gói.


Tôi đang sử dụng jacoco-maven-plugin: 0.7.9. Với giải pháp của bạn, nó sẽ tính toán kết quả một cách chính xác. Tuy nhiên, tất cả các manh mối trong dự án đều xuất hiện trong báo cáo jacoco (index.html). Có thể hiển thị trong báo cáo chỉ những gì plugin đã phân tích để có giá trị thực của tỷ lệ được bao phủ không?
aloplop85

3

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

Đây là các ký hiệu khác nhau cho các lớp mà chúng ta có:

  • Tên máy ảo: java / use / Map $ Entry
  • Tên Java: java.util.Map $ Entry File
  • Tên: java / use / Map $ Entry.class

Thông số đặc vụ, nhiệm vụ Ant và mục tiêu tác nhân chuẩn bị cho Maven

  • bao gồm: Tên Java (Tên máy ảo cũng hoạt động)
  • loại trừ: Tên Java (Tên máy ảo cũng hoạt động)
  • exclclassloader: Tên Java

Các thông số kỹ thuật này cho phép các ký tự đại diện * và?, Trong đó * ký tự đại diện bất kỳ số ký tự nào, thậm chí nhiều thư mục lồng nhau.

Mục tiêu báo cáo Maven

  • bao gồm: Tên tệp
  • loại trừ: Tên tệp

Các thông số kỹ thuật này cho phép Ant Filespec như các ký tự đại diện *, ** và ?, where * chỉ các phần của một phần tử đường dẫn duy nhất.


3

Sử dụng thuộc tính sonar.coverage.exclusions.

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

Điều này sẽ loại trừ các lớp khỏi tính toán phạm vi bảo hiểm.


2

bạn có thể định cấu hình loại trừ vùng phủ sóng trong thuộc tính sonar, bên ngoài cấu hình của 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>
....

và nhớ xóa cài đặt loại trừ khỏi plugin


1

Đây là mẫu làm việc trong pom.xmlhồ sơ.

    <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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.