Spock - the next stage of unit testing

Preview:

Citation preview

SpockThe next state of Unit testing

About me

About me

About me

5+ years

About me

5+ years

Disclaimer

Agenda

Agenda● Unit testing

Agenda● Unit testing● What is Spock

Agenda● Unit testing● What is Spock● Why

Agenda● Unit testing● What is Spock● Why● Demo

Agenda● Unit testing● What is Spock● Why● Demo● Q&A

Unit Testing

Main thoughts

Main thoughts● Проверяем соответствие требованиям

Main thoughts● Проверяем соответствие требованиям● Делаем быстро и точечно

Main thoughts● Проверяем соответствие требованиям● Делаем быстро и точечно● Находим проблемы на раннем этапе

Main thoughts● Проверяем соответствие требованиям● Делаем быстро и точечно● Находим проблемы на раннем этапе● Проверяем, что ничего не сломали при

изменении

Main thoughts● Проверяем соответствие требованиям● Делаем быстро и точечно● Находим проблемы на раннем этапе● Проверяем, что ничего не сломали при

изменении● Строим дизайн системы

Main thoughts● Проверяем соответствие требованиям● Делаем быстро и точечно● Находим проблемы на раннем этапе● Проверяем, что ничего не сломали при

изменении● Строим дизайн системы● Документируем поведение системы

Typical Java Unit test

Typical Java Unit testpublic class JUnitClassicStateResolverSpec {

@Test public void classicStatesShouldUseGameRules() {

StateResolver scissorsResolver = new ScissorsStateResolver(); StateResolver rockResolver = new RockStateResolver(); StateResolver paperResolver = new PaperStateResolver();

assertEquals(false, scissorsResolver.tryToBeat(State.SPOCK)); assertEquals(true, scissorsResolver.tryToBeat(State.LIZARD)); assertEquals(true, scissorsResolver.tryToBeat(State.OUT)); assertEquals(true, scissorsResolver.tryToBeat(State.PAPER)); assertEquals(false, scissorsResolver.tryToBeat(State.ROCK)); assertEquals(false, scissorsResolver.tryToBeat(State.SCISSORS));

assertEquals(false, rockResolver.tryToBeat(State.SPOCK)); assertEquals(false, rockResolver.tryToBeat(State.LIZARD)); assertEquals(true, rockResolver.tryToBeat(State.OUT)); assertEquals(false, rockResolver.tryToBeat(State.PAPER)); assertEquals(false, rockResolver.tryToBeat(State.ROCK)); assertEquals(true, rockResolver.tryToBeat(State.SCISSORS));

assertEquals(true, paperResolver.tryToBeat(State.SPOCK)); assertEquals(false, paperResolver.tryToBeat(State.LIZARD)); assertEquals(true, paperResolver.tryToBeat(State.OUT)); assertEquals(false, paperResolver.tryToBeat(State.PAPER)); assertEquals(true, paperResolver.tryToBeat(State.ROCK)); assertEquals(false, paperResolver.tryToBeat(State.SCISSORS));

}}

Typical Java Unit testclassicStatesShouldUseGameRules(net.astanajug.meetup.spock.JUnitClassicStateResolverSpec) Time elapsed: 0.003 sec <<< FAILURE!java.lang.AssertionError: expected:<false> but was:<true> at org.junit.Assert.fail(Assert.java:88) at org.junit.Assert.failNotEquals(Assert.java:834) at org.junit.Assert.assertEquals(Assert.java:118) at org.junit.Assert.assertEquals(Assert.java:144) at net.astanajug.meetup.spock.JUnitClassicStateResolverSpec.classicStatesShouldUseGameRules(JUnitClassicStateResolverSpec.java:27) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)+100500 stack trace lines at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350) at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021)+100500 stack trace lines

Spock

What is?

What is?● Начат в 2008 году

What is?● Начат в 2008 году

● Создан Peter Niederweiser и поддерживается Luke Daley и сообществом

What is?● Начат в 2008 году

● Создан Peter Niederweiser и поддерживается Luke Daley и сообществом

● Разработан с использованием Groovy

What is?● Начат в 2008 году

● Создан Peter Niederweiser и поддерживается Luke Daley и сообществом

● Разработан с использованием Groovy

● Базируется на идеях JUnit, jMock, Mockito, RSpec, JUnitParameters и Start Trek

What is?● Начат в 2008 году

● Создан Peter Niederweiser и поддерживается Luke Daley и сообществом

● Разработан с использованием Groovy

● Базируется на идеях JUnit, jMock, Mockito, RSpec, JUnitParameters и Start Trek

● Первый “мажорный” релиз выпущен в 2015 году

Why?

Why?●Совместим с JUnit

Why?●Совместим с JUnit

●Легко попробовать - http://webconsole.spockframework.org

Why?●Совместим с JUnit

●Легко попробовать - http://webconsole.spockframework.org

●“Выразительная” конструкция построения теста - Given-When-Then

Given-When-Then exampledef "A basket with one product has equal weight"() { given: "an empty basket and a TV" Product tv = new Product(name:"bravia",price:1200,weight:18) Basket basket = new Basket() when: "user wants to buy the TV" basket.addProduct(tv) then: "basket weight is equal to the TV" basket.currentWeight == tv.weight }

Why?●Совместим с JUnit

●Легко попробовать - http://webconsole.spockframework.org

●“Выразительная” конструкция построения теста - Given-When-Then

●Понятные сообщения об ошибках

Informative message exampleimport spock.lang.*

class MyFirstSpec extends Specification { def "let's try this!"() { expect: Math.max(1, 2) == 3 }}

MyFirstSpec - let's try this! FAILED Condition not satisfied: Math.max(1, 2) == 3 | | 2 false at MyFirstSpec.let's try this!(Script1.groovy:7)

Why?●Совместим с JUnit

●Легко попробовать - http://webconsole.spockframework.org

●“Выразительная” конструкция построения теста - Given-When-Then

●Понятные сообщения об ошибках

●Возможность тестирования взаимодействий через моки

Interaction testing exampledef "credit card connection is always closed down"() {

given: "a basket, a customer and a TV"Product tv = new Product(name:"bravia",price:1200,weight:18)BillableBasket basket = new BillableBasket()Customer customer = new Customer(...)

and: "a credit card service"CreditCardProcessor creditCardSevice = Mock(CreditCardProcessor)basket.setCreditCardProcessor(creditCardSevice)

when: "user checks out the tv"basket.addProduct tvbasket.checkout(customer)

then: "connection is always closed at the end"1 * creditCardSevice.shutdown()

}

Why?●Совместим с JUnit

●Легко попробовать - http://webconsole.spockframework.org

●“Выразительная” конструкция построения теста - Given-When-Then

●Понятные сообщения об ошибках

●Возможность тестирования взаимодействий через моки

●Простота тестирования с использованием наборов данных

Data Driven exampleclass 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 }}

Demo

Rules

Resources

Resource●http://spockframework.org

●http://webconsole.spockframework.org

●Java Testing with Spock by Konstantinos Kapelonis (https://manning.com/books/java-testing-with-spock)

Questions & Answers