Фильтровать отчеты о покрытии 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 ответов:
Спасибо,
После поиска в Google, чтения документов Gradle и просмотра старых сообщений StackOverflow, я нашел этот ответ на официальных форумахgradle !Yannick Welsch
: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/**']) }) } }
Для меня это нормально работать с
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 ] ) } }