Creación de informes de cobertura de code para test unitarios y de integración con JaCoCo Maven Plugin

Para los desarrolladores que hacían uso del plugin Cobertura Plugin Maven, habrán descubierto con pena que si están usando la versión Java 1.7, este plugin no funciona correctamente.

Como considero que es muy importante realizar el análisis de cobertura busqué para tratar de encontrar un nuevo plugin que pudiera realizar las tareas que realizaba con el plugin Cobertura y finalmente encontré JaCoCo code coverage library.

JaCoCo es una librería libre para analizar cobertura de test.  JaCoCo usa la librería estándar de JVM.

jacoco

El problema de este plugin que encontré al tratar de configurarlo fue que no era nada sencillo. Leí bastante tutoriales hasta conseguir configurarlo. Este blog pretende ser un resumen de los pasos seguidos para su configuración.

Como siempre, vamos a resumir los requisitos que se pretenden cubrir con esta tarea.

  • Se pretende conseguir informes de cobertura tanto de los test unitarios como de integración.
  • Los informes deben ser generados en rutas diferentes, es decir, los informes de los test unitarios deben ser generados en una ruta diferente de la que se use para los test de integración.

Comenzamos con la configuración.

Configurando JaCoCo Maven Plugin

En general, el plugin JaCoCo se usa con dos propósitos:

  • Proveer de un acceso al JaCoCo runtime agent el cual graba la ejecución de los test.
  • Crear informes de cobertura de código desde la ejecución de los test grabados por el agente JaCoCo runtime.

Para configurar el plugin JaCoCo se deben seguir estos pasos:

  • Incluir el plugin JaCoCo Maven Plugin a la sección de plugin de nuestro fichero pom.xml
  • Configurar los informes de cobertura de test unitarios.
  • Configurar los informes de cobertura de test de integración.

A continuación se describen cada uno de los pasos.

Incluir plugin JaCoCo Maven Plugin a la sección plugins del fichero pom.xml

Para incluir el plugin dentro de la secciónde plugin se debe incluir la siguiente declaración en la sección de plugis de nuestro fichero pom.xml

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.6.4</version>
</plugin>

Configurar informe cobertura test unitarios.

Para configurar la ejecución de cobertura de código de los test unitarios se deben añadir dos ejecuciones a la declaración del plugin.

  • La primera ejecución crea los puntos del JaCoCo Runtime agent. Esto asegura que los datos de la ejecución serán escritos en el fichero /target/coverage-reports/jacoco.ut.exec. Se establece el valor de la propiedad a surefireArgLine. Este valor es pasado como argumento de la VM cuando el test sea ejecutado.
  • La segunda ejecución crea el informe de cobertura de código  para los test unitarios después de ser ejecutados. Asegura que los datos son leídos desde el fichero target/coverage-reports/jacococ-ut.exec. Los informes son guardados en el directorio /target/site/jacoco-ut.

La parte más importante de la configuración del plugin se escribre a continuación.

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.6.4</version>
    <executions>
        <!--
           Prepara la propiedad para que el agente JaCoCo runtime será pasado
           como argumento VM cuando el plugin maven surefire sea ejecutado.
       -->
        <execution>
            <id>pre-unit-test</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <!-- Establece el path al archivo el cual contiene los datos de la ejecución. -->
                <destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile>
                <!--
                   Establece el nombre de la propiedad que contiene la configuracion del agente VM runtime JaCoCo.
               -->
                <propertyName>surefireArgLine</propertyName>
            </configuration>
        </execution>
        <!--
           Asegura que el informe de cobertura de codigo para test unitarios es
           creado después de ejecutar los test unitarios.
       -->
        <execution>
            <id>post-unit-test</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
            <configuration>
                <!-- Establece el path del archivo que contiene los datos de ejecución. -->
                <dataFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</dataFile>
                <!-- Establece el directorio de salida para los informes de cobertura. -->
                <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

Configurando los informes de cobertura de código para tests de integración

Igual que se ha incluido la configuración para ejecutar cobertura de código para los tests unitarios también se puede configurar para los test de integración, para ellos debemos configurar el plugin añadiendo dos ejecuciones al plugin.

  • La primera ejecución crea los puntos del JaCoCo Runtime agent. Esto asegura que los datos de la ejecución serán escritos en el fichero /target/coverage-reports/jacoco.it.exec. Se establece el valor de la propiedad a failsafeArgLine. Este valor es pasado como argumento de la VM cuando el test sea ejecutado.
  • La segunda ejecución crea el informe de cobertura de código  para los test de integración después de ser ejecutados. Asegura que los datos son leídos desde el fichero /target/coverage-reports/jacococ-it.exec. Los informes son guardados en el directorio /target/site/jacoco-it.
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.6.4</version>
    <executions>
        <!-- Las ejecuciones requeridas para test unitarios son omitidas. -->
        <!--
           Prepara la propiedad para el agente runtime JaCoCo  el cual es pasado como argumento de la VM cuando maven failsafe sea ejecutado. -->
        <execution>
            <id>pre-integration-test</id>
            <phase>pre-integration-test</phase>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <!-- Establece el path al archivo que contiene la información de ejecución. -->
                <destFile>${project.build.directory}/coverage-reports/jacoco-it.exec</destFile>
                <!--
                   Establece la propiedad que contiene la configuración del agente
