martes, 17 de enero de 2017

Unit Tests & Integration test : Spring Boot Tests - Jacoco - Maven

Esta vez explicaré de manera muy básica como configurar un proyecto hecho en Spring Boot para ejecutar sus test unitarios y ademas generar un reporte utilizando el Plugin de Jacoco para Maven.


Comenzaré explicando que en todo proyecto es importante tener una suite de test bien definida, para esto existen una gran cantidad de librerías, que nos pueden ayudar.

En el caso de Spring, el framework nos proporciona ya un conjunto de librerías(módulo) que nos resuelven el tema de importar las dependencias.


                                     Configurar spring-boot-starter-test


Este módulo es spring-boot-starter-test y aunque existen otros módulos en Spring Boot para hacer test, este es el que contiene lo necesario y más básico para trabajar. Pues entre otras cosas nos proporciona lo siguiente: 

  • JUnit — La librería de testing unitario básica en todos los proyectos java.
  • Spring Test & Spring Boot Test —Algunas utilidades para testing de aplicaciones de Spring
  • AssertJ — Librería para Asserts
  • Hamcrest — Librería para crear matchers entre objetos
  • Mockito — Framework para crear objetos simulados para pruebas
  • JSONassert — Librería para realizar asserts sobre Json
  • JsonPath — XPath para JSON.


Para añadir el módulo de Spring es necesario añadir la siguiente dependencia al archivo pom.xml:


<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
</dependency>


Una vez añadida la dependencia, se deben crear los paquetes necesarios para contener las clases donde se escribirán los tests. Una forma sencilla de crear los paquetes es apoyándose en el IDE, en mi caso utilicé IntelliJ para configurar este proyecto, lo único que debes hacer es crear el paquete test dentro de la carpeta src/main dentro de tu proyecto y configurar el paquete /test/java como tipo test de los sources de tu aplicación.

Estructura del proyecto Spring Boot- Test- Jacoco

Modificar sources de proyecto java en IntelliJ

Después de eso al seleccionar un método o una clase basta con presionar Alt+Enter y seleccionar la opción "create test" lo que generará la estructura de paquetes necesarios en el proyecto.

Suponiendo que ya implementaste los tests y quieres ejecutarlos completos basta con escribir en la consola a nivel del root(donde se encuentra el pom) de tu proyecto para ejecutar los tests:

$mvn test

Pero esto aún no generará ningún reporte, para eso es lo siguiente:

Configurar Jacoco

Jacoco es una librería de java que nos permite generar reportes de análisis de cobertura de testing y entre sus características están que maneja diferentes tipos de reportes, está escrito en java y además es open source.

Otra característica importante es que se integra fácilmente con maven pudiendo ser configurado mediante un pluging en el pom.

Si quieres saber más del proyecto aquí está la documentación de Jacoco, Para este proyecto en particular utilizaremos la configuración básica.

Primero se añade la dependencia de Jacoco en el pom.xml:


<dependency>
 <groupId>org.jacoco</groupId>
 <artifactId>jacoco-maven-plugin</artifactId>
 <version>0.7.?</version>
</dependency>

La versión depende del momento en el que estés leyendo este tutorial, por lo que debes buscar la versión más actual en el sito oficial de Jacoco.

Posterior a esto debes configurar el pluging:



<build>
  <plugins>
   <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.8</version>
    <executions>
     <execution>
      <id>default-prepare-agent</id>
      <goals>
       <goal>prepare-agent</goal>
      </goals>
     </execution>
     <execution>
      <id>default-report</id>
      <phase>prepare-package</phase>
      <goals>
       <goal>report</goal>
      </goals>
     </execution>
     <execution>
      <id>default-check</id>
      <goals>
       <goal>check</goal>
      </goals>
      <configuration>
       <rules>
        <rule implementation="org.jacoco.maven.RuleConfiguration">
         <element>BUNDLE</element>
         <limits>
          <limit implementation="org.jacoco.report.check.Limit">
           <counter>COMPLEXITY</counter>
           <value>COVEREDRATIO</value>
           <minimum>0.60</minimum>
          </limit>
         </limits>
        </rule>
       </rules>
      </configuration>
     </execution>
    </executions>
   </plugin>
  </plugins>
 </build>

