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

More Related Content

What's hot

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

What's hot (12)

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

Viewers also liked

Westrich spock-assets-gum
Westrich spock-assets-gumWestrich spock-assets-gum
Westrich spock-assets-gum
Brian Westrich
 
TDD with Spock @xpdays_ua
TDD with Spock @xpdays_uaTDD with Spock @xpdays_ua
TDD with Spock @xpdays_ua
Izzet Mustafaiev
 
Taming Functional Web Testing with Spock and Geb
Taming Functional Web Testing with Spock and GebTaming Functional Web Testing with Spock and Geb
Taming Functional Web Testing with Spock and Geb
C4Media
 
Smarter Testing With Spock
Smarter Testing With SpockSmarter Testing With Spock
Smarter Testing With Spock
IT Weekend
 
Spock framework
Spock frameworkSpock framework
Spock framework
Djair Carvalho
 
Geb with spock
Geb with spockGeb with spock
Geb with spock
Monika Gurram
 
Testing a 2D Platformer with Spock
Testing a 2D Platformer with SpockTesting a 2D Platformer with Spock
Testing a 2D Platformer with Spock
Alexander Tarlinder
 
Fabulous Tests on Spock and Groovy
Fabulous Tests on Spock and GroovyFabulous Tests on Spock and Groovy
Fabulous Tests on Spock and Groovy
Yaroslav Pernerovsky
 
Spock Extensions Anatomy
Spock Extensions AnatomySpock Extensions Anatomy
Spock Extensions Anatomy
Evgeny Goldin
 

Viewers also liked (9)

Westrich spock-assets-gum
Westrich spock-assets-gumWestrich spock-assets-gum
Westrich spock-assets-gum
 
TDD with Spock @xpdays_ua
TDD with Spock @xpdays_uaTDD with Spock @xpdays_ua
TDD with Spock @xpdays_ua
 
Taming Functional Web Testing with Spock and Geb
Taming Functional Web Testing with Spock and GebTaming Functional Web Testing with Spock and Geb
Taming Functional Web Testing with Spock and Geb
 
Smarter Testing With Spock
Smarter Testing With SpockSmarter Testing With Spock
Smarter Testing With Spock
 
Spock framework
Spock frameworkSpock framework
Spock framework
 
Geb with spock
Geb with spockGeb with spock
Geb with spock
 
Testing a 2D Platformer with Spock
Testing a 2D Platformer with SpockTesting a 2D Platformer with Spock
Testing a 2D Platformer with Spock
 
Fabulous Tests on Spock and Groovy
Fabulous Tests on Spock and GroovyFabulous Tests on Spock and Groovy
Fabulous Tests on Spock and Groovy
 
Spock Extensions Anatomy
Spock Extensions AnatomySpock Extensions Anatomy
Spock Extensions Anatomy
 

Similar to Spock - the next stage of unit testing

Тестируй это / Виктор Русакович (GP Solutions)
Тестируй это / Виктор Русакович (GP Solutions)Тестируй это / Виктор Русакович (GP Solutions)
Тестируй это / Виктор Русакович (GP Solutions)
Ontico
 
Тестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и SeleniumТестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и Selenium
SQALab
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
Омские ИТ-субботники
 
Javascript testing
Javascript testingJavascript testing
Javascript testingTCS bank
 
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Javakranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в JavaKrivoy Rog IT Community
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Ontico
 
Как сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрееКак сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрее
Roman Dvornov
 
Do you know what you are testing?
Do you know what you are testing?Do you know what you are testing?
Do you know what you are testing?
Mikalai Alimenkou
 
А вы знаете что тестируют ваши тесты?
А вы знаете что тестируют ваши тесты?А вы знаете что тестируют ваши тесты?
А вы знаете что тестируют ваши тесты?
SQALab
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
RAMBLER&Co
 
CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...
CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...
CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...CodeFest
 
