Comment définir la couverture minimale du code dans Jacoco Gradle ?
Je veux que la construction échoue si elle n'est pas remplie.
La fonctionnalité est maintenant disponible. Vous devez simplement appliquer le plug-in Gradle JaCoCo et définir la vérification de la couverture comme suit:
apply plugin: 'jacoco'
jacocoTestCoverageVerification {
violationRules {
rule {
limit {
minimum = 0.7
}
}
}
}
// to run coverage verification during the build (and fail when appropriate)
check.dependsOn jacocoTestCoverageVerification
La dernière ligne est très importante car sinon votre génération n’échouerait pas à moins d’exécuter explicitement la tâche jacocoTestCoverageVerification
.
Plus d'informations sur le type de vérifications que vous pouvez ajouter se trouvent dans la documentation du plugin .
Cette fonctionnalité n'est actuellement pas disponible avec le plugin Gradle Jacoco. Voir le numéro ouvert ici .
Il est toutefois possible d'écrire une tâche personnalisée qui analyse le rapport Jacoco et échoue lors de la construction en fonction de la couverture. Voir ici pour une façon de mettre en œuvre cela.
Dans une application Android, cette configuration fonctionne:
projet : build.gradle
buildscript {
repositories {
google()
jcenter()
maven { url 'https://plugins.gradle.org/m2/' }
}
dependencies {
classpath "com.Android.tools.build:gradle:3.1.4"
classpath "org.jacoco:org.jacoco.core:0.8.2"
}
}
app : build.gradle
ext.jacoco_version = '0.8.2'
def configDir = "${project.rootDir}/config"
def reportDir = "${project.buildDir}/reports"
def mainSrc = "$project.projectDir/src/main/Java"
def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', 'Android/**/*.*']
def debugTree = fileTree(dir: "$project.buildDir/intermediates/classes/debug", excludes: fileFilter)
//Jacoco jacocoTestReport
apply plugin: 'jacoco'
jacoco.toolVersion = jacoco_version
task jacocoTestReport(type: JacocoReport, dependsOn: 'testDebugUnitTest') {
reports {
xml.enabled = false
html.enabled = true
}
sourceDirectories = files([mainSrc])
classDirectories = files([debugTree])
executionData = fileTree(dir: project.buildDir, includes: [
'jacoco/testDebugUnitTest.exec', 'outputs/code-coverage/connected/*coverage.ec'
])
}
task jacocoTestCoverageVerification(type: JacocoCoverageVerification, dependsOn: 'jacocoTestReport') {
sourceDirectories = files([mainSrc])
classDirectories = files([debugTree])
executionData = files("${buildDir}/jacoco/testDebugUnitTest.exec")
violationRules {
failOnViolation = true
rule {
limit {
minimum = 0.7
}
}
}
}
Nous pouvons l'exécuter en ligne de commande avec:
./gradlew jacocoTestCoverageVerification
J'ai utilisé Gradle wrapper 4.4.
Voici l'exemple de la concurrence
task wrapper(type: Wrapper){
gradleVersion = '4.8'
}
plugins {
id 'Java'
id 'maven'
id "jacoco"
}
jacoco{
toolVersion = '0.8.1'
}
jacocoTestCoverageVerification {
violationRules {
rule {
limit {
minimum = 0.5
}
}
}
}
jacocoTestReport {
reports {
csv.enabled false
xml.enabled false
html {
enabled true
destination file("$buildDir/reports/jacoco")
}
}
executionData(test)
}
tasks.build.dependsOn(jacocoTestReport)
test{
jacoco{
append = false
destinationFile = file("$buildDir/jacoco/jacocoTest.exec")
classDumpDir = file("$buildDir/jacoco/classpathdumps")
}
}