Saltar al contenido

¿Cómo configurar Maven + Sonar + JaCoCo de varios módulos para dar un informe de cobertura fusionada?

Solución:

Yo estaba en la misma situación que tú, las medias respuestas esparcidas por Internet eran bastante molestas, ya que parecía que muchas personas tenían el mismo problema, pero nadie podía molestarse en explicar completamente cómo lo resolvieron.

Los documentos de Sonar hacen referencia 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 deben ser específicas del submódulo, este no siempre es el caso).

En el pom.xml principal, 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 ejecutados manualmente en lugar de generar los suyos propios. Solo necesitamos hacer que jacoco-maven-plugin se ejecute para todos los submódulos colocando esto en el pom principal, 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 hace que se agregue al archivo en lugar de sobrescribirlo. Esto combinará todos los informes de JaCoCo para todos los submódulos en el mismo archivo.

Sonar mirará ese archivo para cada submódulo, ya que eso es lo que le indicamos anteriormente, dándonos resultados de pruebas unitarias combinadas para archivos de varios módulos en Sonar.

Preguntas más frecuentes

Preguntas desde lo alto de mi cabeza desde que enloquecí con jacoco.

Mi servidor de aplicaciones (jBoss, Glassfish …) ubicado en Irak, Siria, lo que sea … ¿Es posible obtener cobertura de varios módulos al ejecutar pruebas de integración en él? Jenkins y Sonar también están en servidores diferentes.

Si. Tienes que usar el agente jacoco que se ejecuta en modo output=tcpserver, jacoco hormiga lib. Básicamente dos jars. Esto le dará un 99% de éxito.

¿Cómo funciona el agente jacoco?

Añades una cadena

-javaagent:[your_path]/jacocoagent.jar=destfile=/jacoco.exec,output=tcpserver,address=*

a su servidor de aplicaciones JAVA_OPTS y reinícielo. Solo en esta cadena [your_path] tiene que ser reemplazado con la ruta a jacocoagent.jar, almacenado (¡guárdelo!) en su VM donde se ejecuta el servidor de aplicaciones. Desde ese 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 la obtenga en formato jacocos .exec por solicitud de tcl.

¿Puedo restablecer el agente jacoco para comenzar a recopilar datos de ejecución solo desde el momento en que comenzó mi prueba?

Sí, para ese propósito necesita jacocoant.jar y el script de compilación ant ubicado en su espacio de trabajo de 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 mi servidor de aplicaciones VM.

Eso es correcto.

No quiero usar ant, he oído que el plugin jacoco maven también puede hacer todas las cosas.

Eso no es correcto, el complemento jacoco maven puede recopilar datos de pruebas unitarias y algunos datos de pruebas de integración (consulte Arquillian Jacoco), pero si, por ejemplo, tiene la seguridad de que las pruebas son una compilación separada en jenkins y desea mostrar la cobertura de varios módulos, puedo No veo cómo el plugin maven puede ayudarlo.

¿Qué produce exactamente el agente jacoco?

Solo datos de cobertura en .exec formato. Sonar entonces puede leerlo.

¿Necesita jacoco saber dónde están ubicadas mis clases de Java?

No, sonar lo hace, pero no jacoco. Cuando tu lo hagas mvn sonar:sonar El camino a las clases entra en juego.

Entonces, ¿qué pasa con el guión de la hormiga?

Tiene que presentarse en su espacio de trabajo de jenkins. Mi guión de hormiga, lo llamé jacoco.xml tiene este aspecto:

<project name="Jacoco library to collect code coverage remotely" xmlns:jacoco="antlib:org.jacoco.ant">
    <property name="jacoco.port" value="6300"/>
    <property name="jacocoReportFile" location="${workspace}/it-jacoco.exec"/>

    <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
        <classpath path="${workspace}/tools/jacoco/jacocoant.jar"/>
    </taskdef>

    <target name="jacocoReport">
            <jacoco:dump address="${jacoco.host}" port="${jacoco.port}" dump="true" reset="true" destfile="${jacocoReportFile}" append="false"/>
    </target>

    <target name="jacocoReset">
            <jacoco:dump address="${jacoco.host}" port="${jacoco.port}" reset="true" destfile="${jacocoReportFile}" append="false"/>
        <delete file="${jacocoReportFile}"/>
    </target>
</project>

Dos parámetros obligatorios que debe pasar al invocar este script
-Dworkspace=$WORKSPACE
utilícelo para señalar su espacio de trabajo de jenkins y -Djacoco.host=yourappserver.com anfitrión sin http://

También note que puse mi jacocoant.jar a $ {espacio de trabajo} /tools/jacoco/jacocoant.jar

¿Qué debería hacer después?

¿Iniciaste tu servidor de aplicaciones con jacocoagent.jar?

¿Pusiste ant script y jacocoant.jar en tu espacio de trabajo de jenkins?

Si es así, el último paso es configurar una compilación de jenkins. Esta es la estrategia:

  1. Invocar objetivo de hormiga jacocoReset para restablecer todos los datos recopilados anteriormente.
  2. Ejecuta tus pruebas
  3. Invocar objetivo de hormiga jacocoReport para obtener un informe

Si todo va bien, veras it-jacoco.exec en su espacio de trabajo de construcción.

Mira la captura de pantalla, yo también tengo ant instalado en mi espacio de trabajo en $WORKSPACE/tools/ant dir, pero puede usar uno que esté instalado en su archivo jenkins.

ingrese la descripción de la imagen aquí

¿Cómo impulsar este informe en el sonar?

Maven sonar:sonar hará el trabajo (no olvide configurarlo), apúntelo al pom.xml principal para que se ejecute en todos los módulos. Usar sonar.jacoco.itReportPath=$WORKSPACE/it-jacoco.exec parámetro para indicarle a la sonda dónde se encuentra su informe de prueba de integración. Cada vez que analiza nuevas clases de módulos, buscará información sobre la cobertura en it-jacoco.exec.

Ya tengo jacoco.exec en mi directorio `target`,` mvn sonar: sonar` lo ignora / elimina

Por defecto mvn sonar:sonar lo hace clean y borra su directorio de destino, use sonar.dynamicAnalysis=reuseReports para evitarlo.

NUEVA FORMA DESDE LA VERSIÓN 0.7.7

Desde la versión 0.7.7, existe una nueva forma de crear un informe agregado:

Usted crea un proyecto de ‘informe’ separado que recopila todos los informes necesarios (se ejecuta cualquier objetivo en el proyecto del agregador antes de sus módulos, por lo tanto, no se puede utilizar).

aggregator pom
  |- parent pom
  |- module a
  |- module b
  |- report module 

los pom de raíz tiene este aspecto (no olvide agregar el nuevo módulo de informe en módulos):

<build>
<plugins>
  <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.8</version>
    <executions>
      <execution>
        <id>prepare-agent</id>
        <goals>
          <goal>prepare-agent</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
</plugins>

Los pompones de cada submódulo no necesitan cambiarse en absoluto. El pom del módulo de informe Se ve como esto:

<!-- Add all sub modules as dependencies here -->
<dependencies>
  <dependency>
    <module a>
  </dependency>
  <dependency>
    <module b>
  </dependency>
 ...

  <build>
    <plugins>
      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.7.8</version>
        <executions>
          <execution>
            <id>report-aggregate</id>
            <phase>verify</phase>
            <goals>
              <goal>report-aggregate</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

Puede encontrar un ejemplo completo aquí.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *