Spock als Test Framework

Spock is een Open Source framework om tests en ‘specifications’ in Groovy te schrijven. Hierdoor is het ook geschikt om (o.a.) voor Java applicatiesgebruikt te worden. Spock is opgezet met al bewezen frameworks en technologieën in het achterhoofd; JUnit, jMock, Mockito, RSpec, Groovy en Scala bijvoorbeeld. Het doel wat de makers voor ogen hadden was een framework te creëren wat lichtgewicht was in gebruik, maar krachtig in mogelijkheden, geschikt om BDD-style tests te schrijven. De tests geschreven met Spock worden dan ook specifications genoemd, ze dienen als specificatie van de code onder test. Spock specificaties zijn compatibel met JUnit, hierdoor is de setup van Spock in een (bestaand) project een stuk eenvoudiger als die van zwaardere frameworks. Doordat de specificaties zijn geschreven in Groovy is er ook minder boiler plate code nodig is om tot de kern van de test door te dringen.

Hieronder staat een voorbeeld van een simpele geparameteriseerde specification welke gebruik maakt van de expect/where opzet. Voor elke waarde van name wordt de expectation gevalideerd. Zolang je assertions doet binnen de method (dus geen gedelegeerde method of class) hoef je geen gebruik te maken van speciale keywords, een expressie die naar een boolean evalueert is voldoende. true betekent dat de assertion succesvol is, false resulteert in een assertion failure. Als je assertions wil hergebruiken in een aparte method of class, en ze zo buiten de test method brengt, zul je voor elke expressie wel weer het ‘assert’ keyword moeten plaatsen.

class HelloSpockSpec 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

   }

}

Als ik nu de length voor “Scotty” wijzig naar 9, dan resulteert dit in onderstaande assertion failure. Zoals te zien is, wordt duidelijk weergegeven wat waardes van variabelen en expressies op welk punt zijn. Dit is met name bij complexere assertions nuttig, daarnaast leest het ook prettig.

HelloSpockSpec

– length of Spock's and his friends' names   FAILED

Condition not satisfied:

   name.size() == length

   |    |      |  |

   |    6      |  9

   Scotty      false

   at HelloSpockSpec.length of Spock's and his friends' names(Script1.groovy:4)

Nu een voorbeeld waar gebruik wordt gemaakt van de given/when/then opzet. De code onder test wordt in de juiste uitgangsstate gebracht, er wordt een (te verifiëren) actie uitgevoerd, en er wordt een check gedaan of het gespecificeerde gedrag zich heeft voorgedaan. In de eerste case is ook zichtbaar hoe je simpel met Spock assertions op gegooide exceptions kan uitvoeren.

class AccountSpec extends spock.lang.Specification {

   def "can't withdraw a negative amount"() {

       given:

           def account = new Account(5.0)

       when:

           account.withdraw(-1.0)

       then:

           NegativeAmountWithdrawnException e = thrown()

           e.amount == –1.0

   }

   def "withdrawing some amount decreases the balance by exactly that amount"() {

       def account = new Account(5.0)

       when:

           account.withdraw(2.0)

       then:

           account.balance == old(account.balance) – 2.0

   }

}

Deze voorbeelden zijn natuurlijk vrij simpel en illustratief. Hier wordt Spock gebruikt in een “klassieke” Unit test, maar Spock kan bijv. ook gebruikt wordt om volledige integratie tests uit te voeren van een applicatie, waardoor je meer in de sferen van frameworks als JBehave en Cucumber terecht komt. Indien je ook een front end applicatie hebt die je wil meetesten kun je bijvoorveeld ook weer gebruik maken van Spock in combinatie met Geb, een “Spockish” wrapper om Selenium.

De ervaring leert dat Spock je het mogelijk maakt om weer met plezier te werken aan je tests en integratietests. Je hebt veel meer tijd (en energie) te besteden aan hetgeen je wil testen in plaats van veel energie te moeten steken in het opzetten van een framework of zelfs test case. Het gebruik van Groovy helpt hier bij, terwijl de syntax en het gebruik ook weer niet spectaculair anders zijn dan bij “Plain Old Java”, waardoor de drempel om eens met Spock aan de slag te gaan vrij laag is.

Als je nu meteen al eens wat wil spelen met Spock, dan kan dat! Hiervoor heeft de community een web console in het leven geroepen. Hier kun je direct specifications bekijken, bewerken en draaien (met syntax highlighting). Het web console is hier te vinden : https://meetspock.appspot.com/ . Daarnaast is er ook een compleet klaargestoomd voorbeeld project mocht je op je eigen computer aan de slag willen, dit werkt direct als je gebruik maakt van Ant, Gradle of Maven: https://github.com/spockframework/spock-example

Hieronder staan een aantal andere links met meer informatie en documentatie:

Leave a Reply

Your email address will not be published. Required fields are marked *