JaCoCo runtime agent.
               -->
                <propertyName>failsafeArgLine</propertyName>
            </configuration>
        </execution>
        <!--
           Asegura que los informes de cobertura para los test de integración seran ejecutados despues de ejecutar los test de integracion.
       -->
        <execution>
            <id>post-integration-test</id>
            <phase>post-integration-test</phase>
            <goals>
                <goal>report</goal>
            </goals>
            <configuration>
                <!-- Establece el path al archivo que contiene los datos de ejecucion. -->
                <dataFile>${project.build.directory}/coverage-reports/jacoco-it.exec</dataFile>
                <!-- Establece el directorio de salida para los test de cobertura. -->
                <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

Configuración del plugin Maven Surefire Plugin

Se usarán el plugin maven surefire plugin para ejecutar los test unitarios. Debido a que lo quese pretende es crear la cobertura de código de los test unitarios, tenemos que asegurar que el agente JaCoCo es ejecutado cuando nuestros test son ejecutados. Para asegurar esto podemos añadir el valor de la propiedad surefireArgLine como valor de de la propiedad del plugin argLine.

A continuación incluímos la configuración comentada para el plugin Maven Surefire Plugin:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.15</version>
    <configuration>
        <!-- Establece el argumento VM que sera usado cuando los test unitarios son ejecutados. -->
        <argLine>${surefireArgLine}</argLine>
        <!-- Salta los test unitarios cuando el valor de la propiedad skip.unit.tests es   true -->
        <skipTests>${skip.unit.tests}</skipTests>
        <!-- Excluye los test de integracion cuando los test unitarios son ejecutados.. -->
        <excludes>
            <exclude>**/IT*.java</exclude>
        </excludes>
    </configuration>
</plugin>

Configuración del plugin Maven Failsafe Plugin

Como ya se explicó en anterior entrada, este plugin es el que se usa para ejecutar los test de intgración. Así, de maner análoga, para poder ejecutar la cobertura de código de nuestros test de integración, debemos asegurar que el agente de JaCoCo será ejecutado cuando nuestros test de integración sean ejecutados. Para ello podemos incluir dentro de la configuración del plugin el valor de la propiedad failsafeArgLine dentro de la propiedad argLine del plugin.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.15</version>
    <executions>
        <!--
            Asegura que tanto los test de integracion y los objetivos de failsafe maven plugin seran ejecutados.
        -->
        <execution>
            <id>integration-tests</id>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
            <configuration>
                <!-- Establece el argumento VM usado cuando los test de integracion son ejecutados. -->
                <argLine>${failsafeArgLine}</argLine>
                <!--
                    Salta los test de integracion si el valor de la propiedad skip.integration.tests es true
                -->
                <skipTests>${skip.integration.tests}</skipTests>
            </configuration>
        </execution>
    </executions>
</plugin>

Crendo informes de cobertura de código

  • Con todo esto ya tenemos configurado todo para poder ejecutar los informes de cobertura de código. A continuación vamos a configurar como crear los informes de cobertura de código para test unitarios y de integración.
  • El perfil dev será ejecutado durante el desarrollo y será el perfil por defecto de nuestra construcción. Cuando este perfil sea ejecutado, sól test unitarios serán ejecutados.
  • El perfil integration-test será usado para ejecutar test de integración.
  • El perfil all-test será usado para ejecutar tanto test unitarios como de integración.

Se pueden ejecutar diferentes informes de cobertura ejecutando los siguiente comandos:

El comando mvn clean test ejecutará test unitarios y creará los informes de cobertura de test unitarios en el directorio /target/site/jacoco-ut

El comando mvn clean test -P integration-test ejecutará los test de integración y creará los informes de cobertura de código para los test de integración en el directorio /target/site/jacoco-it.

El comando mvn clean verify -P all-tests ejecutará los test unitarios y de integración y creará los informes de cobertura de código de test unitarios y de integración .

Anuncios
Esta entrada fue publicada en Maven. Guarda el enlace permanente.

Una respuesta a Creación de informes de cobertura de code para test unitarios y de integración con JaCoCo Maven Plugin

  1. Pingback: Retro Codemotion (2/N) | Software y otras desvirtudes

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s