Upload
software-guru
View
2.154
Download
3
Embed Size (px)
DESCRIPTION
Para muchos escribir codigo de pruebas resulta tan gratificante como asistir al dentista un Lunes de madrugada. JUnit es ampliamente conocido en la industria sin embargo su utilizacion o buen uso no lo son. ¿Qué se puede hacer al respecto para remediar este embrollo? Permitanme presentarles a Spock, un proyecto revolucionario diseñado especificamente para facilitar la escritura de codigo de pruebas. Durante la sesion conoceremos los fundamentos para realizar pruebas efectivas con Spock, asi como tambien una comparativa entre las caracteristicas de JUnit y Spock. Se recomienda tener conocimientos basicos del lenguage Groovy, pero este no es un requisito indispensable.
Citation preview
Escribiendo Pruebas con Spock
www.canoo.com 2
¿Y quién es éste tipo?
๏ Desarrollador desde el inicio (1995 y contando …)
๏ Creyente fiel del Código Abierto y Libre
๏ Miembro del equipo
๏ Líder del proyecto
๏ Actualmente trabajando con
www.canoo.com
Que es spock?
Donde, Quien, Como?
■ http://spockframework.org
■ Peter Niederwiser @pniederw
■ Lenguage para pruebas basado en Groovy
■ Manipulacion de codigo byte en tiempo de compilacion
■ Inspirado en JUnit, Rspec, jMock, Mockito, Groovy, Scala y Vulcans
3
Porque?
■ Mayor expresividad
■ Facil de aprender
■ Use multivariado (unitario a funcional)
■ Potencializa la la sintaxis idiomatica de Groovy
■ Compatible con Junit, IDEs, CI.
■ Extendible via plugins
www.canoo.com 4
Primeras impresiones import spock.lang.Specification class HelloSpec extends Specification { def "length of Spock's and his friends' names"() { expect: name.size() == length where: name | length "Spock" | 5 "Kirk" | 4 "Scotty" | 6 } }
www.canoo.com 5
Introduciendo un defecto import spock.lang.Specification class HelloSpec extends Specification { def "length of Spock's and his friends' names"() { expect: name.size() == length where: name | length "Spock" | 5 "Kirk" | 4 "Scotty" | 7 } } !
www.canoo.com 6
A wild error appears!
Condition not satisfied: name.size() == length | | | | | 6 | 7 Scotty false <Click to see difference> at HelloSpec.length of Spock's and his friends' names(HelloSpec.groovy:5)
www.canoo.com
Caracteristicas (1)
Bloques
■ given: precondiciones, inicializacion de datos, etc.
■ when: acciones que producen un resultado
■ then: verificacion de expectativas
■ expect: alternativa corta a when: y then:
■ where: aplica entradas de datos varias
■ and: sub-dividide (y enlaza) bloques
■ setup: otro nombre para given:
■ cleanup: post condiciones, limpieza de recursos, etc.
7
www.canoo.com
Caracteristicas (2)
Ciclo de Vida
■ setup
■ cleanup
■ setupSpec
■ cleanupSpec
8
Dirigido por Datos
■ Variables ligadas a Listas
■ Variables ligadas a Tablas
■ @Unroll
■ @Shared
www.canoo.com 9
Unrolling
import spock.lang.Specification import spock.lang.Unroll @Unroll class HelloSpec extends Specification { def "Length of #name should be #name.size(), value is #length"() { expect: name.size() == length where: name | length "Spock" | 5 "Kirk" | 4 "Scotty" | 6 } }
www.canoo.com
Unrolling visto por un IDE
10
www.canoo.com 11
Interactiones (Mocks) import spock.lang.Specification import java.beans.PropertyChangeListener class Model { @groovy.beans.Bindable String name } class BindableSpec extends Specification { def "Model properties are observable"() { given: def model = new Model() def listener = Mock(PropertyChangeListener) when: model.addPropertyChangeListener(listener) model.name = 'Groovy' model.name = 'Java' then: 1 * listener.propertyChange({it.newValue == 'Groovy'}) 1 * listener.propertyChange({it.newValue == 'Java'}) } }
www.canoo.com
Espere, aun hay mas!
■ http://docs.spockframework.org/en/latest/
■ Spock es extendible via plugins
■ Pruebas funcionales para aplicaciones web con GEB
■ Plugins para Grails y Griffon
■ Siguiente liberacion sera el codiciado 1.0.0
12
Gracias!
twitter: @aalmiray