The fast and the continuous - SQA Days 16
The fast and the continuous - SQA Days 16The fast and the continuous - SQA Days 16
The fast and the continuous - SQA Days 16
Andrei Solntsev
 
The fast and the continuous
The fast and the continuousThe fast and the continuous
The fast and the continuous
SQALab
 
Testing RIA with Selenium
Testing RIA with SeleniumTesting RIA with Selenium
Testing RIA with Selenium
Sergey Shvets
 
Марина Широчкина - Тестирование
Марина Широчкина - ТестированиеМарина Широчкина - Тестирование
Марина Широчкина - Тестирование
Yandex
 
10_tips_for_become_qa
10_tips_for_become_qa10_tips_for_become_qa
10_tips_for_become_qa
SoftengiTrainingCenter
 
Марина Широчкина — «Тестирование»
Марина Широчкина — «Тестирование»Марина Широчкина — «Тестирование»
Марина Широчкина — «Тестирование»Yandex
 
SQA Days 10: Фишки просветлённых тест-менеджеров
SQA Days 10: Фишки просветлённых тест-менеджеровSQA Days 10: Фишки просветлённых тест-менеджеров
SQA Days 10: Фишки просветлённых тест-менеджеров
Natalya Rukol
 
Полезные "фишки" для построения успешного процесса тестирования
Полезные "фишки" для построения успешного процесса тестированияПолезные "фишки" для построения успешного процесса тестирования
Полезные "фишки" для построения успешного процесса тестирования
SQALab
 
Нагрузочное тестирование с помощью Яндекс.Танка
Нагрузочное тестирование с помощью Яндекс.ТанкаНагрузочное тестирование с помощью Яндекс.Танка
Нагрузочное тестирование с помощью Яндекс.ТанкаAleksandr Boichenko
 

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

Тестируй это / Виктор Русакович (GP Solutions)
Тестируй это / Виктор Русакович (GP Solutions)Тестируй это / Виктор Русакович (GP Solutions)
Тестируй это / Виктор Русакович (GP Solutions)
 
Тестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и SeleniumТестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и Selenium
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
Javascript testing
Javascript testingJavascript testing
Javascript testing
 
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Javakranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
 
Как сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрееКак сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрее
 
Do you know what you are testing?
Do you know what you are testing?Do you know what you are testing?
Do you know what you are testing?
 
А вы знаете что тестируют ваши тесты?
А вы знаете что тестируют ваши тесты?А вы знаете что тестируют ваши тесты?
А вы знаете что тестируют ваши тесты?
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
 
CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...
CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...
CodeFest 2012. Родионов А. — Тестирование Ruby (on Rails) приложений: стек, п...
 
The fast and the continuous - SQA Days 16
The fast and the continuous - SQA Days 16The fast and the continuous - SQA Days 16
The fast and the continuous - SQA Days 16
 
The fast and the continuous
The fast and the continuousThe fast and the continuous
The fast and the continuous
 
Testing RIA with Selenium
Testing RIA with SeleniumTesting RIA with Selenium
Testing RIA with Selenium
 
Марина Широчкина - Тестирование
Марина Широчкина - ТестированиеМарина Широчкина - Тестирование
Марина Широчкина - Тестирование
 
10_tips_for_become_qa
10_tips_for_become_qa10_tips_for_become_qa
10_tips_for_become_qa
 
Марина Широчкина — «Тестирование»
Марина Широчкина — «Тестирование»Марина Широчкина — «Тестирование»
Марина Широчкина — «Тестирование»
 
SQA Days 10: Фишки просветлённых тест-менеджеров
SQA Days 10: Фишки просветлённых тест-менеджеровSQA Days 10: Фишки просветлённых тест-менеджеров
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
  • 24.
  • 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
  • 44.
  • 45. Rules
  • 46.
  • 48. Resource ● http://spockframework.org ● http://webconsole.spockframework.org ● Java Testing with Spock by Konstantinos Kapelonis (https://manning.com/books/java-testing-with-spock)