viernes, 11 de diciembre de 2015

Mocking Tests Con Spring Boot, Spock y Gradle

Hola que tal, ya tenia mucho tiempo que no escribía en este blog. Para ser sinceros lo había abandonado ya que cambie de residencia, trabajo varias veces, hobbies y demás. Hacia falta un poco de distracción y enfoque en mi carrera profesional. En las ultimas semanas he tenido un poco de tiempo libre para investigar y desarrollar algunos ejemplos en las tecnologías en las que me he enfocado.

En esta ocasión les tengo un sencillo ejemplo de como utilizar Spock framework para hacer pruebas de unidad en un proyecto. Existen muchas soluciones para las pruebas de unidad como JUnit, NUnit, etc. La ventaja de Spock es que se integra muy bien con diferentes IDEs y Gradle (que ha venido creciendo en adopción como constructor automatizado de proyectos) ya que utiliza ampliamente el lenguaje Groovy. Ademas que apoya al desarrollador a escribir las pruebas de unidad en una forma

En lo particular me he tardado en adoptar el lenguaje groovy y todas las ventajas que este trae pero en cuanto a pruebas de unidad e integración es verdad que ofrece varias ventajas. El código fuente de el proyecto lo pueden encontrar en mi perfil de github y a continuación les ofrezco una pequeña explicación de como esta conformado el proyecto.

En primera es un proyecto gradle de naturaleza mixta entre Java y Groovy y todas las dependencias se pueden encontrar en el archivo build.gradle.

A continuación en el directorio src/main/java/.... encontraran las clases Java Greeting, HelloResource y SpringBootSpockTestApplication. Estas 3 clases sirven para construir una aplicación spring-boot rapida que expondrá un servicio web rest en la url /hello (Si necesitan saber mas sobre spring-boot pueden visitar este link). Como ven hasta aqui es una aplicación muy basica, la finalidad de este proyecto no es realizar la aplicación si no demostrar como hacer pruebas de unidad ya que en la actualidad es una parte muy importante de todo desarrollo de software.

Dentro del directorio src/test/groovy/.... se encuentra una sola clase que es la que contiene todas las pruebas de unidad expresadas en lenguaje spock y las cuales intentare explicar a continuación.


Primero describimos una clase (en este caso SpringBootSpockTestApplicationTests) la cual extiende la clase base Specification de spock. Luego definimos dos objetos compartidos para todas las pruebas (los cuales están marcados por la anotación @Shared). El primero de ConfigurableApplicationContext que es donde tendremos nuestro contexto de spring para poder acceder a beans específicos si es que necesitamos. El segundo de tipo MockMvc la cual utilizaremos para realizar llamadas rest hacia nuestros recursos REST y verificar su funcionamiento.  El método setupSpec() solo prepara estos dos objetos utilizando la conflagración de spring para que estén disponibles para las pruebas.


Luego del setup vienen los métodos de prueba (o feature methods) los cuales están descritos por un titulo (normalmente una explicación de lo que la prueba esta intenta hacer) y dentro los bloques de la prueba ( when , then). Estos bloques permiten describir la prueba de una manera mas explicita y visible para los usuarios u otros programadores. Por ejemplo en estas pruebas solo hacemos una llamada GET utilizando nuestro objeto mockMvc en nuestro bloque When y en nuestro bloque Then verificamos que el resultado de la llamada contenga los valores que requerimos utilizando jsonPath.


Spock se integra muy bien con diferentes ides asi que si este proyecto es abierto en eclipse las pruebas se pueden correr como una jUnit normal y el monitor de resultados nos dara los resultados como normalmente de muestran para junits normales. Ademas al construir nuestro proyecto utilizando gradle, estas pruebas también serán detectadas y desplegadas en nuestro reporte de pruebas.  Un ejemplo seria, al descargar el proyecto y ejecutar el comando
" ./gradle clean build " dentro del directorio del proyecto el archivo build/reports/tests/index.html sera creado con los resultados de las pruebas el cual se vera a algo parecido a la ultima imagen del post.

El mejor lugar para iniciar a entender spock es su pagina de basics la cual explica muy bien como definir pruebas en lenguaje spock. La pagina la pueden encontrar aquí https://code.google.com/p/spock/wiki/SpockBasics








Bueno eso es todo por hoy, espero y este post les sea de ayuda. Espero y seguir escribiendo en el blog mas seguido.