Enviar búsqueda
Cargar
Spocktacular Testing
•
0 recomendaciones
•
817 vistas
Russel Winder
Seguir
Slides from my JAXLondon 2014 session "Spocktacular Testing.
Leer menos
Leer más
Tecnología
Denunciar
Compartir
Denunciar
Compartir
1 de 58
Descargar ahora
Descargar para leer sin conexión
Recomendados
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
Recomendados
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
Más contenido relacionado
La actualidad más candente
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
La actualidad más candente
(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
Destacado
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
Destacado
(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
Similar a 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
Similar a 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
Más de 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
Más de 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
Último
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
MIND CTI
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
sammart93
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
The Digital Insurer
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
Khushali Kathiriya
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Orbitshub
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
Dropbox
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
apidays
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
Overkill Security
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc
Architecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
Product Anonymous
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
ThousandEyes
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Jago de Vreede
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
Rustici Software
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
danishmna97
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
Zilliz
Último
(20)
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
Architecting Cloud Native Applications
Architecting Cloud Native Applications
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
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
Descargar ahora