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

Проблема:

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

Связанная документация:

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

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

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

Официальные вопросы jacoco 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 – исключить classы / пакеты из отчета, который не работает (похоже, для maven я использую gradle )

Плагин JaCoCo gradle исключает (не удалось заставить это работать)

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

Вопрос:

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

Благодаря, 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 / 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 ] ) } } 

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

 jacocoTestCoverageVerification { afterEvaluate { classDirectories = files(classDirectories.files.collect { fileTree(dir: "${project.buildDir}/classes/main", exclude: ['**/packagename/**']) }) } } 
  • Как обмануть repository async с помощью ядра Entity Framework
  • При использовании Mokito в чем разница между фактическим объектом и издеваемым объектом?
  • Как утверждать равенство на двух classах без метода equals?
  • Тестирование модhive с помощью Spring Security
  • Может ли модуль тестирования проекта загрузить файл app.config целевого приложения?
  • Модульное тестирование HTTP-запросов в c #
  • Как обмануть ConfigurationManager.AppSettings с moq
  • Почему я получаю исключение с сообщением «Неверная настройка для не виртуального (переопределяемого в VB) члена ...»?
  • Утверждение о списке в Junit
  • Как запустить все тесты, принадлежащие определенной категории в JUnit 4
  • Как я имитирую статические методы в classе с помощью easymock?
  • Давайте будем гением компьютера.