spock framework
DESCRIPTION
Introdução ao framework dinâmico para testar aplicações Java e/ou Groovy.TRANSCRIPT
Spock FrameworkParte 1
Ismael Soares
Spock é um framework de testes para aplicações Java
e Groovy.
Diferenciais
JUnitCódigo bonito
Fácil de aprenderAltamente expressivo
Utiliza recursos da linguagem Groovy
Quem Usa?
GradleGrails
+++
import spock.lang.*
class HelloSpock extends spock.lang.Specification {
def "length of Spock's and his friends' names"() { expect: name.size() == length
where: name | length "Spock“ | 5 "Kirk" | 4 "Scotty" | 6 }}
Exemplo
// Executado antes de cada métododef setup() {}
// Executado depois de cada método def cleanup() {}
// Executado antes do primeiro métododef setupSpec() {}
// Executado após o último métododef cleanupSpec() {}
Ciclo de vida
1. Configura os recursos necessários para o teste.
1. Proporciona o estímulo para o teste
1. Descreve as respostas esperadas
1. Limpa os recursos utilizados no teste.
Fases
Blocos e fases
setup/given: // criar fixtures
when: // estímulos
then && and: // respostas
cleanup: // limpar fixtures
Fases
when:”incluir um elemento na pilha”pilha.push(elemento)
then:”ela não pode ficar vazia”!pilha.emptypilha.size() == 1 and:”deve conter o elemento incluído”pilha.peek() == elemento
Exemplo
Condition not satisfied:
pilha.size() == 2| | | | 1 false[push me]
Resultado
when:”retirar os elementos de pilha vazia”pilha.pop()
then:”deve retornar Exception”def e = thrown(EmptyStackException)e.message == ‘bla’stack.empty
Exception
def "HashMap accepts null key"() { given:“um mapa” def map = new HashMap() when:”incluir um elemento com a chave null” map.put(null, "elem") then:”não deve retornar exception” notThrown(NullPointerException)}
Exception
def "events are published to all subscribers"() { setup:
def subscriber1 = Mock(Subscriber) def subscriber2 = Mock(Subscriber) def publisher = new Publisher() publisher.add(subscriber1) publisher.add(subscriber2) when: publisher.fire("event") then: 1 * subscriber1.receive("event") 1 * subscriber2.receive("event") //Alternativa (qualquer mock) 2 * _.receive("event")}
Interações
// Globalsetup:subscriber.isAlive() >> true
// Localwhen: publisher.send(event)then: 1 * subscriber.receive(event) //Válido para o que está acima
//Opicionalthen: subscriber.isAlive() >> true
//Obrigatóriothen: 1 * subscriber.isAlive() >> truethen: n * subscriber.receive(event)
//Cardinalidadesn * subscriber.receive(event) // exatamente n vezes(n.._) * subscriber.receive(event) // as vezes pelo menos n vezes(_..n) * subscriber.receive(event) // no máximo n vezes
//Regexsubscriber./set.*/(_) // qualquer setter que for chamado do subscriber
Interações
// sem argumentos subscriber.receive()
// qualquer argumentosubscriber.receive(_)
// qualquer argumento não nulo subscriber.receive(!null)
// argumento específicosubscriber.receive(event)
// qualquer argumento diferente do específico subscriber.receive(!event)
// qualquer argumento do tipo Message (não nulo)subscriber.receive(_ as Message)
// constraint customizada subscriber.receive( { it.priority >= 5 } )
Restrições de Argumentos
Para métodos que usam vários argumentos
// qualquer três argumentos mock.foo(_, _, _)
// qualquer argumento no primeiro, não nulo no segundo e no terceiro, uma regexmock.foo(_, !null, { it ==~ /a*b/ })
// restrições para varargs podem ser especificadas em estilo de lista ou estilo vararg: def foo(String... args)
// estilo lista mock.foo(["one", "two"])
// estilo varargmock.foo("one", "two")
Na próxima apresentação...Na próxima apresentação...
Valores de retornoVerificações ordenadas
Bloco ExpectBloco CleanupBloco Where
Métodos HelperSpock Vs JUnit
ReferênciaReferência
http://code.google.com/p/spock/
ObrigadoObrigado