Перейти к основному содержимому

Исключения из отчета Jacoco

· 4 мин. чтения

1. Введение

В этой статье мы увидим, как исключить определенные классы и пакеты из отчетов о тестовом покрытии JaCoCo .

Как правило, кандидатами на исключение могут быть классы конфигурации, POJO, DTO, а также сгенерированный байт-код. Они не несут никакой конкретной бизнес-логики, и может быть полезно исключить их из отчетов, чтобы обеспечить лучшее представление о покрытии тестами.

Мы рассмотрим различные способы исключения как в Maven, так и в проекте Gradle.

2. Пример

Давайте начнем с примера проекта, в котором у нас есть весь необходимый код, уже пройденный тестами.

Затем мы создадим отчет о покрытии, запустив mvn clean package или mvn jacoco:report :

./d294b96b80df1acd0a9725526984392c.png

Здесь этот отчет показывает, что у нас уже есть необходимое покрытие, и пропущенные инструкции должны быть исключены из метрик отчета JaCoCo.

3. Исключение использования конфигурации плагина

Классы и пакеты можно исключить с помощью стандартных * и ? синтаксис подстановочных знаков в конфигурации плагина:

    • соответствует нулю или более символов
  • ** соответствует нулю или более каталогам
  • ? соответствует одному символу

3.1. Конфигурация Maven

Давайте обновим плагин Maven, чтобы добавить несколько исключенных шаблонов:

<plugin> 
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>com/foreach/**/ExcludedPOJO.class</exclude>
<exclude>com/foreach/**/*DTO.*</exclude>
<exclude>**/config/*</exclude>
</excludes>
</configuration>
...
</plugin>

Здесь мы указали следующие исключения:

  • Исключенный класс POJO в любом подпакете в пакете com.foreach
  • все классы с именами, оканчивающимися на DTO , в любом подпакете в пакете com.foreach
  • пакет конфигурации , объявленный где-либо в корне или вложенных пакетах

3.2. Конфигурация Gradle

Мы также можем применить те же исключения в проекте Gradle.

Для начала обновим конфигурацию JaCoCo в build.gradle и укажем список исключений, используя те же шаблоны, что и ранее:

jacocoTestReport {
dependsOn test // tests are required to run before generating the report

afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it, exclude: [
"com/foreach/**/ExcludedPOJO.class",
"com/foreach/**/*DTO.*",
"**/config/*"
])
}))
}
}

Выше мы используем замыкание для обхода каталогов классов и исключения файлов, соответствующих списку указанных шаблонов. В результате при создании отчета с использованием ./gradlew jacocoTestReport или ./gradlew clean test будут исключены все указанные классы и пакеты, как и ожидалось.

Стоит отметить, что плагин JaCoCo привязан к этапу тестирования , который запускает все тесты до создания отчетов.

4. Исключение с пользовательской аннотацией

Начиная с JaCoCo 0.8.2, мы можем исключать классы и методы, аннотируя их пользовательской аннотацией со следующими свойствами:

  • Имя аннотации должно включать Generated .
  • Политика хранения аннотаций должна быть во время выполнения или класса.

Во-первых, давайте создадим нашу аннотацию:

@Documented
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface Generated {
}

Теперь мы можем аннотировать класс(ы) или метод(ы), которые следует исключить из отчета о покрытии.

Давайте сначала используем эту аннотацию на уровне класса:

@Generated
public class Customer {
// everything in this class will be excluded from jacoco report because of @Generated
}

Точно так же мы можем применить эту пользовательскую аннотацию к определенному методу в классе:

public class CustomerService {

@Generated
public String getCustomerId() {
// method excluded form coverage report
}

public String getCustomerName() {
// method included in test coverage report
}
}

5. Исключение сгенерированного кода Lombok

Project Lombok — популярная библиотека для значительного сокращения шаблонного и повторяющегося кода в проектах Java.

Наконец, давайте посмотрим, как исключить весь байт-код, сгенерированный Lombok, добавив свойство в файл lombok.config в корневом каталоге нашего проекта:

lombok.addLombokGeneratedAnnotation = true

По сути, это свойство добавляет аннотацию lombok.@Generated к соответствующим методам, классам и полям всех классов, аннотированных аннотациями Lombok, например классу Product . В результате JaCoCo игнорирует все конструкции, аннотированные этой аннотацией, и они не отображаются в отчетах.

Наконец, мы можем увидеть отчет после применения всех методов исключения, показанных выше:

./66e7d522e531b608a421aa7962f0aaba.png

6. Заключение

В этой статье мы рассмотрели различные способы указания исключений из отчета о тестировании JaCoCo.

Изначально мы исключили несколько файлов и пакетов, используя шаблоны именования в конфигурации плагина. Затем мы увидели, как использовать @Generated для исключения определенных классов и методов. Наконец, мы рассмотрели, как исключить весь сгенерированный Lombok код из отчета о покрытии тестами с помощью файла конфигурации.

Как всегда, исходный код Maven и исходный код Gradle доступны на Github.