Подтвердить что ты не робот

Отфильтровать отчеты о покрытиях JaCoCo с помощью Gradle

Проблема:

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

Дополнительная документация:

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

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

Официальный docs для : 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 из отчета (Кажется, он работает для , я использую gradle)

Конфигурация Maven Jacoco - исключить классы/пакеты из отчета, не работающего (похоже, для maven, я использую )

плагин JaCoCo Gradle (не удалось заставить это работать)

Gradle Отчеты Jacoco - охват включают классы, исключенные в конфигурации (Кажется, очень близко, он использовал 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"]
        }
    }
}

Вопрос:

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

4b9b3361

Ответ 1

Благодаря 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

Ответ 2

для меня, он отлично работает с

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

Ответ 3

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

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
                     ]
        )
    }
}

Ответ 4

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

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