SonarQube: Cobertura incompleta no projeto de gradiente multimodular com a JaCoCo
Estou construindo um servidor SonarQube 6.2 que já está analisando meus projetos Java 8 / Gradle 3.3. Ao adicionar a JaCoCo a um projeto gradle de múltiplos módulos, percebi que o SonarQube está medindo a cobertura de código em uma base "por módulo":
Se uma classe estiver localizada no móduloA
e um teste para esta classe está localizado no móduloB
, O SonarQube calcula que a classe énão coberto.
Quero medir a cobertura do código em todos os módulos, não por módulo. Como faço para conseguir isso?
Existem muitas perguntas semelhantes, mas nenhuma resposta útil, embora a situação me pareça bastante comum. Jenkins, por exemplo, faz isso por padrão.
Eu decidi construir umblueprint no github para esclarecer a questão.
O principalbuild.gradle
consiste em
plugins { id "org.sonarqube" version "2.2.1" }
subprojects {
apply plugin: 'java'
apply plugin: 'jacoco'
repositories { mavenCentral() }
dependencies { testCompile "junit:junit:4.12" }
}
modA/build.gradle
está vazia.
Ele contém 3 classes:TestedInModA
, TestedInModATest
eTestedViaModB
.
modB/build.gradle
apenas declara uma dependência demodA
:
dependencies { compile project(':modA') }
Ele contém apenas uma classe:TestedViaModBTest
testando a classeTestedViaModB
localizado emmodA
.
Minha instância Jenkins (privada) mostra 100% de cobertura para as duas classes incluídas, enquanto o SonarQube diz apenas a classeTestedInModA
(que é testado em seu próprio módulo) é coberto.
Como posso modificar meu processo de construção para ver a "cobertura entre módulos" no SonarQube?
Gostaria de atualizar meu projeto para que futuros visitantes desta pergunta possam encontrar um exemplo de trabalho.
Minha solução de trabalho (obrigado @Godin)
adicione o seguinte aosubprojects
fecho
tasks.withType(Test) {
// redirect all coverage data to one file
// ... needs cleaning the data prior to the build to avoid accumulating coverage data of different runs.
// see `task cleanJacoco`
jacoco {
destinationFile = file("$rootProject.buildDir/jacoco/test.exec")
}
}
Adicionar, acrescentar
task cleanJacoco(dependsOn: 'clean') { delete "$buildDir/jacoco" }
lado de fora asubprojects
fecho.