Конфигурация 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. Как мне его правильно настроить?

resilva87
источник

Ответы:

184

Ваш XML немного неверен, вам нужно добавить любые исключения класса в родительское поле excludes , поэтому ваша конфигурация должна выглядеть следующим образом в соответствии с документами Jacoco

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

Значения полей исключения должны быть путями к классам (а не именами пакетов) скомпилированных классов относительно целевого каталога / classes / с использованием стандартного синтаксиса подстановочных знаков.

*   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
Отличный совет относительно сонара. Легко предположить, что исключения JaCoCo автоматически распространятся на Sonar (как это сделал я).
markdsievers
10
Если я исключу файл из jacoco, он появится в отчете о покрытии с 0% покрытием. Так что в основном я получаю худшие результаты по сравнению с без исключения. Это можно исправить?
Adam Arold
4
Не забудьте использовать косую черту между именами файлов, а не точку. Кроме того, файл имеет окончание .class, а не .java.
ThomasRS
1
Важно понимать влияние ** и *. Если вы не включите **, он не будет перемещаться в базовые каталоги. * - это одиночный символ, который следует использовать в целях имени файла.
Smart Coder
18

Хотя Эндрю уже подробно ответил на вопрос, я даю код, как исключить его в 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>

Для приложения 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
Привет, Вакар, я забил себе голову за исключение пакета через плагин jacoco maven. Я не хочу показывать исключенные пакеты в созданном Index.html .. Если у вас есть код, вы можете сделать то же самое, пожалуйста, помогите мне с этим. Отправьте мне код на imvrajendra@gmail.com
Враджендра Сингх Мандлой
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. С вашим решением он правильно рассчитывает результаты. Однако все классы в проекте отображаются в отчете jacoco (index.html). Можно ли показать в отчете только то, что плагин проанализировал, чтобы получить реальное значение покрытого коэффициента?
aloplop85 02
3

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

Это разные обозначения классов, которые у нас есть:

  • Имя виртуальной машины: java / util / Map $ Entry
  • Имя Java: java.util.Map $ Entry File
  • Имя: java / util / Map $ Entry.class

Параметры агента, задачи Ant и цель агента подготовки Maven

  • включает: Имя Java (имя виртуальной машины также работает)
  • исключает: Имя Java (имя виртуальной машины также работает)
  • exclassloader: Имя Java

Эти спецификации допускают подстановочные знаки * и?, Где * подстановочные знаки - любое количество символов, даже несколько вложенных папок.

Цель отчета Maven

  • включает: Имя файла
  • исключает: Имя файла

Эти спецификации позволяют Ant Filespec, например, подстановочные знаки *, ** и?, Где * подстановочные знаки только части одного элемента пути.

cra6
источник
3

Используйте свойство sonar.coverage.exclusions.

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

Это должно исключить классы из расчета покрытия.

user1401472
источник
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>
Дивьянаян
источник