Estaba en la misma situación que usted, las medias respuestas dispersas en Internet eran bastante molestas, ya que parecía que muchas personas tenían el mismo problema, pero nadie podía molestarse en explicar por completo cómo lo resolvieron.
Los documentos de Sonar se refieren a un proyecto de GitHub con ejemplos que son útiles. Lo que hice para resolver esto fue aplicar la lógica de las pruebas de integración a las pruebas unitarias regulares (aunque las pruebas unitarias adecuadas deberían ser específicas de submódulos, este no es siempre el caso).
En el padre pom.xml, agregue estas propiedades:
<properties>
<!-- Sonar -->
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
<sonar.language>java</sonar.language>
</properties>
Esto hará que Sonar recoja informes de prueba de unidad para todos los submódulos en el mismo lugar (una carpeta de destino en el proyecto principal). También le dice a Sonar que reutilice los informes que se ejecutan manualmente en lugar de lanzarlos por su cuenta. Solo necesitamos hacer que jacoco-maven-plugin se ejecute para todos los submódulos colocando esto en el pom padre, dentro de build / plugins:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.6.0.201210061924</version>
<configuration>
<destFile>${sonar.jacoco.reportPath}</destFile>
<append>true</append>
</configuration>
<executions>
<execution>
<id>agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
</executions>
</plugin>
destFile
coloca el archivo de informe en el lugar donde Sonar lo buscará y append
lo adjuntará al archivo en lugar de sobrescribirlo. Esto combinará todos los informes de JaCoCo para todos los submódulos en el mismo archivo.
Sonar examinará ese archivo para cada submódulo, ya que eso es lo que le señalamos anteriormente, dándonos resultados de pruebas de unidades combinadas para archivos de módulos múltiples en Sonar.
mvn package
antes de ejecutarmvn sonar:sonar
para obtener la nueva ruta del informe generado.Preguntas más frecuentes
Preguntas desde lo alto de mi cabeza desde entonces me volví loco con jacoco.
Mi servidor de aplicaciones (jBoss, Glassfish ...) ubicado en Iraq, Siria, lo que sea ... ¿Es posible obtener una cobertura de varios módulos al ejecutar pruebas de integración? Jenkins y Sonar también están en diferentes servidores.
Si. Debe usar el agente jacoco que se ejecuta en modo
output=tcpserver
jacoco ant lib. Básicamente dosjar
s. Esto te dará un 99% de éxito.¿Cómo funciona el agente jacocó?
Anexas una cuerda
a su servidor de aplicaciones JAVA_OPTS y reinícielo. En esta cadena solo
[your_path]
hay que reemplazarla por la ruta a jacocoagent.jar, almacenada (¡almacénela!) En su VM donde se ejecuta el servidor de aplicaciones. Desde el momento en que inicie el servidor de aplicaciones, todas las aplicaciones que se implementen serán monitoreadas dinámicamente y su actividad (es decir, el uso del código) estará lista para que usted obtenga en formato jacocos .exec por solicitud tcl.¿Podría restablecer el agente de jacoco para comenzar a recopilar datos de ejecución solo desde el momento en que comienza mi prueba?
Sí, para ese propósito necesita el script jacocoant.jar y ant build ubicado en su espacio de trabajo jenkins.
Entonces, ¿básicamente lo que necesito de http://www.eclemma.org/jacoco/ es jacocoant.jar ubicado en mi espacio de trabajo de jenkins y jacocoagent.jar ubicado en la máquina virtual de mi servidor de aplicaciones?
Así es.
No quiero usar hormiga, he oído que el complemento jacoco maven también puede hacer todas las cosas.
Eso no está bien, el complemento jacoco maven puede recopilar datos de pruebas unitarias y algunos datos de pruebas de integración (consulte Arquillian Jacoco ), pero si tiene, por ejemplo, las pruebas seguras como una compilación separada en jenkins y desea mostrar una cobertura de varios módulos, puedo No veo cómo el complemento Maven puede ayudarte.
¿Qué produce exactamente el agente jacocó?
Solo datos de cobertura en
.exec
formato. Sonar entonces puede leerlo.¿Necesita saber jacoco dónde están ubicadas mis clases de Java?
No, el sonar sí, pero no el jacoco. Cuando haces
mvn sonar:sonar
camino a las clases entra en juego.¿Y qué hay del guión de hormigas?
Tiene que presentarse en su espacio de trabajo jenkins. El guión de mi hormiga, lo llamé
jacoco.xml
así:Dos parámetros obligatorios que debe pasar al invocar este script,
-Dworkspace=$WORKSPACE
úselo para señalar su espacio de trabajo jenkins y-Djacoco.host=yourappserver.com
host sinhttp://
Observe también que puse mi
jacocoant.jar
en $ {workspace} /tools/jacoco/jacocoant.jar¿Qué debería hacer después?
¿Comenzaste tu servidor de aplicaciones con jacocoagent.jar?
¿Puso ant script y jacocoant.jar en su espacio de trabajo de jenkins?
En caso afirmativo, el último paso es configurar una compilación jenkins. Aquí está la estrategia:
jacocoReset
para restablecer todos los datos recopilados previamente.jacocoReport
para obtener informeSi todo está bien, verá
it-jacoco.exec
en su espacio de trabajo de compilación.Mire la captura de pantalla, también la
ant
instalé en mi espacio de trabajo en$WORKSPACE/tools/ant
dir, pero puede usar una que esté instalada en su jenkins.¿Cómo impulsar este informe en sonar?
Maven
sonar:sonar
hará el trabajo (no olvide configurarlo), apúntelo a pom.xml principal para que se ejecute en todos los módulos. Use elsonar.jacoco.itReportPath=$WORKSPACE/it-jacoco.exec
parámetro para indicarle al sonar dónde se encuentra su informe de prueba de integración. Cada vez que analizará nuevas clases de módulos, buscará información sobre la cobertura enit-jacoco.exec
.Ya tengo jacoco.exec en mi directorio `target`,` mvn sonar: sonar` lo ignora / elimina
De manera predeterminada
mvn sonar:sonar
,clean
elimina y elimina su directorio de destino, usesonar.dynamicAnalysis=reuseReports
para evitarlo.fuente
NUEVO CAMINO DESDE LA VERSIÓN 0.7.7
Desde la Versión 0.7.7 hay una nueva forma de crear un informe agregado:
Se crea un proyecto de 'informe' separado que recopila todos los informes necesarios (cualquier objetivo en el proyecto agregador se ejecuta antes de sus módulos, por lo tanto, no se puede usar).
El pom raíz se ve así (no olvide agregar el nuevo módulo de informe en los módulos):
No es necesario cambiar los poms de cada submódulo. El pom del módulo de informe se ve así:
Un ejemplo completo se puede encontrar aquí .
fuente
Publicaré mi solución, ya que es sutilmente diferente de las demás y también me tomó un día sólido para hacerlo bien, con la ayuda de las respuestas existentes.
Para un proyecto Maven de varios módulos:
Donde el
WAR
proyecto es la aplicación web principal,LIB
1 y 2 son módulos adicionales de los queWAR
depende yTEST
donde viven las pruebas de integración.TEST
gira una instancia de Tomcat incrustada (no a través del complemento de Tomcat) y ejecuta elWAR
proyecto y los prueba a través de un conjunto de pruebas JUnit. Los proyectosWAR
yLIB
ambos tienen sus propias pruebas unitarias.El resultado de todo esto es que la cobertura de integración y prueba unitaria se separa y puede distinguirse en SonarQube.
ROOT pom.xml
WAR
,LIB
yTEST
pom.xml
heredará la ejecución de los complementos de JaCoCo.TEST pom.xml
También encontré que la publicación del blog de Petri Kainulainens 'Creación de informes de cobertura de código para pruebas de unidad e integración con el complemento JaCoCo Maven' es valiosa para el lado de configuración de JaCoCo.
fuente
agent-for-it
solo es necesario cuando se ejecutan las pruebas en elTEST
módulo, pero la configuración actual lo tiene ejecutándose para cualquier otro módulo, donde no tiene ningún valor. La mejora sería haberagent-for-ut
corrido en todos los demás módulos yagent-for-it
solo enTEST
.Hay una manera de lograr esto. La magia es crear un archivo jacoco.exec combinado. Y con Maven 3.3.1 hay una manera fácil de obtener esto. Aquí mi perfil:
Si agrega este perfil a su padre pom y llama
mvn clean install sonar:sonar -DrunSonar
, obtendrá la cobertura completa.La magia aquí es
maven.multiModuleProjectDirectory
. Esta carpeta es siempre la carpeta donde comenzó su compilación Maven.fuente
mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.0.905:sonar -DrunSonar
debido a unA required class was missing while executing org.sonarsource.scanner.maven:sonar-maven-plugin:3.0.1:sonar: org/sonar/batch/bootstrapper/IssueListener
error.La configuración que uso en mi pom de nivel primario donde tengo fases separadas de prueba de unidad e integración.
Configuro las siguientes propiedades en las propiedades POM principales
Coloco las definiciones de complementos bajo administración de complementos.
Tenga en cuenta que defino una propiedad para los argumentos surefire (surefireArgLine) y failsafe (failsafeArgLine) para permitir que jacoco configure el javaagent para que se ejecute con cada prueba.
Bajo pluginManagement
Y en la sección de construcción
Y en la sección de informes
fuente
<append>true</append>
configuración en lasprepare-agent
secciones ...Encontré otra solución para las nuevas versiones de Sonar donde el formato de informe binario de JaCoCo (* .exec) fue obsoleto y el formato preferido es XML (SonarJava 5.12 y superior). La solución es muy simple y similar a la solución anterior con informes * .exec en el directorio principal de este tema: https://stackoverflow.com/a/15535970/4448263 .
Asumiendo que nuestra estructura de proyecto es:
Necesita la siguiente configuración del complemento de compilación maven en el pom del proyecto agregado:
Luego construya el proyecto con maven:
Y para Sonar, debe establecer la propiedad en la GUI de administración:
o usando la línea de comando:
Descripción
Esto crea informes binarios para cada módulo en directorios por defecto:
target/jacoco.exec
. A continuación, crea informes XML para cada módulo en directorios por defecto:target/site/jacoco/jacoco.xml
. Luego crea un informe agregado para cada módulo en el directorio personalizado${project.basedir}/../target/site/jacoco-aggregate/
que es relativo al directorio principal para cada módulo. Para el módulo A y el módulo B, esta será una ruta comúnmoduleC/target/site/jacoco-aggregate/
.Como el módulo B depende del módulo A, el módulo B se construirá en último lugar y su informe se utilizará como un informe de cobertura agregado en Sonar para los módulos A y B.
Además del informe agregado, necesitamos un informe de módulo normal ya que los informes agregados de JaCoCo contienen datos de cobertura solo para dependencias.
Juntos, estos dos tipos de informes proporcionan datos de cobertura completa para Sonar.
Hay una pequeña restricción: debe poder escribir un informe en el directorio principal del proyecto (debe tener permiso). O puede establecer la propiedad
jacoco.skip=true
en pom.xml (moduleC) del proyecto raíz yjacoco.skip=false
en módulos con clases y pruebas (moduleA y moduleB).fuente
fuente
Como Sonars
sonar.jacoco.reportPath
,sonar.jacoco.itReportPath
ysonar.jacoco.reportPaths
todos han quedado en desuso , deberías usarlossonar.coverage.jacoco.xmlReportPaths
ahora. Esto también tiene algún impacto si desea configurar un proyecto maven de módulos múltiples con Sonar y Jacoco.Como señaló @Lonzak , desde Sonar 0.7.7, puede usar el objetivo de agregación de informes de Sonars. Simplemente ponga en su padre pom la siguiente dependencia:
Como las versiones actuales de jacoco-maven-plugin son compatibles con los informes xml, esto creará para cada módulo en su propia carpeta de destino una carpeta de sitio / jacoco-agregado que contiene un
jacoco.xml
archivo.Para permitir que Sonar combine todos los módulos, use el siguiente comando:
Para mantener mi respuesta breve y precisa, no mencioné las dependencias
maven-surefire-plugin
ymaven-failsafe-plugin
. Simplemente puede agregarlos sin ninguna otra configuración:fuente
Puede llamar a una tarea de hormiga llamada fusionar en maven, para poner todos los archivos de cobertura (* .exec) juntos en el mismo archivo.
Si ejecuta pruebas unitarias, utilice el paquete de preparación de fase , si ejecuta la prueba de integración, utilice la prueba de integración posterior .
Este sitio tiene un ejemplo de cómo llamar a jacoco ant task en maven project
Puede usar este archivo combinado en la sonda.
fuente
para tener pruebas unitarias Y pruebas de integración, puede usar maven-surefire-plugin y maven-failsafe-plugin con restricciones / inclusiones excluidas. Estaba jugando con CDI mientras me ponía en contacto con sonar / jacoco, así que terminé en este proyecto:
https://github.com/FibreFoX/cdi-sessionscoped-login/
Quizás te ayude un poco. en mi pom.xml utilizo "-javaagent" implícito al configurar la opción argLine en la sección de configuración de los plugins de prueba especificados. El uso explícito de ANT en proyectos MAVEN es algo que no probaría, para mí es mucho mezclar dos mundos.
Solo tengo un proyecto Maven de módulo único, pero tal vez te ayude a ajustar el tuyo para que funcione.
nota: tal vez no todos los complementos de maven estén actualizados, tal vez algunos problemas se solucionen en versiones posteriores
fuente
Esta muestra me funciona muy bien:
fuente