writing unit tests with spock framework
Escritura de pruebas unitarias con Spock Framework: accesorios de prueba, afirmaciones e informes
En esto Guía completa para principiantes en Spock , una breve Introducción a Spock Framework y programación Groovy se dio en nuestro tutorial anterior.
En este tutorial, recorreremos todos los detalles / pasos necesarios para comenzar con Examen de la unidad en Spock.
consultas SQL preguntas de práctica con respuestas
En aras de la simplicidad, vamos a probar una aplicación de calculadora simple que tiene diferentes métodos como suma, resta, multiplicación, división, etc., todos los cuales aceptan parámetros enteros y devuelven un resultado entero.
Lo que vas a aprender:
- Prueba unitaria con el tutorial en video de Spock
- Empezando
- Palabra clave 'def'
- El ciclo de vida de una especificación de Spock
- Afirmaciones de Spock
- Reportando
- Conclusión
- Lectura recomendada
Prueba unitaria con el tutorial en video de Spock
Empezando
Al igual que cualquier otro marco de prueba unitario, Spock también se puede usar para escribir escenarios / casos de prueba para una aplicación bajo prueba. Intentaremos comparar y contrastar las diferentes características del marco Spock con los marcos existentes / conocidos como JUnit .
Palabra clave 'def'
Primero intentemos comprender brevemente la palabra clave 'def' de Groovy. La palabra clave def se usa para definir el tipo-def y se puede usar para declarar una función así como un campo / variable.
'Def' se usa generalmente cuando no queremos restringir el tipo de campo o el tipo de retorno de un método. Veamos algunos ejemplos de palabras clave def en una clase maravillosa y todos sus usos válidos.
|_+_|El ciclo de vida de una especificación de Spock
La especificación Spock cuando se ejecuta busca todas las pruebas definidas y las ejecuta una por una. Sin embargo, hay algunas otras funcionalidades / características que proporciona Spock para hacer que las pruebas sean menos redundantes y más legibles.
Analicemos algunas características a continuación:
Definición de entradas / variables como parte de la especificación
Considere la posibilidad de realizar varias pruebas con los mismos valores de entrada. Una forma sería inicializar los valores de entrada en cada prueba individualmente; de lo contrario, podemos definir directamente los campos a nivel de especificación y asegurarnos de que antes de cada prueba, los campos se inicialicen y estén disponibles para la prueba que se está ejecutando.
Veamos un ejemplo para nuestra clase de aplicación de calculadora .
Definiremos los datos de entrada a nivel de especificación para que estén disponibles con los valores iniciales para todas las pruebas presentes en la especificación.
|_+_|En este ejemplo de código, puede ver que hemos definido input1, input2, la aplicación bajo prueba y el resultado a nivel de especificación. Lo que esto asegura es que cada vez que se ejecuta una prueba desde los archivos de especificaciones, los campos inicializados se pasan a esa prueba. De hecho, esto elimina la necesidad de configurar pruebas cada vez con valores de entrada.
Accesorios de prueba
Similar a la mayoría de los marcos de prueba unitarios, Spock también proporciona métodos de configuración y limpieza para ejecutar tareas / lógica especial en eventos específicos del ciclo de vida de la ejecución de la prueba.
setupSpec y cleanupSpec
Estos métodos se llaman una vez para cada ejecución de la especificación y se llaman antes y después de la ejecución de la prueba, respectivamente. Estos son comparables a @ Antes de clase y @ Después de clases anotaciones de JUnit.
configuración y limpieza
Estos métodos se llaman antes y después de la ejecución de cada prueba en la especificación.
Estos ganchos son el lugar correcto para cualquier lógica / código que le gustaría ejecutar antes y después de la ejecución de la prueba. Por ejemplo , En la limpieza, puede escribir un código para cerrar la conexión de la base de datos (si la hay) que se utilizó durante la prueba.
Estos se pueden comparar con @ Antes de la prueba y @ Después de la prueba anotaciones en JUnit.
Veamos un ejemplo de estos accesorios en nuestra prueba de aplicación de calculadora.
|_+_|Si el código de dispositivo de prueba anterior se agrega a una especificación que contiene 4 pruebas, la salida será la siguiente:
|_+_|Afirmaciones de Spock
Las afirmaciones en Spock se denominan poder afirmar (y fue adoptado por groovy más tarde después de haber sido introducido por Spock). Las afirmaciones de Spock proporcionan muchas excepciones de diagnóstico en caso de fallas en las afirmaciones.
Uno puede descubrir fácilmente qué salió mal simplemente mirando el diagnóstico de falla en lugar de verboso AssertionErrors en JUnit y otros marcos.
Intentemos entender esto con un ejemplo y contrastarlo con JUnit
Trabajaremos con una prueba simple que verifica la igualdad de cadenas y ve qué diagnósticos se generan en caso de falla de afirmación.
Prueba de Spock
|_+_|Prueba JUnit
|_+_|Salida de Spock
|_+_|Salida JUnit
|_+_|Como puede inferir de lo anterior, la información de diagnóstico proporcionada por Spock tiene mejores detalles y es más fácil de usar en comparación con otros marcos como JUnit.
Consejos y trucos de afirmación
Afirmación de varios elementos a la vez: Spock proporciona varias abreviaturas para las aserciones y una de ellas es la notación '*', que permite afirmar los elementos de la lista.
Entendamos esto con un ejemplo:
Considere una clase CityInfo que tiene cityName y Population como campos. Escribiremos una prueba de Spock para afirmar los nombres de las ciudades que están en la lista dada.
|_+_|Veamos la prueba ahora:
|_+_|Como se muestra en la abreviatura de afirmación anterior, puede validar la lista completa con la ayuda de la palabra clave '*'.
Veamos también cómo se habría visto un fracaso. Eliminaré el nombre de cualquier ciudad de la afirmación anterior.
|_+_|Puede ver que la información de diagnóstico del fracaso de la afirmación es rica y fácil de comprender.
Aprovechando el parámetro de cierre: cada ().
Veamos cómo podemos aprovechar el parámetro de cierre llamado every () para agregar una aserción para cada elemento de una lista o colección. En el mismo ejemplo, intentemos agregar una afirmación que valide la población de cada ciudad si la entrada dada es> 50.
|_+_|Afirmar excepciones lanzadas
Se puede afirmar que las excepciones se incluyan en el bloque 'entonces' (lo que significa un cuando el bloque también es necesario). Se puede diagnosticar el detalle de la excepción asignando la excepción lanzada a un campo y afirmando las propiedades requeridas de la excepción lanzada.
Usemos la misma clase CityInfo y definamos un método que genere una excepción y escribamos una prueba para ello.
|_+_|Veamos la prueba ahora:
|_+_|Reportando
Para generar informes hermosos y detallados basados en HTML, hay bibliotecas disponibles que se pueden agregar en el archivo de compilación y ahora, cada vez que las pruebas se ejecutan durante la compilación (o por ejecución directa), se generará un informe detallado basado en html en el archivo. carpeta de salida.
Para generar los informes de prueba, agregue las siguientes bibliotecas al archivo build.gradle (y de manera similar también para el archivo pom.xml de Maven).
|_+_|Ahora cree el proyecto y ejecute las pruebas ejecutando todas las pruebas en la carpeta 'prueba' o ejecutando ' prueba de limpieza de gradle ”.
Tu puedes abrir index.html file para obtener un informe resumido de todas las especificaciones de Spock que estaban disponibles para su ejecución.
Si desea ver el informe detallado de una especificación específica, haga clic en la especificación de la lista anterior y podrá ver un informe detallado de los fallos y los éxitos.
Conclusión
En este tutorial, cubrimos los conceptos básicos de las pruebas unitarias con Spock Framework. Vimos las diferentes formas y atajos para escribir afirmaciones y el tipo de información de diagnóstico enriquecida generada por el marco de Spock para fallas en las afirmaciones.
También analizamos cómo podríamos generar informes bastante silenciosos basados en HTML para las pruebas de Spock que incluyen los mismos diagnósticos detallados para las pruebas ejecutadas.
¡Nuestro próximo tutorial le informará sobre cómo escribir pruebas parametrizadas con Spock en detalle!
PREV Tutorial | SIGUIENTE Tutorial
Lectura recomendada
- Pruebas basadas en datos o parametrizadas con Spock Framework
- Preguntas de la entrevista de Spock con respuestas (las más populares)
- Spock para pruebas funcionales y de integración con selenio
- Spock Mocking and Stubbing (ejemplos con tutoriales en video)
- Tutorial de Spock: Prueba con Spock y Groovy
- Tutorial de Mockito: Mockito Framework para simular en pruebas unitarias
- Las diferencias entre pruebas unitarias, pruebas de integración y pruebas funcionales
- Clave para el éxito de las pruebas unitarias: ¿cómo prueban los desarrolladores su propio código?