SlideShare a Scribd company logo
Spock
The 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 test
public 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 test
classicStatesShouldUseGameRules(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 - the next stage of unit testing
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 example
def "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 example
import 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 example
def "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 tv
basket.checkout(customer)
then: "connection is always closed at the end"
1 * creditCardSevice.shutdown()
}
Why?
● Совместим с JUnit
● Легко попробовать - http://webconsole.spockframework.org
● “Выразительная” конструкция построения теста - Given-When-Then
● Понятные сообщения об ошибках
● Возможность тестирования взаимодействий через моки
● Простота тестирования с использованием наборов данных
Data Driven example
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
}
}
Demo
Spock - the next stage of unit testing
Rules
Spock - the next stage of unit testing
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

More Related Content

PDF
Curse of spring boot test [VRN]
PDF
Spring Boot Test horror
PPTX
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
PDF
10M tests per day
PDF
QA Fest 2017. Яна Кокряшкина. Интеграция автоматизированных тестов с инструме...
PDF
Curse of spring boot test
PDF
BDD girls Battle: Cucumber VS. JBehave
PDF
Selenium grid on-demand
Curse of spring boot test [VRN]
Spring Boot Test horror
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
10M tests per day
QA Fest 2017. Яна Кокряшкина. Интеграция автоматизированных тестов с инструме...
Curse of spring boot test
BDD girls Battle: Cucumber VS. JBehave
Selenium grid on-demand

What's hot (12)

PDF
QA Fest 2019. Андрей Солнцев. Десять причин моей ненависти
PPTX
Selenium, а давай подождем?
PPTX
Automation testing desktop applications
PPTX
Speeding up UI tests, profiling of UI tests
PDF
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
PDF
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
PPTX
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
PPTX
Оценка качества автотестов
PPT
Let's Talk About Junit 5
PPTX
Python Meetup
PPTX
Seamy side of autotests
PDF
Евгений Гончаров (Россия, Казахстан). Автоматизация рутины AD
QA Fest 2019. Андрей Солнцев. Десять причин моей ненависти
Selenium, а давай подождем?
Automation testing desktop applications
Speeding up UI tests, profiling of UI tests
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
Оценка качества автотестов
Let's Talk About Junit 5
Python Meetup
Seamy side of autotests
Евгений Гончаров (Россия, Казахстан). Автоматизация рутины AD
Ad

Viewers also liked (9)

PPTX
Westrich spock-assets-gum
PDF
TDD with Spock @xpdays_ua
PDF
Taming Functional Web Testing with Spock and Geb
PPTX
Smarter Testing With Spock
PDF
Spock framework
PPTX
Geb with spock
PDF
Testing a 2D Platformer with Spock
ODP
Fabulous Tests on Spock and Groovy
PDF
Spock Extensions Anatomy
Westrich spock-assets-gum
TDD with Spock @xpdays_ua
Taming Functional Web Testing with Spock and Geb
Smarter Testing With Spock
Spock framework
Geb with spock
Testing a 2D Platformer with Spock
Fabulous Tests on Spock and Groovy
Spock Extensions Anatomy
Ad

Similar to Spock - the next stage of unit testing (20)

PDF
Тестируй это / Виктор Русакович (GP Solutions)
PPTX
Тестирование отклика Web-интерфейса с JMeter и Selenium
PDF
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
PDF
Javascript testing
PDF
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
PDF
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
PDF
Как сделать ваш JavaScript быстрее
PPTX
Do you know what you are testing?
PPTX
А вы знаете что тестируют ваши тесты?
PDF
RDSDataSource: Promises
PPTX
CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...
ODP
The fast and the continuous - SQA Days 16
ODP
The fast and the continuous
KEY
Testing RIA with Selenium
PDF
Марина Широчкина - Тестирование
PDF
10_tips_for_become_qa
PDF
Марина Широчкина — «Тестирование»
PPTX
SQA Days 10: Фишки просветлённых тест-менеджеров
PPTX
Полезные "фишки" для построения успешного процесса тестирования
PDF
Нагрузочное тестирование с помощью Яндекс.Танка
Тестируй это / Виктор Русакович (GP Solutions)
Тестирование отклика Web-интерфейса с JMeter и Selenium
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
Javascript testing
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее
Do you know what you are testing?
А вы знаете что тестируют ваши тесты?
RDSDataSource: Promises
CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...
The fast and the continuous - SQA Days 16
The fast and the continuous
Testing RIA with Selenium
Марина Широчкина - Тестирование
10_tips_for_become_qa
Марина Широчкина — «Тестирование»
SQA Days 10: Фишки просветлённых тест-менеджеров
Полезные "фишки" для построения успешного процесса тестирования
Нагрузочное тестирование с помощью Яндекс.Танка

