13
Escribiendo Pruebas con Spock

Spock

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

Page 1: Spock

Escribiendo Pruebas con Spock

Page 2: 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

Page 3: Spock

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

Page 4: Spock

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 } }

Page 5: Spock

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 } } !

Page 6: Spock

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)

Page 7: Spock

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

Page 8: Spock

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

Page 9: Spock

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 } }

Page 10: Spock

www.canoo.com

Unrolling visto por un IDE

10

Page 11: Spock

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'}) } }

Page 12: Spock

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

Page 13: Spock

Gracias!

twitter: @aalmiray