Con lo anterior listo, lo único que tienes que hacer es escribir en consola y ejecutar:

$mvn clean test

La sentencia anterior generará los files con los resultados de los tests, después ejecutar el pluging de jacoco, lo que generará el reporte con la información de cobertura.

$mvn jacoco:report


**El reporte de cobertura se podrá ver dentro del paquete /src/resources/site/jacoco, basta con abrir el file index.html para ver el reporte


El siguiente es el pom.xml del proyecto, como verán no es necesario añadir las dependencias de las librerías de la lista, pues todo se encuentra incluido dentro de spring-boot-starter-test:


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <parent>
  <!-- Your own application should inherit from spring-boot-starter-parent -->
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>1.4.3.RELEASE</version>
 </parent>
 <artifactId>spring-boot-sample-test</artifactId>
 <name>Spring Boot Test Sample</name>
 <description>Spring Boot Test Sample</description>
 <url>http://projects.spring.io/spring-boot/</url>
 <organization>
  <name>Pivotal Software, Inc.</name>
  <url>http://www.spring.io</url>
 </organization>
 <properties>
  <main.basedir>${basedir}/../..</main.basedir>
 </properties>
 <dependencies>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>
  <dependency>
   <groupId>com.h2database</groupId>
   <artifactId>h2</artifactId>
  </dependency>
  <dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
  </dependency>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
  </dependency>
  <dependency>
   <groupId>org.seleniumhq.selenium</groupId>
   <artifactId>selenium-htmlunit-driver</artifactId>
   <version>2.52.0</version>
   <scope>test</scope>
  </dependency>
  <dependency>
   <groupId>net.sourceforge.htmlunit</groupId>
   <artifactId>htmlunit</artifactId>
   <scope>test</scope>
  </dependency>
  <dependency>
   <groupId>org.jacoco</groupId>
   <artifactId>jacoco-maven-plugin</artifactId>
   <version>0.7.8</version>
  </dependency>
 </dependencies>
 <build>
  <plugins>
   <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.8</version>
    <executions>
     <execution>
      <id>default-prepare-agent</id>
      <goals>
       <goal>prepare-agent</goal>
      </goals>
     </execution>
     <execution>
      <id>default-report</id>
      <phase>prepare-package</phase>
      <goals>
       <goal>report</goal>
      </goals>
     </execution>
     <execution>
      <id>default-check</id>
      <goals>
       <goal>check</goal>
      </goals>
      <configuration>
       <rules>
        <!--  implementation is needed only for Maven 2  -->
        <rule implementation="org.jacoco.maven.RuleConfiguration">
         <element>BUNDLE</element>
         <limits>
          <!--  implementation is needed only for Maven 2  -->
          <limit implementation="org.jacoco.report.check.Limit">
           <counter>COMPLEXITY</counter>
           <value>COVEREDRATIO</value>
           <minimum>0.60</minimum>
          </limit>
         </limits>
        </rule>
       </rules>
      </configuration>
     </execution>
    </executions>
   </plugin>
  </plugins>
 </build>
</project>

El proyecto que se está probando en este caso se trata de una aplicación básica que expone un servicio REST y que accede a una base de datos configurada con MongoDB. Dado que la finalidad del proyecto es solo ejecutar los test y generar los reportes de Jacoco, no es necesario tener la base de datos instalada, ni configurar ningún servidor.


El código probado, proviene de los ejemplos obtenidos de de spring-boot. Por lo que es código accesible para todos.

https://gitlab.com/curiotechnology/spring-boot-sample-test




    Choose :
  • OR
  • To comment
No hay comentarios:
Write comentarios