การกำหนดค่า Maven Jacoco - ไม่รวมคลาส / แพ็คเกจจากรายงานไม่ทำงาน


104

ฉันมีโครงการหลายโมดูล maven และฉันใช้ jacoco-maven สำหรับรายงานการครอบคลุมโค้ด ไม่ควรรายงานบางชั้นเรียนเนื่องจากเป็นการกำหนดค่า Spring และฉันไม่สนใจ

ฉันได้ประกาศปลั๊กอิน maven-jacoco ดังนี้:

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

ปัญหาคือเมื่อฉันรันmvn clean verifyjacoco ยังคงรายงานคลาสที่ควรได้รับการยกเว้นเนื่องจากการกำหนดค่า xml ของฉันชี้ให้เห็น ฉันจะกำหนดค่าให้ถูกต้องได้อย่างไร?

คำตอบ:


184

XML ของคุณผิดเล็กน้อยคุณต้องเพิ่มการยกเว้นคลาสใด ๆ ภายในฟิลด์หลักที่ไม่รวมดังนั้นการกำหนดค่าด้านบนของคุณควรมีลักษณะดังต่อไปนี้ตามเอกสาร Jacoco

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

ค่าของฟิลด์ที่ไม่รวมควรเป็นพา ธ คลาส (ไม่ใช่ชื่อแพ็กเกจ) ของคลาสที่คอมไพล์แล้วที่สัมพันธ์กับไดเร็กทอรีเป้าหมาย / คลาส / โดยใช้ไวยากรณ์ไวด์การ์ดมาตรฐาน

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

นอกจากนี้คุณยังสามารถยกเว้นแพ็คเกจและชุดย่อย / แพ็กเกจย่อยทั้งหมดด้วยวิธีนี้:

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

ซึ่งจะไม่รวมทุกชั้นเรียนsome.packageและเด็ก ๆ ตัวอย่างเช่นsome.package.childจะไม่รวมอยู่ในรายงานด้วย

ฉันได้ทดสอบและรายงานเป้าหมายของฉันรายงานเกี่ยวกับจำนวนชั้นเรียนที่ลดลงโดยใช้ข้างต้น

หากคุณกำลังส่งรายงานนี้ไปยังโซนาร์คุณจะต้องแจ้งให้ Sonar ยกเว้นคลาสเหล่านี้ในจอแสดงผลซึ่งสามารถทำได้ในการตั้งค่าโซนาร์

การตั้งค่า> การตั้งค่าทั่วไป> การยกเว้น> การครอบคลุมรหัส

Sonar Docsอธิบายเพิ่มเติมอีกเล็กน้อย

เรียกใช้คำสั่งของคุณด้านบน

mvn clean verify

จะแสดงชั้นเรียนที่ได้รับการยกเว้น

ไม่มีการยกเว้น

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

ด้วยการยกเว้น

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

หวังว่านี่จะช่วยได้


2
ฉันต้องอัปเกรดปลั๊กอิน Jacoco จากเวอร์ชัน 0.7.5 เป็น 0.7.6 เพื่อรับการยกเว้นที่จะนำมาพิจารณา
Stephane

2
เคล็ดลับดีๆเกี่ยวกับโซนาร์ ง่ายต่อการสันนิษฐานว่าการยกเว้น JaCoCo จะส่งต่อไปยัง Sonar โดยอัตโนมัติ (เหมือนที่ฉันทำ)
markdsievers

10
หากฉันไม่รวมรูปแบบไฟล์ jacoco จะปรากฏในรายงานความครอบคลุมโดยมีความครอบคลุม 0% โดยพื้นฐานแล้วฉันได้ผลลัพธ์ที่แย่กว่าเมื่อเทียบกับไม่มีการยกเว้น สามารถแก้ไขได้หรือไม่?
Adam Arold

4
อย่าลืมใช้เครื่องหมายทับระหว่างชื่อไฟล์และไม่ใช่จุด นอกจากนี้ไฟล์ที่สิ้นสุดคือ. class และไม่ใช่. java
ThomasRS

