1. Введение
В этой статье мы увидим, как исключить определенные классы и пакеты из отчетов о тестовом покрытии JaCoCo .
Как правило, кандидатами на исключение могут быть классы конфигурации, POJO, DTO, а также сгенерированный байт-код. Они не несут никакой конкретной бизнес-логики, и может быть полезно исключить их из отчетов, чтобы обеспечить лучшее представление о покрытии тестами.
Мы рассмотрим различные способы исключения как в Maven, так и в проекте Gradle.
2. Пример
Давайте начнем с примера проекта, в котором у нас есть весь необходимый код, уже пройденный тестами.
Затем мы создадим отчет о покрытии, запустив mvn clean package
или mvn jacoco:report
:
Здесь этот отчет показывает, что у нас уже есть необходимое покрытие, и пропущенные инструкции должны быть исключены из метрик отчета 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 игнорирует все конструкции, аннотированные этой аннотацией, и они не отображаются в отчетах.
Наконец, мы можем увидеть отчет после применения всех методов исключения, показанных выше:
6. Заключение
В этой статье мы рассмотрели различные способы указания исключений из отчета о тестировании JaCoCo.
Изначально мы исключили несколько файлов и пакетов, используя шаблоны именования в конфигурации плагина. Затем мы увидели, как использовать @Generated
для исключения определенных классов и методов. Наконец, мы рассмотрели, как исключить весь сгенерированный Lombok код из отчета о покрытии тестами с помощью файла конфигурации.
Как всегда, исходный код Maven и исходный код Gradle доступны на Github.