SonarQube не показывает тестовое покрытие Jacoco для тестов JUnit в мультипроекте Gradle - PullRequest
0 голосов
/ 09 января 2020

Я хотел бы показать тестовое покрытие для сборки нескольких загрузочных приложений Spring с Gradle 6.0. В настоящее время мы используем JUnit5.

Покрытие теста показывает 0% в SonarQube, хотя существует несколько первых тестов.

Файлы build.gradle в проекте верхнего уровня (https://github.com/OpenReqEU/eclipse-plugin-vogella/blob/master/server/build.gradle ) имеет следующий вход:

plugins {
    id "org.sonarqube" version "2.7"
    id 'jacoco'
}

repositories {
    jcenter()
}

subprojects {
    apply plugin: 'jacoco'
    apply plugin: 'java'
    apply plugin: 'eclipse'

    repositories {
        jcenter()
        maven { url 'https://repo.spring.io/snapshot' }
        maven { url 'https://repo.spring.io/milestone' }
        maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
            maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' }
    }

    jacocoTestReport {
        reports {
            xml.enabled true
            xml.destination file("${buildDir}/coverage-reports/coverage.xml")
            //html.destination file("${buildDir}/coverage-reports")
        }
    }

    ext {
        springBootVersion = '2.1.1.RELEASE'
    }

    sourceCompatibility = 1.8

}


wrapper {
    gradleVersion = '6.0'
}

В сборке Jenkins мы устанавливаем следующие параметры:

sonar.projectKey=eclipse-plugin-vogella
sonar.sources=server/com.vogella.prioritizer.server/src/main,server/com.vogella.prioritizer.server.bugzilla/src/main,server/com.vogella.prioritizer.server.issue.api/src/main
sonar.java.binaries=com.vogella.prioritizer.server/build/classes/java/main,com.vogella.prioritizer.server.bugzilla/build/classes/java/main,com.vogella.prioritizer.server.issue.api/build/classes/java/main
sonar.tests=server/com.vogella.prioritizer.server/src/test,server/com.vogella.prioritizer.server.bugzilla/src/test
sonar.coverage.jacoco.xmlReportsPath=server/com.vogella.prioritizer.server.bugzilla/build/jacoco/test.exec,server/com.vogella.prioritizer.server/build/jacoco/test.exec,server/com.vogella.prioritizer.server.issue.api/build/jacoco/test.exec

В результате сборки отображается ошибка: INFO: parsing [ /home/jenkins/workspace/issue-prioritizer/coverage-reports/coverage.xml] ОШИБКА: путь к отчетам не найден или не является каталогом: /home/jenkins/workspace/issue-prioritizer/coverage-reports/coverage.xml

Я вижу, что каждый проект имеет сгенерированный файл $ {buildDir} /coverage-reports/coverage.xml, но файл root пуст, что ожидается, поскольку я не настроил ничего, связанного с this.

В какой-то момент я добавил задачу копирования, которая скопировала один из сгенерированных файлов xml из одного проекта в папку root, но задание на сборку пожаловалось, что классы не совпадают.

Кто-нибудь знает, как этот вопрос можно решить? Я предполагаю, что должен добавить конфигурацию, чтобы добавить root файл покрытия. xml, который является совокупностью отдельных, но я не нашел решения для этого.

Я также пытался применить jacoco в проект root, но также не удалось, поскольку проект root не является проектом Java.

1 Ответ

0 голосов
/ 16 января 2020

Мне удалось создать агрегированное покрытие. xml файл, изменив верхний уровень build.gradle на:

plugins {
//    id "org.sonarqube" version "2.7"
    id 'jacoco'
}

repositories {
    jcenter()
}


subprojects {

    println name;
    apply plugin: 'jacoco'
    apply plugin: 'java'
    apply plugin: 'eclipse'

    repositories {
        jcenter()
        maven { url 'https://repo.spring.io/snapshot' }
        maven { url 'https://repo.spring.io/milestone' }
        maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
        maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' }
    }

    jacocoTestReport {   
        reports {
            xml.enabled true
        }
    }

    ext {
        springBootVersion = '2.1.1.RELEASE'
    }

    sourceCompatibility = 1.8
}

// run the build with ./gradlew clean build generateMergedReport
task generateMergedReport(type: JacocoReport) {
    dependsOn = subprojects.test 

    additionalSourceDirs.setFrom files(subprojects.sourceSets.main.allSource.srcDirs)
    sourceDirectories.setFrom files(subprojects.sourceSets.main.allSource.srcDirs)
    classDirectories.setFrom files(subprojects.sourceSets.main.output)

    executionData.setFrom project.fileTree(dir: '.', include: '**/build/jacoco/test.exec')
    println executionData;

    reports {
        xml.enabled true
        xml.destination file("../coverage-reports/coverage.xml")
    }
}

wrapper {
    gradleVersion = '6.0'
}

И изменив Jenkins на сборку generateMergedReport:

cd server && ./gradlew build generateMergedReport

Свойства SonarQube были изменены на:

sonar.projectKey=eclipse-plugin-vogella
sonar.sources=server/com.vogella.prioritizer.server/src/main,server/com.vogella.prioritizer.server.bugzilla/src/main,server/com.vogella.prioritizer.server.issue.api/src/main
sonar.java.binaries=com.vogella.prioritizer.server/build/classes/java/main,com.vogella.prioritizer.server.bugzilla/build/classes/java/main,com.vogella.prioritizer.server.issue.api/build/classes/java/main

К сожалению, SonarQube по-прежнему не находит покрытие. xml файл.

INFO: parsing [/home/jenkins/workspace/issue-prioritizer/coverage-reports/coverage.xml]
ERROR: Reports path not found or is not a directory: /home/jenkins/workspace/issue-prioritizer/coverage-reports/coverage.xml

Кто-то имеет представление о том, чего не хватает?

...