Date post: | 13-Apr-2017 |
Category: |
Software |
Upload: | jugkaraganda |
View: | 118 times |
Download: | 0 times |
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