Фильтровать отчеты о покрытии JaCoCo с помощью Gradle


Задача:

У меня есть проект сjacoco , и я хочу иметь возможность фильтровать определенные классы и/или пакеты.

Сопутствующая Документация:

Я прочитал следующую документацию:

Официальный сайт jacoco : http://www.eclemma.org/jacoco/index.html

Официальныеjacoco документы для gradle : https://gradle.org/docs/current/userguide/jacoco_plugin.html

Официальный джакоко Github вопросы, касающиеся охвата: https://github.com/jacoco/jacoco/wiki/FilteringOptions https://github.com/jacoco/jacoco/issues/14

Связанные Ссылки StackOverflow:

JaCoCo & Gradle-параметры фильтрации (нет ответа)

Исключить пакеты из отчета Jacoco с помощью Sonarrunner и Gradle (не использовать сонар )

JaCoCo-исключить JSP из отчета (похоже, это работает для maven , я использую gradle )

Maven Jacoco Configuration-исключить классы / пакеты из отчета не работает (кажется, работает для maven , я использую gradle)

JaCoCo gradle plugin exclude (не удалось заставить это работать)

Gradle Jacoco-coverage reports включает классы, исключенные из конфигурации (Кажется очень близко, он использовал doFirst, не работал для меня)

Пример того, что я попробовал:

apply plugin: 'java'
apply plugin: 'jacoco'

buildscript {
    repositories {
        mavenCentral()
        jcenter()
    }
}

repositories {
    jcenter()
}

jacocoTestReport {
    reports {
        xml {
            enabled true // coveralls plugin depends on xml format report
        }

        html {
            enabled true
        }
    }

    test {
        jacoco {
            destinationFile = file("$buildDir/jacoco/jacocoTest.exec")
            classDumpFile = file("$buildDir/jacoco/classpathdumps")
            excludes = ["projecteuler/**"] // <-- does not work
            // excludes = ["projecteuler"]
        }
    }
}

Вопрос:

Как я могу исключить определенные пакеты и классы при создании отчетов о покрытииjacoco ?

5 63

5 ответов:

Спасибо, Yannick Welsch:

После поиска в Google, чтения документов Gradle и просмотра старых сообщений StackOverflow, я нашел этот ответ на официальных форумахgradle !
jacocoTestReport {
    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: it, exclude: 'com/blah/**')
        })
    }
}

Источник: https://issues.gradle.org/browse/GRADLE-2955

Решение для моих build.gradle проектов Java / Groovy:

apply plugin: 'java'
apply plugin: 'jacoco'

jacocoTestReport {
    reports {
        xml {
            enabled true // coveralls plugin depends on xml format report
        }

        html {
            enabled true
        }
    }

    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: it,
                    exclude: ['codeeval/**',
                              'crackingthecode/part3knowledgebased/**',
                              '**/Chapter7ObjectOrientedDesign**',
                              '**/Chapter11Testing**',
                              '**/Chapter12SystemDesignAndMemoryLimits**',
                              'projecteuler/**'])
        })
    }
}

Как вы можете видеть, я успешно смог добавить больше к exclude:, чтобы отфильтровать несколько пакетов.

Источник: https://github.com/jaredsburrows/CS-Interview-Questions/blob/master/build.gradle

Пользовательские задачи для других проектов, таких как Android:

apply plugin: 'jacoco'

task jacocoReport(type: JacocoReport) {
    reports {
        xml {
            enabled true // coveralls plugin depends on xml format report
        }

        html {
            enabled true
        }
    }

    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: it,
                    exclude: ['codeeval/**',
                              'crackingthecode/part3knowledgebased/**',
                              '**/Chapter7ObjectOrientedDesign**',
                              '**/Chapter11Testing**',
                              '**/Chapter12SystemDesignAndMemoryLimits**',
                              'projecteuler/**'])
        })
    }
}

Источник: https://github.com/jaredsburrows/android-gradle-java-app-template/blob/master/gradle/quality.gradle#L59

Для меня это нормально работать с

test {
  jacoco {
    excludes += ['codeeval/**',
                 'crackingthecode/part3knowledgebased/**',
                 '**/Chapter7ObjectOrientedDesign**',
                 '**/Chapter11Testing**',
                 '**/Chapter12SystemDesignAndMemoryLimits**',
                 'projecteuler/**']
  }
}

Как указано в документации https://docs.gradle.org/current/userguide/jacoco_plugin.html#N16E62 и изначально просил Итак, ответ таков:

Так что если вы спросите меня: это не вопрос

excludes = ["projecteuler/**"]

Или

excludes += ["projecteuler/**"]

Но

excludes = ["**/projecteuler/**"]

Исключить пакет *.projecteuler.*

И test {} на уровне проекта, не вложенные в jacocoTestReport

Вот решение этой задачи в ANT. Это можно адаптировать к gradle, добавив следующее В задачу jacocoTestReport. Хотя на самом деле это не задокументировано jacoco, это кажется единственным способом фильтровать результаты тестов на данный момент.

afterEvaluate {
    classDirectories = files(classDirectories.files.collect {
        fileTree(dir: it, exclude: 'excluded/files/**')
    })
}

Это было уже некоторое время, но я только что наткнулся на это. Я боролся со всеми необходимыми исключениями. Я обнаружил, что это было нечто гораздо более простое для меня. Если вы следуете стилю компоновки Maven project / src / main / java и /src / test/java, вам просто нужно поместить buildDir / classes / main в вашемclassDirectories config выглядит так:

afterEvaluate {
    jacocoTestReport {
        def coverageSourceDirs = ['src/main/java']
        reports {
            xml.enabled false
            csv.enabled false
            html.destination "${buildDir}/reports/jacocoHtml"
        }
        sourceDirectories = files(coverageSourceDirs)
        classDirectories = fileTree(
                dir: "${project.buildDir}/classes/main",
                excludes: [
                      //whatever here like JavaConfig etc. in /src/main/java
                     ]
        )
    }
}

Приведенный ниже код также исключает классы из проверки покрытия:

jacocoTestCoverageVerification {
    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: "${project.buildDir}/classes/main",
                    exclude: ['**/packagename/**'])
        })
    }
}