1
สิ่งสำคัญคือต้องเข้าใจผลกระทบของ ** และ * หากคุณไม่รวม ** แล้วมันจะไม่ผ่านเข้าไปในไดเร็กทอรีพื้นฐาน * เป็นอักขระเดี่ยวและควรใช้เพื่อวัตถุประสงค์ในการตั้งชื่อไฟล์
Smart Coder

18

แม้ว่าแอนดรูว์ตอบคำถามพร้อมรายละเอียดแล้ว แต่ฉันกำลังให้รหัสว่าจะแยกมันออกเป็นปอมได้อย่างไร

           <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

<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 ฉันไม่ต้องการแสดงแพ็กเกจที่ยกเว้นใน Index.html ซึ่งสร้างขึ้น .. หากคุณมีรหัสกับคุณสามารถทำเช่นเดียวกันได้โปรดช่วยฉันด้วย ส่งรหัสมาที่ imvrajendra@gmail.com
Vrajendra Singh Mandloi

3
ดูเหมือนว่าเส้นทางของชั้นเรียนควรจะไม่.classสิ้นสุดเช่น <exclude>**/*com/test/vaquar/khan/HealthChecker</exclude>
hovenko

3
สิ่งนี้จะลบแพ็คเกจทั้งหมดออกจากรายงานสำหรับฉัน: <exclude>com/mycompany/mypackage/**/*</exclude>
Jim Tough

5

วิธีแก้ปัญหาอื่น:

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

โปรดทราบว่าเรากำลังใช้"<element>PACKAGE</element>"ในการกำหนดค่าซึ่งจะช่วยให้เราแยกออกในระดับแพ็คเกจได้


ฉันใช้ jacoco-maven-plugin: 0.7.9 ด้วยโซลูชันของคุณจะคำนวณผลลัพธ์ได้อย่างถูกต้อง อย่างไรก็ตาม clases ทั้งหมดในโครงการจะปรากฏในรายงาน jacoco (index.html) เป็นไปได้หรือไม่ที่จะแสดงสิ่งที่ปลั๊กอินได้วิเคราะห์ไว้ในรายงานเพื่อให้มีมูลค่าที่แท้จริงของอัตราส่วนที่ครอบคลุม
aloplop85

3

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

นี่คือสัญกรณ์ต่างๆสำหรับคลาสที่เรามี:

  • ชื่อ VM: java / util / Map $ Entry
  • ชื่อ Java: java.util.Map $ Entry File
  • ชื่อ: java / util / Map $ Entry.class

พารามิเตอร์ของตัวแทนภารกิจ Ant และเป้าหมายการเตรียมตัวแทนของ Maven

  • รวมถึง: ชื่อ Java (ชื่อ VM ยังใช้งานได้)
  • ไม่รวม: Java Name (ชื่อ VM ยังใช้งานได้)
  • exclclassloader: ชื่อ Java

ข้อกำหนดเหล่านี้อนุญาตให้ใช้สัญลักษณ์แทน * และ? โดยที่ * สัญลักษณ์แทนอักขระจำนวนเท่าใดก็ได้แม้แต่โฟลเดอร์ที่ซ้อนกันหลายโฟลเดอร์

เป้าหมายรายงาน Maven

  • ประกอบด้วย: ชื่อไฟล์
  • ไม่รวม: ชื่อไฟล์

ข้อกำหนดเหล่านี้อนุญาตให้ Ant Filespec เช่นอักขระตัวแทน *, ** และ? โดยที่ * สัญลักษณ์แทนเป็นส่วนขององค์ประกอบเส้นทางเดียวเท่านั้น


3

ใช้คุณสมบัติ sonar.coverage.exclusions

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

สิ่งนี้ควรยกเว้นชั้นเรียนจากการคำนวณความครอบคลุม


2

คุณสามารถกำหนดค่าการยกเว้นความครอบคลุมในคุณสมบัติโซนาร์นอกการกำหนดค่าของปลั๊กอิน 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>
....

และอย่าลืมลบการตั้งค่าการยกเว้นออกจากปลั๊กอิน


1

นี่คือตัวอย่างการทำงานในpom.xmlไฟล์

    <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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.