Spock - the next stage of unit testing

  • 1. Spock The next state of Unit testing
  • 10. Agenda ● Unit testing ● What is Spock ● Why
  • 11. Agenda ● Unit testing ● What is Spock ● Why ● Demo
  • 12. Agenda ● Unit testing ● What is Spock ● Why ● Demo ● Q&A
  • 15. Main thoughts ● Проверяем соответствие требованиям
  • 16. Main thoughts ● Проверяем соответствие требованиям ● Делаем быстро и точечно
  • 17. Main thoughts ● Проверяем соответствие требованиям ● Делаем быстро и точечно ● Находим проблемы на раннем этапе
  • 18. Main thoughts ● Проверяем соответствие требованиям ● Делаем быстро и точечно ● Находим проблемы на раннем этапе ● Проверяем, что ничего не сломали при изменении
  • 19. Main thoughts ● Проверяем соответствие требованиям ● Делаем быстро и точечно ● Находим проблемы на раннем этапе ● Проверяем, что ничего не сломали при изменении ● Строим дизайн системы
  • 20. Main thoughts ● Проверяем соответствие требованиям ● Делаем быстро и точечно ● Находим проблемы на раннем этапе ● Проверяем, что ничего не сломали при изменении ● Строим дизайн системы ● Документируем поведение системы
  • 22. Typical Java Unit test public 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)); } }
  • 23. Typical Java Unit test classicStatesShouldUseGameRules(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
  • 25. Spock
  • 27. What is? ● Начат в 2008 году
  • 28. What is? ● Начат в 2008 году ● Создан Peter Niederweiser и поддерживается Luke Daley и сообществом
  • 29. What is? ● Начат в 2008 году ● Создан Peter Niederweiser и поддерживается Luke Daley и сообществом ● Разработан с использованием Groovy
  • 30. What is? ● Начат в 2008 году ● Создан Peter Niederweiser и поддерживается Luke Daley и сообществом ● Разработан с использованием Groovy ● Базируется на идеях JUnit, jMock, Mockito, RSpec, JUnitParameters и Start Trek
  • 31. What is? ● Начат в 2008 году ● Создан Peter Niederweiser и поддерживается Luke Daley и сообществом ● Разработан с использованием Groovy ● Базируется на идеях JUnit, jMock, Mockito, RSpec, JUnitParameters и Start Trek ● Первый “мажорный” релиз выпущен в 2015 году
  • 32. Why?
  • 34. Why? ● Совместим с JUnit ● Легко попробовать - http://webconsole.spockframework.org
  • 35. Why? ● Совместим с JUnit ● Легко попробовать - http://webconsole.spockframework.org ● “Выразительная” конструкция построения теста - Given-When-Then
  • 36. Given-When-Then example def "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 }
  • 37. Why? ● Совместим с JUnit ● Легко попробовать - http://webconsole.spockframework.org ● “Выразительная” конструкция построения теста - Given-When-Then ● Понятные сообщения об ошибках
  • 38. Informative message example import 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)
  • 39. Why? ● Совместим с JUnit ● Легко попробовать - http://webconsole.spockframework.org ● “Выразительная” конструкция построения теста - Given-When-Then ● Понятные сообщения об ошибках ● Возможность тестирования взаимодействий через моки
  • 40. Interaction testing example def "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 tv basket.checkout(customer) then: "connection is always closed at the end" 1 * creditCardSevice.shutdown() }
  • 41. Why? ● Совместим с JUnit ● Легко попробовать - http://webconsole.spockframework.org ● “Выразительная” конструкция построения теста - Given-When-Then ● Понятные сообщения об ошибках ● Возможность тестирования взаимодействий через моки ● Простота тестирования с использованием наборов данных
  • 42. Data Driven example 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 } }
  • 43. Demo
  • 45. Rules
  • 48. Resource ● http://spockframework.org ● http://webconsole.spockframework.org ● Java Testing with Spock by Konstantinos Kapelonis (https://manning.com/books/java-testing-with-spock)