jacocoRootReport показывает только покрытие из последнего проекта многопроектной сборки gradle - PullRequest
0 голосов
/ 15 апреля 2020

Я обновляю свою многопроектную настройку Gradle 4 до Gradle 6. Я следовал инструкциям здесь:

{ ссылка }

и я поднял версию jacoco до 0.8.5. В настоящее время единственная проблема заключается в том, что отчет о покрытии, читаемый человеком, по-видимому, пропускает большую часть данных о покрытии, которые он показывал в старой версии. Кажется, что отчет о покрытии отражает только последний (последний протестированный) проект. В Gradle 4 он работал нормально. Я использую Java 8.

Я запустил сборку gradle, используя --debug, и заметил, что файл test.exec удаляется несколько раз, по одному для каждого подпроект, который имеет тесты. Я думаю, что это проблема, но я не знаю, как предотвратить удаление этого файла.

2020-04-16T09:16:21.048-0600 [DEBUG] [org.gradle.internal.file.impl.DefaultDeleter] Deleting /Users/bishop/dev/aep/edge-profile-lookup-target/build/jacoco/test.exec

Может кто-нибудь, пожалуйста, помогите мне исправить это так, чтобы все покрытие (от каждого из тестов, которые работали против каждого из подпроектов) появляются в одном отчете о покрытии?

Вот части основного файла build.gradle, которые кажутся актуальными:

buildscript {
    ext {
        jacocoVersion = '0.8.5'
        ...
    }
    ...
}

allprojects {
    ...
    apply plugin: 'jacoco'
    ...
}

subprojects {
    tasks.withType(Test) {
        // redirect all coverage data to one file
        jacoco {
            destinationFile = file("$rootProject.buildDir/jacoco/test.exec")
        }
    }
    jacoco {
        toolVersion = jacocoVersion
    }

    jacocoTestReport {
        additionalSourceDirs.from = files(sourceSets.main.allSource.srcDirs)
        sourceDirectories.from = files(sourceSets.main.allSource.srcDirs)
        classDirectories.from = files(sourceSets.main.output.collect {
            fileTree(dir: it, exclude: project.properties['BUILD_COVERAGE_EXCLUSIONS'].tokenize(','))
        })
        reports {
            html.enabled = true
            xml.enabled = true
            csv.enabled = false
        }
    }
}

task jacocoRootReport(type: JacocoReport) {
    dependsOn = subprojects.test
    additionalSourceDirs.from = files(subprojects.sourceSets.main.allSource.srcDirs)
    sourceDirectories.from = files(subprojects.sourceSets.main.allSource.srcDirs)
    classDirectories.from = files(subprojects.jacocoTestReport.classDirectories)
    executionData.from = files(subprojects.jacocoTestReport.executionData)
    reports {
        html.enabled = true
        xml.enabled = true
        csv.enabled = false
    }
    onlyIf = {
        true
    }
    doFirst {
        executionData.from = files(executionData.findAll {
            it.exists()
        })
    }
}

...
apply plugin: 'jacoco'

configurations.create("jacoco")

configurations {
    jacoco
}

dependencies {
    jacocoAnt group: 'org.jacoco', name: 'org.jacoco.ant', version: jacocoVersion
    jacocoAnt group: 'org.ow2.asm', name: 'asm', version: asmVersion
}

task copyRuntimeLibs(type: Copy) {
    from configurations.jacoco
    into "$rootProject.buildDir/libs"
}

build.dependsOn copyRuntimeLibs

1 Ответ

0 голосов
/ 17 апреля 2020

Следующее:

jacoco {
    destinationFile = file("$rootProject.buildDir/jacoco/test.exec")
}

настраивает Jacoco на постоянное использование одного и того же выходного файла.

Таким образом, наиболее вероятно, что более поздние версии Gradle работают на разделении сталкивающихся выходов.

Я бы порекомендовал посмотреть недавно опубликованный пример о том, как настроить Jacoco в мультипроекте, вместо того, чтобы пытаться полагаться на сталкивающиеся результаты.

...