Este documento proporciona una introducción al framework de testing Spock en Grails. Explica qué son los tests de software, los tipos principales de tests y otros frameworks de testing como JUnit y TestNG. Luego, se detalla las características clave de Spock como su sintaxis sencilla y expresiva, y su capacidad para integrar conceptos de TDD, BDD y mockeo de objetos. Finalmente, se explica cómo instalar y utilizar Spock en proyectos Grails para realizar diferentes tipos de tests como sobre clases de dominio, controladores, servicios y librer
3. Introducción a los tests
¿Qué son los tests?
Tipos de tests de software
Otros frameworks de tests
4. ¿Qué son los tests?
Los tests de software se pueden definir como el proceso
empleado para comprobar la corrección de un programa
informático y se puede considerar como una parte más en el
proceso del control de calidad.
5. Tipos de tests de software
Tests unitarios
Tests de integración
Tests funcionales
7. Características de Spock
Fácil de aprender
Integración con Groovy
Eliminación aserciones innecesarias
Información detallada en las salidas de los tests
Diseñado desde el punto de vista del usuario
TDD, BDD, etc
Lenguaje altamente expresivo
Compatible con JUnit
Combina ideas de otros frameworks como JUnit o jMock
15. A tener en cuenta
Tenemos una batería de pruebas con datos diferentes
Utilizamos placeholders en el nombre del test
Unroll despliega cada conjunto de datos como un test
nuevo
19. A tener en cuenta
Bloque given para preparar el test
Bloque cleanup para dejar las cosas como estaban
20. Spock en Grails
Tests sobre clases de dominio
Tests sobre contraladores
Tests sobre librerías de etiquetas, vistas y plantillas
Tests sobre servicios
Tests mockeando objetos
Algunas anotaciones interesantes
21. Métodos predefinidos
setupSpec(), se ejecuta antes del primer test de una
determinada clase de tests con Spock
cleanupSpec(), se ejecuta después del último test de una
determinada clase de tests con Spock
setup(), se ejecuta antes de cada test de una determinada
clase de tests con Spock
setupSpec(), se ejecuta después de cada test de una
determinada clase de tests con Spock
22. Tests sobre clases de dominio en Grails
packagees.ua.expertojava.todo
classCategory{
Stringname
Stringdescription
statichasMany=[todos:Todo]
staticconstraints={
name(blank:false)
description(blank:true,nullable:true,maxSize:1000)
}
StringtoString(){
name
}
}
23. Tests sobre clases de dominio en Grails
packagees.ua.expertojava.todo
importgrails.test.mixin.TestFor
importspock.lang.Specification
importspock.lang.Unroll
/**
*SeetheAPIfor{@linkgrails.test.mixin.domain.DomainClassUnitTestMixin}forusageinstructions
*/
@TestFor(Category)
classCategorySpecextendsSpecification{
defsetup(){
}
defcleanup(){
}
...
24. Tests sobre clases de dominio en Grails
def"Elnombredelacategoríanopuedeserlacadenavacía"(){
given:
defc1=newCategory(name:"")
when:
c1.validate()
then:
c1?.errors['name']
}
25. Tests sobre clases de dominio en Grails
def"Sielnombrenoeslacadenavacía,estecamponodaráproblemas"(){
given:
defc1=newCategory(name:"algo")
when:
c1.validate()
then:
!c1?.errors['name']
}
26. Tests sobre clases de dominio en Grails
def"Siladescripcióneslacadenavacía,estecamponodaráproblemas"(){
given:
defc1=newCategory(description:"")
when:
c1.validate()
then:
!c1?.errors['description']
}
27. Tests sobre clases de dominio en Grails
def"Ladescripcióndelacategoríapuedesernull"(){
given:
defc1=newCategory(description:null)
when:
c1.validate()
then:
!c1?.errors['description']
}
28. Tests sobre clases de dominio en Grails
@Unroll
def"Siladescripcióntienemenosde1001caracteres,nodaráproblemas"(){
given:
defc1=newCategory(description:"a"*characters)
when:
c1.validate()
then:
!c1?.errors['description']
where:
characters<<[0,1,999,1000]
}
29. Tests sobre clases de dominio en Grails
@Unroll
def"Siladescripcióntienemás1000caracteres,daráproblemas"(){
given:
defc1=newCategory(description:"a"*characters)
when:
c1.validate()
then:
c1?.errors['description']
where:
characters<<[1001,1002]
}
30. Tests sobre clases de dominio en Grails
def"LainstanciadeCategoríadevuelvesunombrepordefecto"(){
expect:
newCategory(name:"Thecategoryname").toString()=="Thecategoryname"
}
31. pto. Ciencia de la Computación e I.A. Sesión 6
Tests sobre controladores en Grails
packagees.ua.expertojava.todo
importgrails.test.mixin.*
importspock.lang.*
@TestFor(CategoryController)
@Mock(Category)
classCategoryControllerSpecextendsSpecification{
defpopulateValidParams(params){
assertparams!=null
//TODO:Populatevalidpropertieslike...
//params["name"]='someValidName'
}
...
32. Tests sobre controladores en Grails
defpopulateValidParams(params){
assertparams!=null
params["name"]='Categoryname'
}
41. A tener en cuenta
Variables inyectadas: controller, model, view, response,
request y flash
Anotación @Mock
Ejecutar controller.method()
Variable model para comprobar el modelo devuelto
Redirecciones con response.redirectedUrl
42. Tests sobre librerías de etiquetas, vistas y
plantillas
defincludeJs={attrs->
out<<"<scriptsrc="scripts/${attrs['script']}.js"></script>"
}
43. Tests sobre librerías de etiquetas, vistas y
plantillas
void"LaetiquetaincludeJsdevuelveunareferenciaalalibreríajavascriptpasadaporparámetro"(){
expect:
applyTemplate('<todo:includejsscript=""></todo:includejs>')=="<scriptsrc="scripts/.js"
applyTemplate('<todo:includejsscript="myfile"></todo:includejs>')=="<scriptsrc="scripts/myf
}
50. A tener en cuenta
Mockeamos la librería AssetsTagLib
Indicamos cuantas interacciones se van a producir con
nuestro objecto mockeado
Utilizamos placeholder para los parámetros
54. Algunas anotaciones interesantes
@IgnoreIf
sys, un mapa con todas las propiedades del sistema
env, un mapa con todas las variables de entorno
os, información acerca del sistema operativo
jvm, información sobre la máquina virtual de Java