Отфильтровать отчеты о покрытиях JaCoCo с помощью Gradle
Проблема:
У меня есть проект с jacoco и я хочу, чтобы иметь возможность фильтровать определенные классы и/или пакеты.
Дополнительная документация:
Я прочитал следующую документацию:
Официальный jacoco сайт:
http://www.eclemma.org/jacoco/index.html
Официальный jacoco docs для 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 (не используя sonar)
JaCoCo - исключить JSP из отчета (Кажется, он работает для maven, я использую gradle)
Конфигурация Maven Jacoco - исключить классы/пакеты из отчета, не работающего (похоже, для maven, я использую gradle)
плагин 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"]
}
}
}
Вопрос:
Как я могу исключить определенные пакеты и классы при создании jacoco отчеты о покрытии?
Ответы
Ответ 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/**')
})
}