Suche senden
Hochladen
Spocktacular Testing
•
0 gefällt mir
•
817 views
Russel Winder
Folgen
Slides from my JAXLondon 2014 session "Spocktacular Testing.
Weniger lesen
Mehr lesen
Technologie
Melden
Teilen
Melden
Teilen
1 von 58
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
Spocktacular testing
Spocktacular testing
Russel Winder
Smarter Testing With Spock
Smarter Testing With Spock
IT Weekend
Spock: Test Well and Prosper
Spock: Test Well and Prosper
Ken Kousen
Agile Developer Immersion Workshop, LASTconf Melbourne, Australia, 19th July ...
Agile Developer Immersion Workshop, LASTconf Melbourne, Australia, 19th July ...
Victoria Schiffer
Spock Framework
Spock Framework
Daniel Kolman
Spock
Spock
Naiyer Asif
Spock and Geb in Action
Spock and Geb in Action
Christian Baranowski
Spock framework
Spock framework
Djair Carvalho
Empfohlen
Spocktacular testing
Spocktacular testing
Russel Winder
Smarter Testing With Spock
Smarter Testing With Spock
IT Weekend
Spock: Test Well and Prosper
Spock: Test Well and Prosper
Ken Kousen
Agile Developer Immersion Workshop, LASTconf Melbourne, Australia, 19th July ...
Agile Developer Immersion Workshop, LASTconf Melbourne, Australia, 19th July ...
Victoria Schiffer
Spock Framework
Spock Framework
Daniel Kolman
Spock
Spock
Naiyer Asif
Spock and Geb in Action
Spock and Geb in Action
Christian Baranowski
Spock framework
Spock framework
Djair Carvalho
Gradle Introduction
Gradle Introduction
Dmitry Buzdin
Spock Testing Framework - The Next Generation
Spock Testing Framework - The Next Generation
BTI360
Unit testing with Spock Framework
Unit testing with Spock Framework
Eugene Dvorkin
The Ring programming language version 1.7 book - Part 8 of 196
The Ring programming language version 1.7 book - Part 8 of 196
Mahmoud Samir Fayed
The Ring programming language version 1.4 book - Part 19 of 30
The Ring programming language version 1.4 book - Part 19 of 30
Mahmoud Samir Fayed
Resilence patterns kr
Resilence patterns kr
Jisung Ahn
PuppetCamp SEA 1 - Use of Puppet
PuppetCamp SEA 1 - Use of Puppet
Walter Heck
JJUG CCC 2011 Spring
JJUG CCC 2011 Spring
Kiyotaka Oku
Oscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast Lane
Andres Almiray
The Ring programming language version 1.10 book - Part 13 of 212
The Ring programming language version 1.10 book - Part 13 of 212
Mahmoud Samir Fayed
Слава Бобик «NancyFx для самых маленьких»
Слава Бобик «NancyFx для самых маленьких»
SpbDotNet Community
Everything you wanted to know about Stack Traces and Heap Dumps
Everything you wanted to know about Stack Traces and Heap Dumps
Andrei Pangin
Apache ZooKeeper
Apache ZooKeeper
Scott Leberknight
The Ring programming language version 1.10 book - Part 12 of 212
The Ring programming language version 1.10 book - Part 12 of 212
Mahmoud Samir Fayed
Tugas 2
Tugas 2
Novi_Wahyuni
Varnish presentation for the Symfony Zaragoza user group
Varnish presentation for the Symfony Zaragoza user group
Jorge Nerín
Testing with PostgreSQL
Testing with PostgreSQL
Shawn Sorichetti
Non-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need it
Alexey Fyodorov
The Ring programming language version 1.7 book - Part 92 of 196
The Ring programming language version 1.7 book - Part 92 of 196
Mahmoud Samir Fayed
Deterministic simulation testing
Deterministic simulation testing
FoundationDB
Tales from the Workshops
Tales from the Workshops
Russel Winder
GPars Remoting
GPars Remoting
Russel Winder
Weitere ähnliche Inhalte
Was ist angesagt?
Gradle Introduction
Gradle Introduction
Dmitry Buzdin
Spock Testing Framework - The Next Generation
Spock Testing Framework - The Next Generation
BTI360
Unit testing with Spock Framework
Unit testing with Spock Framework
Eugene Dvorkin
The Ring programming language version 1.7 book - Part 8 of 196
The Ring programming language version 1.7 book - Part 8 of 196
Mahmoud Samir Fayed
The Ring programming language version 1.4 book - Part 19 of 30
The Ring programming language version 1.4 book - Part 19 of 30
Mahmoud Samir Fayed
Resilence patterns kr
Resilence patterns kr
Jisung Ahn
PuppetCamp SEA 1 - Use of Puppet
PuppetCamp SEA 1 - Use of Puppet
Walter Heck
JJUG CCC 2011 Spring
JJUG CCC 2011 Spring
Kiyotaka Oku
Oscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast Lane
Andres Almiray
The Ring programming language version 1.10 book - Part 13 of 212
The Ring programming language version 1.10 book - Part 13 of 212
Mahmoud Samir Fayed
Слава Бобик «NancyFx для самых маленьких»
Слава Бобик «NancyFx для самых маленьких»
SpbDotNet Community
Everything you wanted to know about Stack Traces and Heap Dumps
Everything you wanted to know about Stack Traces and Heap Dumps
Andrei Pangin
Apache ZooKeeper
Apache ZooKeeper
Scott Leberknight
The Ring programming language version 1.10 book - Part 12 of 212
The Ring programming language version 1.10 book - Part 12 of 212
Mahmoud Samir Fayed
Tugas 2
Tugas 2
Novi_Wahyuni
Varnish presentation for the Symfony Zaragoza user group
Varnish presentation for the Symfony Zaragoza user group
Jorge Nerín
Testing with PostgreSQL
Testing with PostgreSQL
Shawn Sorichetti
Non-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need it
Alexey Fyodorov
The Ring programming language version 1.7 book - Part 92 of 196
The Ring programming language version 1.7 book - Part 92 of 196
Mahmoud Samir Fayed
Deterministic simulation testing
Deterministic simulation testing
FoundationDB
Was ist angesagt?
(20)
Gradle Introduction
Gradle Introduction
Spock Testing Framework - The Next Generation
Spock Testing Framework - The Next Generation
Unit testing with Spock Framework
Unit testing with Spock Framework
The Ring programming language version 1.7 book - Part 8 of 196
The Ring programming language version 1.7 book - Part 8 of 196
The Ring programming language version 1.4 book - Part 19 of 30
The Ring programming language version 1.4 book - Part 19 of 30
Resilence patterns kr
Resilence patterns kr
PuppetCamp SEA 1 - Use of Puppet
PuppetCamp SEA 1 - Use of Puppet
JJUG CCC 2011 Spring
JJUG CCC 2011 Spring
Oscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast Lane
The Ring programming language version 1.10 book - Part 13 of 212
The Ring programming language version 1.10 book - Part 13 of 212
Слава Бобик «NancyFx для самых маленьких»
Слава Бобик «NancyFx для самых маленьких»
Everything you wanted to know about Stack Traces and Heap Dumps
Everything you wanted to know about Stack Traces and Heap Dumps
Apache ZooKeeper
Apache ZooKeeper
The Ring programming language version 1.10 book - Part 12 of 212
The Ring programming language version 1.10 book - Part 12 of 212
Tugas 2
Tugas 2
Varnish presentation for the Symfony Zaragoza user group
Varnish presentation for the Symfony Zaragoza user group
Testing with PostgreSQL
Testing with PostgreSQL
Non-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need it
The Ring programming language version 1.7 book - Part 92 of 196
The Ring programming language version 1.7 book - Part 92 of 196
Deterministic simulation testing
Deterministic simulation testing
Andere mochten auch
Tales from the Workshops
Tales from the Workshops
Russel Winder
GPars Remoting
GPars Remoting
Russel Winder
Are Go and D threats to Python
Are Go and D threats to Python
Russel Winder
Dance4Life - The Heroes Universe
Dance4Life - The Heroes Universe
Mauro Forcolin
Is Groovy static or dynamic
Is Groovy static or dynamic
Russel Winder
Dataflow: the concurrency/parallelism architecture you need
Dataflow: the concurrency/parallelism architecture you need
Russel Winder
GPars 2014
GPars 2014
Russel Winder
Making Python computations fast
Making Python computations fast
Russel Winder
Andere mochten auch
(8)
Tales from the Workshops
Tales from the Workshops
GPars Remoting
GPars Remoting
Are Go and D threats to Python
Are Go and D threats to Python
Dance4Life - The Heroes Universe
Dance4Life - The Heroes Universe
Is Groovy static or dynamic
Is Groovy static or dynamic
Dataflow: the concurrency/parallelism architecture you need
Dataflow: the concurrency/parallelism architecture you need
GPars 2014
GPars 2014
Making Python computations fast
Making Python computations fast
Ähnlich wie Spocktacular Testing
Agile Swift
Agile Swift
Godfrey Nolan
Effective testing for spark programs Strata NY 2015
Effective testing for spark programs Strata NY 2015
Holden Karau
Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01
Tino Isnich
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradle
Thierry Wasylczenko
Unit testing
Unit testing
davidahaskins
Unit Testing with Foq
Unit Testing with Foq
Phillip Trelford
Spock: A Highly Logical Way To Test
Spock: A Highly Logical Way To Test
Howard Lewis Ship
Cool JVM Tools to Help You Test
Cool JVM Tools to Help You Test
Schalk Cronjé
10 Cool Facts about Gradle
10 Cool Facts about Gradle
Evgeny Goldin
Refactoring In Tdd The Missing Part
Refactoring In Tdd The Missing Part
Gabriele Lana
The Groovy Way of Testing with Spock
The Groovy Way of Testing with Spock
Naresha K
Unit testing in iOS featuring OCUnit, GHUnit & OCMock
Unit testing in iOS featuring OCUnit, GHUnit & OCMock
Robot Media
Python testing
Python testing
John(Qiang) Zhang
Jggug 2010 330 Grails 1.3 観察
Jggug 2010 330 Grails 1.3 観察
Tsuyoshi Yamamoto
Tdd & unit test
Tdd & unit test
GomathiNayagam S
Industrial Strength Groovy - Tools for the Professional Groovy Developer: Pau...
Industrial Strength Groovy - Tools for the Professional Groovy Developer: Pau...
Paul King
Atlassian Groovy Plugins
Atlassian Groovy Plugins
Paul King
Fabric workshop(1) - (MOSG)
Fabric workshop(1) - (MOSG)
Soshi Nemoto
Commencer avec le TDD
Commencer avec le TDD
Eric Hogue
JRuby hacking guide
JRuby hacking guide
David Calavera
Ähnlich wie Spocktacular Testing
(20)
Agile Swift
Agile Swift
Effective testing for spark programs Strata NY 2015
Effective testing for spark programs Strata NY 2015
Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradle
Unit testing
Unit testing
Unit Testing with Foq
Unit Testing with Foq
Spock: A Highly Logical Way To Test
Spock: A Highly Logical Way To Test
Cool JVM Tools to Help You Test
Cool JVM Tools to Help You Test
10 Cool Facts about Gradle
10 Cool Facts about Gradle
Refactoring In Tdd The Missing Part
Refactoring In Tdd The Missing Part
The Groovy Way of Testing with Spock
The Groovy Way of Testing with Spock
Unit testing in iOS featuring OCUnit, GHUnit & OCMock
Unit testing in iOS featuring OCUnit, GHUnit & OCMock
Python testing
Python testing
Jggug 2010 330 Grails 1.3 観察
Jggug 2010 330 Grails 1.3 観察
Tdd & unit test
Tdd & unit test
Industrial Strength Groovy - Tools for the Professional Groovy Developer: Pau...
Industrial Strength Groovy - Tools for the Professional Groovy Developer: Pau...
Atlassian Groovy Plugins
Atlassian Groovy Plugins
Fabric workshop(1) - (MOSG)
Fabric workshop(1) - (MOSG)
Commencer avec le TDD
Commencer avec le TDD
JRuby hacking guide
JRuby hacking guide
Mehr von Russel Winder
On Concurrency and Parallelism in the JVMverse
On Concurrency and Parallelism in the JVMverse
Russel Winder
The Case for Kotlin and Ceylon
The Case for Kotlin and Ceylon
Russel Winder
On the Architectures of Microservices: the next layer
On the Architectures of Microservices: the next layer
Russel Winder
Fast Python? Don't Bother
Fast Python? Don't Bother
Russel Winder
Making Computations Execute Very Quickly
Making Computations Execute Very Quickly
Russel Winder
Java is Dead, Long Live Ceylon, Kotlin, etc
Java is Dead, Long Live Ceylon, Kotlin, etc
Russel Winder
Java is dead, long live Scala, Kotlin, Ceylon, etc.
Java is dead, long live Scala, Kotlin, Ceylon, etc.
Russel Winder
Java is dead, long live Scala Kotlin Ceylon etc.
Java is dead, long live Scala Kotlin Ceylon etc.
Russel Winder
Is Groovy as fast as Java
Is Groovy as fast as Java
Russel Winder
Who needs C++ when you have D and Go
Who needs C++ when you have D and Go
Russel Winder
Java 8: a New Beginning
Java 8: a New Beginning
Russel Winder
Why Go is an important programming language
Why Go is an important programming language
Russel Winder
GPars: Groovy Parallelism for Java
GPars: Groovy Parallelism for Java
Russel Winder
GroovyFX: or how to program JavaFX easily
GroovyFX: or how to program JavaFX easily
Russel Winder
Switch to Python 3…now…immediately
Switch to Python 3…now…immediately
Russel Winder
GPars Workshop
GPars Workshop
Russel Winder
Given Groovy Who Needs Java
Given Groovy Who Needs Java
Russel Winder
Testing: Python, Java, Groovy, etc.
Testing: Python, Java, Groovy, etc.
Russel Winder
Why Groovy When Java 8 or Scala, or…
Why Groovy When Java 8 or Scala, or…
Russel Winder
Closures: The Next "Big Thing" In Java
Closures: The Next "Big Thing" In Java
Russel Winder
Mehr von Russel Winder
(20)
On Concurrency and Parallelism in the JVMverse
On Concurrency and Parallelism in the JVMverse
The Case for Kotlin and Ceylon
The Case for Kotlin and Ceylon
On the Architectures of Microservices: the next layer
On the Architectures of Microservices: the next layer
Fast Python? Don't Bother
Fast Python? Don't Bother
Making Computations Execute Very Quickly
Making Computations Execute Very Quickly
Java is Dead, Long Live Ceylon, Kotlin, etc
Java is Dead, Long Live Ceylon, Kotlin, etc
Java is dead, long live Scala, Kotlin, Ceylon, etc.
Java is dead, long live Scala, Kotlin, Ceylon, etc.
Java is dead, long live Scala Kotlin Ceylon etc.
Java is dead, long live Scala Kotlin Ceylon etc.
Is Groovy as fast as Java
Is Groovy as fast as Java
Who needs C++ when you have D and Go
Who needs C++ when you have D and Go
Java 8: a New Beginning
Java 8: a New Beginning
Why Go is an important programming language
Why Go is an important programming language
GPars: Groovy Parallelism for Java
GPars: Groovy Parallelism for Java
GroovyFX: or how to program JavaFX easily
GroovyFX: or how to program JavaFX easily
Switch to Python 3…now…immediately
Switch to Python 3…now…immediately
GPars Workshop
GPars Workshop
Given Groovy Who Needs Java
Given Groovy Who Needs Java
Testing: Python, Java, Groovy, etc.
Testing: Python, Java, Groovy, etc.
Why Groovy When Java 8 or Scala, or…
Why Groovy When Java 8 or Scala, or…
Closures: The Next "Big Thing" In Java
Closures: The Next "Big Thing" In Java
Kürzlich hochgeladen
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
ThousandEyes
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Miguel Araújo
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
Martijn de Jong
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Katpro Technologies
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
Radu Cotescu
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
Malak Abu Hammad
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
The Digital Insurer
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
🐬 The future of MySQL is Postgres 🐘
🐬 The future of MySQL is Postgres 🐘
RTylerCroy
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
The Digital Insurer
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
Delhi Call girls
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Igalia
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
Delhi Call girls
Slack Application Development 101 Slides
Slack Application Development 101 Slides
praypatel2
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
Enterprise Knowledge
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
sudhanshuwaghmare1
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
HampshireHUG
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
The Digital Insurer
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
Results
Kürzlich hochgeladen
(20)
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
🐬 The future of MySQL is Postgres 🐘
🐬 The future of MySQL is Postgres 🐘
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
Slack Application Development 101 Slides
Slack Application Development 101 Slides
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
Spocktacular Testing
1.
Spocktacular Testing Russel
Winder email: russel@winder.org.uk xmpp: russel@winder.org.uk twitter: @russel_winder Web: http://www.russel.org.uk Copyright © 2014 Russel Winder 1
2.
Opening Copyright ©
2014 Russel Winder 2
3.
Copyright © 2014
Russel Winder 3
4.
An Historical Perspective
Copyright © 2014 Russel Winder 4
5.
Spock BDD jBehave
sUnit TestNG JUnit4 JUnit GroovyTestCase RSpec TDD Copyright © 2014 Russel Winder 5
6.
Spock is Groovy-based…
…but can test any JVM-based code. Copyright © 2014 Russel Winder 6
7.
NB Testing frameworks
support integration and system testing as well as unit testing. Copyright © 2014 Russel Winder 7
8.
Copyright © 2014
Russel Winder 8
9.
Testing ● Unit:
● Test the classes, functions and methods to ensure they do what we need them to. ● As lightweight and fast as possible. ● Run all tests always. ● Integration and system: ● Test combinations or the whole thing to make sure the functionality is as required. ● Separate process to create a “sandbox”. ● If cannot run all tests always, create smoke tests. Copyright © 2014 Russel Winder 9
10.
Code Under Test
static message() { 'Hello World.' } println message() helloWorld.groovy Copyright © 2014 Russel Winder 10
11.
Unit Test @Grab('org.spockframework:spock-core:0.7-groovy-2.0')
import spock.lang.Specification import helloWorld class Test_HelloWorld extends Specification { def 'ensure the message function returns hello world'() { expect: helloWorld.message() == 'Hello World.' } } Copyright © 2014 Russel Winder 11
12.
System Test @Grab('org.spockframework:spock-core:0.7-groovy-2.0')
import spock.lang.Specification class Test_HelloWorld extends Specification { def 'executing the script results in hello world on the standard output'() { given: def process = 'helloWorld.groovy'.execute() expect: process.waitFor() == 0 process.in.text == 'Hello World.n' } } Copyright © 2014 Russel Winder 12
13.
A bit less
Groovy… Copyright © 2014 Russel Winder 13
14.
Code under Test
package uk.org.winder.spockworkshop; class HelloWorld { private static String message() { return "Hello World."; } public static void main(final String[] args) { System.out.println(message()); } } HelloWorld.java Copyright © 2014 Russel Winder 14
15.
Unit Test package
uk.org.winder.spockworkshop import spock.lang.Specification class Test_HelloWorld extends Specification { def 'ensure the message function returns hello world'() { expect: HelloWorld.message() == 'Hello World.' } } Copyright © 2014 Russel Winder 15
16.
Project Structure .
├── build.gradle └── src ├── main │ └── java │ └── uk │ └── org │ └── winder │ └── spockworkshop │ └─- HelloWorld.java └── test └── groovy └── uk └── org └── winder └── spockworkshop └── unitTest_helloWorld.groovy Copyright © 2014 Russel Winder 16
17.
Build — Gradle
apply plugin: 'groovy' apply plugin: 'application' repositories { mavenCentral() } dependencies { testCompile 'org.spockframework:spock-core:0.7-groovy-2.0' } mainClassName = 'uk.org.winder.spockworkshop.HelloWorld' Copyright © 2014 Russel Winder 17
18.
Copyright © 2014
Russel Winder 18
19.
Moving On Copyright
© 2014 Russel Winder 19
20.
Copyright © 2014
Russel Winder 20
21.
Spock Test Structure
Copyright © 2014 Russel Winder 21
22.
given: Copyright ©
2014 Russel Winder 22
23.
Code Under Test
static message() { 'Hello World.' } println message() helloWorld.groovy Copyright © 2014 Russel Winder 23
24.
Unit Test @Grab('org.spockframework:spock-core:0.7-groovy-2.0')
import spock.lang.Specification import helloWorld class Test_HelloWorld extends Specification { def 'ensure the message function returns hello world'() { expect: helloWorld.message() == 'Hello World.' } } Copyright © 2014 Russel Winder 24
25.
Another Code Under
Test class Stuff { private final data = [] def leftShift(datum) { data << datum } } Stuff.groovy Copyright © 2014 Russel Winder 25
26.
@Grab('org.spockframework:spock-core:0.7-groovy-2.0') import spock.lang.Specification
import Stuff class TestStuff extends Specification { def 'check stuff'() { given: def stuff = new Stuff() expect: stuff.data == [] when: stuff << 6 then: stuff.data == [6] when: stuff << 6 then: stuff.data == [6, 6] } Unit Testing It def 'check other stuff'() { given: def stuff = new Stuff() expect: stuff.data == [] when: stuff.leftShift(6) then: stuff.data == [6] when: stuff.leftShift(6) then: stuff.data == [6, 6] } } Copyright © 2014 Russel Winder 26
27.
Copyright © 2014
Russel Winder 27
28.
Data-driven Testing Copyright
© 2014 Russel Winder 28
29.
Copyright © 2014
Russel Winder 29
30.
given: Copyright ©
2014 Russel Winder 30
31.
Code Under Test
Id.groovy class Id { def eval(x) { x } } Copyright © 2014 Russel Winder 31
32.
Unit Test Code
#! /usr/bin/env groovy @Grab('org.spockframework:spock-core:0.7-groovy-2.0') import spock.lang.Specification import spock.lang.Unroll class idTest extends Specification { @Unroll def 'the id eval function always return the value of the parameter'() { given: final id = new Id () expect: id.eval(i) == i where: i << [0, 1, 2, 3, 's', 'ffff', 2.05] } } Copyright © 2014 Russel Winder 32
33.
Code Under Test
class Functions { static square(x) { x * x } } Functions.groovy Copyright © 2014 Russel Winder 33
34.
Unit Test —
Variant 1 #! /usr/bin/env groovy @Grab('org.spockframework:spock-core:0.7-groovy-2.0') import spock.lang.Specification import spock.lang.Unroll class functionsTest_alt_1 extends Specification { @Unroll def 'square always returns the square of the numeric parameter'() { expect: Functions.square(x) == r where: x << [0, 1, 2, 3, 1.5] r << [0, 1, 4, 9, 2.25] } } Copyright © 2014 Russel Winder 34
35.
Unit Test —
Variant 2 #! /usr/bin/env groovy @Grab('org.spockframework:spock-core:0.7-groovy-2.0') import spock.lang.Specification import spock.lang.Unroll class functionsTest_alt_1 extends Specification { @Unroll def 'square always returns the square of the numeric parameter'() { expect: Functions.square(x) == r where: [x, r] << [[0. 0], [1, 1], [2, 4], [3, 9], [1.5, 2.25]] } } Copyright © 2014 Russel Winder 35
36.
#! /usr/bin/env groovy
Unit Test — Tabular @Grab('org.spockframework:spock-core:0.7-groovy-2.0') import spock.lang.Specification import spock.lang.Unroll class functionsTest_alt_1 extends Specification { @Unroll def 'square always returns the square of the numeric parameter'() { expect: Functions.square(x) == r where: x | r 0 | 0 1 | 1 2 | 4 3 | 9 1.5 | 2.25 } } Copyright © 2014 Russel Winder 36
37.
Exceptions Copyright ©
2014 Russel Winder 37
38.
Copyright © 2014
Russel Winder 38
39.
Code Under Test
class Exceptional { def trySomething() { throw new RuntimeException('Stuff happens.') } } Exceptional.groovy Copyright © 2014 Russel Winder 39
40.
Unit Test #!
/usr/bin/env groovy @Grab('org.spockframework:spock-core:0.7-groovy-2.0') import spock.lang.Specification class ExceptionalTest extends Specification { def 'trying something always results in an exception'() { given: final e = new Exceptional () when: e.trySomething() then: thrown(RuntimeException) } } Copyright © 2014 Russel Winder 40
41.
Now we can
do data validation and testing of error situations. Copyright © 2014 Russel Winder 41
42.
Copyright © 2014
Russel Winder 42
43.
Being More Adventurous
Copyright © 2014 Russel Winder 43
44.
Copyright © 2014
Russel Winder 44
45.
Spock BDD sUnit
TestNG JUnit4 JUnit GroovyTestCase jBehave RSpec TDD Copyright © 2014 Russel Winder 45
46.
Specify Behaviours –
1/4 @Grab('org.spockframework:spock-core:0.7-groovy-2.0') import spock.lang.Specification class StackSpecification extends Specification { def 'newly created stacks are empty'() { given: 'a newly created stack' expect: 'the resulting stack to be empty.' } Copyright © 2014 Russel Winder 46
47.
Specify Behaviours –
2/4 def 'removing an item from a non-empty stack gives a value and changes the stack.'() { given: 'a new stack' and: 'an item to put on the stack' when: 'the item is added' then: 'the stack is not empty' when: 'an item is removed' then: 'the item we retrieved is the original and the stack is empty' } } Copyright © 2014 Russel Winder 47
48.
Specify Behaviours –
3/4 @Grab('org.spockframework:spock-core:0.7-groovy-2.0') import spock.lang.Specification class StackSpecification extends Specification { def 'newly created stacks are empty'() { given: 'a newly created stack' def stack = new Stack () expect: 'the resulting stack to be empty.' stack.size() == 0 } Copyright © 2014 Russel Winder 48
49.
Specify Behaviours –
4/4 def 'removing an item from a non-empty stack gives a value and changes the stack.'() { given: 'a new stack' def stack = new Stack () and: 'an item to put on the stack' def item = 25 and: 'a variable to store the result of activity' def result when: 'the item is added' stack.push(item) then: 'the stack is not empty' stack.size() == 1 when: 'an item is removed' result = stack.pop() then: 'the item we retrieved is the original and the stack is empty' result == item && stack.size() == 0 } } Copyright © 2014 Russel Winder 49
50.
Copyright © 2014
Russel Winder 50
51.
Closing Copyright ©
2014 Russel Winder 51
52.
Hopefully everyone has
had some fun and learnt some useful things. Copyright © 2014 Russel Winder 52
53.
Copyright © 2014
Russel Winder 53
54.
Copyright © 2014
Russel Winder 54
55.
Copyright © 2014
Russel Winder 55
56.
Copyright © 2014
Russel Winder 56
57.
The End Copyright
© 2014 Russel Winder 57
58.
Spocktacular Testing Russel
Winder email: russel@winder.org.uk xmpp: russel@winder.org.uk twitter: @russel_winder Web: http://www.russel.org.uk Copyright © 2014 Russel Winder 58
Jetzt herunterladen