Как я могу проверить минимальное покрытие с некоторыми исключенными классами и плагином jacoco?
Мне нужно проверить минимальное покрытие с новой задачей jacoco
jacocoTestCoverageVerification
эта задача доступна в выпуске 3.4.1 gradle и с плагином jacoco >= 0.6.3
Я мог бы запустить другую задачу, которая генерирует отчет html с покрытием ветви, но теперь я хочу использовать это число, чтобы сделать сборку неудачной.
Это мой код
buildscript {
ext {
....
}
repositories {
mavenCentral()
maven {
....
}
}
dependencies {
.....
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'jacoco'
jar {
baseName = "coverage-test"
}
dependencies {
// my dependencies
}
eclipse {
classpath {
containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')
containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8'
}
}
wrapper {
gradleVersion = '3.4.1'
}
jacoco {
toolVersion = '0.7.9'
}
jacocoTestReport {
reports {
xml.enabled false
csv.enabled false
}
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
additionalSourceDirs = files(sourceSets.main.allJava.srcDirs)
afterEvaluate {
classDirectories = files(classDirectories.files.collect {
fileTree(
dir: it,
excludes:
[
'com/jacoco/dto/**',
'com/jacoco/configs/**',
//and others
])
})
}
}
jacocoTestCoverageVerification {
//I tried this and it didn't work
// classDirectories = files(classDirectories.files.collect {
// fileTree(
// dir: it,
// excludes:
// [
// 'com/jacoco/dto/**',
// 'com/jacoco/configs/**',
// //and others
// ])
// })
violationRules {
rule {
//Also tried this and it didn't work
// excludes = ['com/jacoco/dto/**', ...]
limit {
counter = 'BRANCH'
minimum = 0.8
}
}
}
}
check.dependsOn jacocoTestCoverageVerification
С каталоги классов я получаю следующую ошибку не удается получить свойства "файлы" на нулевом объекте. И со вторым вариантом (только исключить), сборка выполняется плавно, но не исключает какой-либо класс.
2 ответов
вы измеряете другую вещь, которую вы исключаете. Область JaCoCo по умолчанию - "пакет", который, я считаю, означает весь код. Я никогда этим не пользовался. Я всегда измеряю только область "класса". И, похоже, вы пытаетесь сделать то же самое.
исключения относятся к элементам в области. Не уверен, что это значит для "связки", но я почти склонен думать, что это все или ничего. Также исключается использование другого типа подстановочного знака. Попробуйте изменить свой конфигурация для использования элемента "CLASS"(или "PACKAGE").
violationRules {
rule {
element = 'CLASS'
excludes = ['com.jacoco.dto.*']
limit {
counter = 'BRANCH'
minimum = 0.8
}
}
}
check.dependsOn jacocoTestCoverageVerification
в моем случае я сделал хотел использовать BUNDLE область, чтобы установить порог для всего, исключая некоторые пакетов и файлы.
что сработало для меня в конце концов, это добавление classDirectories
исключить, как предложено в исходном вопросе, но внутри afterEvaluate
такой:
afterEvaluate {
classDirectories = files(classDirectories.files.collect {
fileTree(dir: it, exclude: [
'com/example/my/package/*',
'com/example/service/MyApplication.kt',
'com/google/protobuf/*'
])
})
}
Для справки полное build.gradle
выглядит так:
apply plugin: "jacoco”
jacocoTestCoverageVerification {
afterEvaluate {
classDirectories = files(classDirectories.files.collect {
fileTree(dir: it, exclude: [
'com/example/my/package/*',
'com/example/service/MyApplication.kt',
'com/google/protobuf/*'
])
})
}
violationRules {
rule {
limit {
minimum = 0.79
}
}
}
}
// to run coverage verification during the build (and fail when appropriate)
check.dependsOn jacocoTestCoverageVerification
вы можете найти более подробную информацию в моем блоге: http://jivimberg.io/blog/2018/04/26/gradle-verify-coverage-with-exclusions/