Конфігурація Maven Jacoco - виключення класів / пакетів із звіту не працює


103

У мене є багатомодульний проект Maven, і я використовую jacoco-maven для звітів про покриття коду. Про деякі класи не слід повідомляти, оскільки вони весняна конфігурація, і я не цікавлюсь ними.

Я оголосив плагін 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. Як я можу правильно його налаштувати?

Відповіді:


181

Ваш 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, щоб виключити ці класи з дисплея, що можна зробити в налаштуваннях 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, щоб отримати виключення, яке слід враховувати.
Стефан

2
Чудова порада щодо Sonar. Неважко припустити, що виключення JaCoCo буде автоматично пропонувати Sonar (як я).
markdsievers

10
Якщо я виключаю формат файлів jacoco, він відображається у звіті про покриття із 0% охопленням. Так що в основному я отримую гірші результати порівняно з жодним винятком. Це можна виправити?
Адам Арольд

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, я бив головою за виключення пакету через плагін macoco maven. Я не хочу показувати виключені пакети на Index.html, який створений .. якщо у вас є код, ви можете зробити те саме, будь ласка, допоможіть мені в цьому. Надішліть мені код на imvrajendra@gmail.com
Vrajendra Singh Mandloi

3
Здається, шлях до класу повинен бути без .classкінця , наприклад: <exclude>**/*com/test/vaquar/khan/HealthChecker</exclude>
ховенко

3
Це видаляє весь пакет із звіту для мене: <exclude>com/mycompany/mypackage/**/*</exclude>
Jim Tough

4

Ще одне рішення:

<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: 0.7.9. За допомогою вашого рішення він правильно обчислює результати. Однак усі пропозиції проекту відображаються у звіті про jacoco (index.html). Чи можна показати у звіті лише те, що плагін проаналізував, щоб мати реальне значення покритого коефіцієнта?
aloplop85

3

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

Це різні позначення для занять у нас:

  • Назва VM: java / util / Map $ Entry
  • Ім'я Java: java.util.Map $ Entry File
  • Ім'я: java / util / Карта $ Entry.class

Параметри агента, завдання мурашки та мета-підготовка агента Мейвена

  • включає: ім'я Java (ім'я VM також працює)
  • виключає: ім'я Java (ім'я VM також працює)
  • exclclassloader: Ім'я Java

Ці технічні характеристики дозволяють мати підмітні символи * і?, Де * підстановки будь-якої кількості символів, навіть декілька вкладених папок.

Мета звіту Maven

  • включає: Ім'я файлу
  • виключає: Ім'я файлу

Ці параметри дозволяють Ant Filespec, як макіяж *, ** і?, Де * wildcards - лише частини одного елемента шляху.


3

Використовуйте властивість sonar.coverage.excitions.

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.