SlideShare ist ein Scribd-Unternehmen logo
1 von 58
Downloaden Sie, um offline zu lesen
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
Opening 
Copyright © 2014 Russel Winder 2
Copyright © 2014 Russel Winder 3
An Historical Perspective 
Copyright © 2014 Russel Winder 4
Spock 
BDD 
jBehave 
sUnit 
TestNG 
JUnit4 
JUnit 
GroovyTestCase 
RSpec 
TDD 
Copyright © 2014 Russel Winder 5
Spock is Groovy-based… 
…but can test any JVM-based code. 
Copyright © 2014 Russel Winder 6
NB Testing frameworks support integration 
and system testing as well as unit testing. 
Copyright © 2014 Russel Winder 7
Copyright © 2014 Russel Winder 8
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
Code Under Test 
static message() { 
'Hello World.' 
} 
println message() 
helloWorld.groovy 
Copyright © 2014 Russel Winder 10
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
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
A bit less Groovy… 
Copyright © 2014 Russel Winder 13
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
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
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
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
Copyright © 2014 Russel Winder 18
Moving On 
Copyright © 2014 Russel Winder 19
Copyright © 2014 Russel Winder 20
Spock Test Structure 
Copyright © 2014 Russel Winder 21
given: 
Copyright © 2014 Russel Winder 22
Code Under Test 
static message() { 
'Hello World.' 
} 
println message() 
helloWorld.groovy 
Copyright © 2014 Russel Winder 23
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
Another Code Under Test 
class Stuff { 
private final data = [] 
def leftShift(datum) { 
data << datum 
} 
} 
Stuff.groovy 
Copyright © 2014 Russel Winder 25
@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
Copyright © 2014 Russel Winder 27
Data-driven Testing 
Copyright © 2014 Russel Winder 28
Copyright © 2014 Russel Winder 29
given: 
Copyright © 2014 Russel Winder 30
Code Under Test 
Id.groovy 
class Id { 
def eval(x) { x } 
} 
Copyright © 2014 Russel Winder 31
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
Code Under Test 
class Functions { 
static square(x) { x * x } 
} 
Functions.groovy 
Copyright © 2014 Russel Winder 33
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
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
#! /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
Exceptions 
Copyright © 2014 Russel Winder 37
Copyright © 2014 Russel Winder 38
Code Under Test 
class Exceptional { 
def trySomething() { 
throw new RuntimeException('Stuff happens.') 
} 
} 
Exceptional.groovy 
Copyright © 2014 Russel Winder 39
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
Now we can do data validation 
and 
testing of error situations. 
Copyright © 2014 Russel Winder 41
Copyright © 2014 Russel Winder 42
Being More Adventurous 
Copyright © 2014 Russel Winder 43
Copyright © 2014 Russel Winder 44
Spock 
BDD 
sUnit 
TestNG 
JUnit4 
JUnit 
GroovyTestCase 
jBehave 
RSpec 
TDD 
Copyright © 2014 Russel Winder 45
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
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
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
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
Copyright © 2014 Russel Winder 50
Closing 
Copyright © 2014 Russel Winder 51
Hopefully everyone has had some fun 
and 
learnt some useful things. 
Copyright © 2014 Russel Winder 52
Copyright © 2014 Russel Winder 53
Copyright © 2014 Russel Winder 54
Copyright © 2014 Russel Winder 55
Copyright © 2014 Russel Winder 56
The End 
Copyright © 2014 Russel Winder 57
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

Weitere ähnliche Inhalte

Was ist angesagt?

Spock Testing Framework - The Next Generation
Spock Testing Framework - The Next GenerationSpock Testing Framework - The Next Generation
Spock Testing Framework - The Next GenerationBTI360
 
Unit testing with Spock Framework
Unit testing with Spock FrameworkUnit testing with Spock Framework
Unit testing with Spock FrameworkEugene Dvorkin
 
The Ring programming language version 1.7 book - Part 8 of 196
The Ring programming language version 1.7 book - Part 8 of 196The Ring programming language version 1.7 book - Part 8 of 196
The Ring programming language version 1.7 book - Part 8 of 196Mahmoud 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 30The Ring programming language version 1.4 book - Part 19 of 30
The Ring programming language version 1.4 book - Part 19 of 30Mahmoud Samir Fayed
 
Resilence patterns kr
Resilence patterns krResilence patterns kr
Resilence patterns krJisung Ahn
 
PuppetCamp SEA 1 - Use of Puppet
PuppetCamp SEA 1 - Use of PuppetPuppetCamp SEA 1 - Use of Puppet
PuppetCamp SEA 1 - Use of PuppetWalter Heck
 
JJUG CCC 2011 Spring
JJUG CCC 2011 SpringJJUG CCC 2011 Spring
JJUG CCC 2011 SpringKiyotaka Oku
 
Oscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast LaneOscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast LaneAndres Almiray
 
The Ring programming language version 1.10 book - Part 13 of 212
The Ring programming language version 1.10 book - Part 13 of 212The Ring programming language version 1.10 book - Part 13 of 212
The Ring programming language version 1.10 book - Part 13 of 212Mahmoud Samir Fayed
 
Слава Бобик «NancyFx для самых маленьких»
Слава Бобик «NancyFx для самых маленьких»Слава Бобик «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 DumpsEverything you wanted to know about Stack Traces and Heap Dumps
Everything you wanted to know about Stack Traces and Heap DumpsAndrei Pangin
 
The Ring programming language version 1.10 book - Part 12 of 212
The Ring programming language version 1.10 book - Part 12 of 212The Ring programming language version 1.10 book - Part 12 of 212
The Ring programming language version 1.10 book - Part 12 of 212Mahmoud Samir Fayed
 
Varnish presentation for the Symfony Zaragoza user group
Varnish presentation for the Symfony Zaragoza user groupVarnish presentation for the Symfony Zaragoza user group
Varnish presentation for the Symfony Zaragoza user groupJorge Nerín
 
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 itNon-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need itAlexey Fyodorov
 
The Ring programming language version 1.7 book - Part 92 of 196
The Ring programming language version 1.7 book - Part 92 of 196The Ring programming language version 1.7 book - Part 92 of 196
The Ring programming language version 1.7 book - Part 92 of 196Mahmoud Samir Fayed
 
Deterministic simulation testing
Deterministic simulation testingDeterministic simulation testing
Deterministic simulation testingFoundationDB
 

Was ist angesagt? (20)

Gradle Introduction
Gradle IntroductionGradle Introduction
Gradle Introduction
 
Spock Testing Framework - The Next Generation
Spock Testing Framework - The Next GenerationSpock Testing Framework - The Next Generation
Spock Testing Framework - The Next Generation
 
Unit testing with Spock Framework
Unit testing with Spock FrameworkUnit 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 196The 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 30The 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 krResilence patterns kr
Resilence patterns kr
 
PuppetCamp SEA 1 - Use of Puppet
PuppetCamp SEA 1 - Use of PuppetPuppetCamp SEA 1 - Use of Puppet
PuppetCamp SEA 1 - Use of Puppet
 
JJUG CCC 2011 Spring
JJUG CCC 2011 SpringJJUG CCC 2011 Spring
JJUG CCC 2011 Spring
 
Oscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast LaneOscon 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 212The 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 для самых маленьких»Слава Бобик «NancyFx для самых маленьких»
Слава Бобик «NancyFx для самых маленьких»
 
Everything you wanted to know about Stack Traces and Heap Dumps
Everything you wanted to know about Stack Traces and Heap DumpsEverything you wanted to know about Stack Traces and Heap Dumps
Everything you wanted to know about Stack Traces and Heap Dumps
 
Apache ZooKeeper
Apache ZooKeeperApache 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 212The 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 2Tugas 2
Tugas 2
 
Varnish presentation for the Symfony Zaragoza user group
Varnish presentation for the Symfony Zaragoza user groupVarnish presentation for the Symfony Zaragoza user group
Varnish presentation for the Symfony Zaragoza user group
 
Testing with PostgreSQL
Testing with PostgreSQLTesting 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 itNon-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 196The 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 testingDeterministic simulation testing
Deterministic simulation testing
 

Andere mochten auch

Tales from the Workshops
Tales from the WorkshopsTales from the Workshops
Tales from the WorkshopsRussel Winder
 
Are Go and D threats to Python
Are Go and D threats to PythonAre Go and D threats to Python
Are Go and D threats to PythonRussel Winder
 
Dance4Life - The Heroes Universe
Dance4Life - The Heroes UniverseDance4Life - The Heroes Universe
Dance4Life - The Heroes UniverseMauro Forcolin
 
Is Groovy static or dynamic
Is Groovy static or dynamicIs Groovy static or dynamic
Is Groovy static or dynamicRussel Winder
 
Dataflow: the concurrency/parallelism architecture you need
Dataflow: the concurrency/parallelism architecture you needDataflow: the concurrency/parallelism architecture you need
Dataflow: the concurrency/parallelism architecture you needRussel Winder
 
Making Python computations fast
Making Python computations fastMaking Python computations fast
Making Python computations fastRussel Winder
 

Andere mochten auch (8)

Tales from the Workshops
Tales from the WorkshopsTales from the Workshops
Tales from the Workshops
 
GPars Remoting
GPars RemotingGPars Remoting
GPars Remoting
 
Are Go and D threats to Python
Are Go and D threats to PythonAre Go and D threats to Python
Are Go and D threats to Python
 
Dance4Life - The Heroes Universe
Dance4Life - The Heroes UniverseDance4Life - The Heroes Universe
Dance4Life - The Heroes Universe
 
Is Groovy static or dynamic
Is Groovy static or dynamicIs Groovy static or dynamic
Is Groovy static or dynamic
 
Dataflow: the concurrency/parallelism architecture you need
Dataflow: the concurrency/parallelism architecture you needDataflow: the concurrency/parallelism architecture you need
Dataflow: the concurrency/parallelism architecture you need
 
GPars 2014
GPars 2014GPars 2014
GPars 2014
 
Making Python computations fast
Making Python computations fastMaking Python computations fast
Making Python computations fast
 

Ähnlich wie Spocktacular Testing

Effective testing for spark programs Strata NY 2015
Effective testing for spark programs   Strata NY 2015Effective testing for spark programs   Strata NY 2015
Effective testing for spark programs Strata NY 2015Holden Karau
 
Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01Tino Isnich
 
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleConstruire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleThierry Wasylczenko
 
Spock: A Highly Logical Way To Test
Spock: A Highly Logical Way To TestSpock: A Highly Logical Way To Test
Spock: A Highly Logical Way To TestHoward Lewis Ship
 
Cool JVM Tools to Help You Test
Cool JVM Tools to Help You TestCool JVM Tools to Help You Test
Cool JVM Tools to Help You TestSchalk Cronjé
 
10 Cool Facts about Gradle
10 Cool Facts about Gradle10 Cool Facts about Gradle
10 Cool Facts about GradleEvgeny Goldin
 
Refactoring In Tdd The Missing Part
Refactoring In Tdd The Missing PartRefactoring In Tdd The Missing Part
Refactoring In Tdd The Missing PartGabriele Lana
 
The Groovy Way of Testing with Spock
The Groovy Way of Testing with SpockThe Groovy Way of Testing with Spock
The Groovy Way of Testing with SpockNaresha K
 
Unit testing in iOS featuring OCUnit, GHUnit & OCMock
Unit testing in iOS featuring OCUnit, GHUnit & OCMockUnit testing in iOS featuring OCUnit, GHUnit & OCMock
Unit testing in iOS featuring OCUnit, GHUnit & OCMockRobot Media
 
Jggug 2010 330 Grails 1.3 観察
Jggug 2010 330 Grails 1.3 観察Jggug 2010 330 Grails 1.3 観察
Jggug 2010 330 Grails 1.3 観察Tsuyoshi Yamamoto
 
Industrial Strength Groovy - Tools for the Professional Groovy Developer: Pau...
Industrial Strength Groovy - Tools for the Professional Groovy Developer: Pau...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 PluginsAtlassian Groovy Plugins
Atlassian Groovy PluginsPaul King
 
Fabric workshop(1) - (MOSG)
Fabric workshop(1) - (MOSG)Fabric workshop(1) - (MOSG)
Fabric workshop(1) - (MOSG)Soshi Nemoto
 
Commencer avec le TDD
Commencer avec le TDDCommencer avec le TDD
Commencer avec le TDDEric Hogue
 

Ähnlich wie Spocktacular Testing (20)

Agile Swift
Agile SwiftAgile Swift
Agile Swift
 
Effective testing for spark programs Strata NY 2015
Effective testing for spark programs   Strata NY 2015Effective testing for spark programs   Strata NY 2015
Effective testing for spark programs Strata NY 2015
 
Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01
 
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradleConstruire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradle
 
Unit testing
Unit testingUnit testing
Unit testing
 
Unit Testing with Foq
Unit Testing with FoqUnit Testing with Foq
Unit Testing with Foq
 
Spock: A Highly Logical Way To Test
Spock: A Highly Logical Way To TestSpock: 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 TestCool JVM Tools to Help You Test
Cool JVM Tools to Help You Test
 
10 Cool Facts about Gradle
10 Cool Facts about Gradle10 Cool Facts about Gradle
10 Cool Facts about Gradle
 
Refactoring In Tdd The Missing Part
Refactoring In Tdd The Missing PartRefactoring In Tdd The Missing Part
Refactoring In Tdd The Missing Part
 
The Groovy Way of Testing with Spock
The Groovy Way of Testing with SpockThe 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 & OCMockUnit testing in iOS featuring OCUnit, GHUnit & OCMock
Unit testing in iOS featuring OCUnit, GHUnit & OCMock
 
Python testing
Python  testingPython  testing
Python testing
 
Jggug 2010 330 Grails 1.3 観察
Jggug 2010 330 Grails 1.3 観察Jggug 2010 330 Grails 1.3 観察
Jggug 2010 330 Grails 1.3 観察
 
Tdd & unit test
Tdd & unit testTdd & 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...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 PluginsAtlassian Groovy Plugins
Atlassian Groovy Plugins
 
Fabric workshop(1) - (MOSG)
Fabric workshop(1) - (MOSG)Fabric workshop(1) - (MOSG)
Fabric workshop(1) - (MOSG)
 
Commencer avec le TDD
Commencer avec le TDDCommencer avec le TDD
Commencer avec le TDD
 
JRuby hacking guide
JRuby hacking guideJRuby hacking guide
JRuby hacking guide
 

Mehr von Russel Winder

On Concurrency and Parallelism in the JVMverse
On Concurrency and Parallelism in the JVMverseOn Concurrency and Parallelism in the JVMverse
On Concurrency and Parallelism in the JVMverseRussel Winder
 
The Case for Kotlin and Ceylon
The Case for Kotlin and CeylonThe Case for Kotlin and Ceylon
The Case for Kotlin and CeylonRussel Winder
 
On the Architectures of Microservices: the next layer
On the Architectures of Microservices: the next layerOn the Architectures of Microservices: the next layer
On the Architectures of Microservices: the next layerRussel Winder
 
Fast Python? Don't Bother
Fast Python? Don't BotherFast Python? Don't Bother
Fast Python? Don't BotherRussel Winder
 
Making Computations Execute Very Quickly
Making Computations Execute Very QuicklyMaking Computations Execute Very Quickly
Making Computations Execute Very QuicklyRussel Winder
 
Java is Dead, Long Live Ceylon, Kotlin, etc
Java is Dead,  Long Live Ceylon, Kotlin, etcJava is Dead,  Long Live Ceylon, Kotlin, etc
Java is Dead, Long Live Ceylon, Kotlin, etcRussel Winder
 
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.Russel Winder
 
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.Russel Winder
 
Is Groovy as fast as Java
Is Groovy as fast as JavaIs Groovy as fast as Java
Is Groovy as fast as JavaRussel Winder
 
Who needs C++ when you have D and Go
Who needs C++ when you have D and GoWho needs C++ when you have D and Go
Who needs C++ when you have D and GoRussel Winder
 
Java 8: a New Beginning
Java 8: a New BeginningJava 8: a New Beginning
Java 8: a New BeginningRussel Winder
 
Why Go is an important programming language
Why Go is an important programming languageWhy Go is an important programming language
Why Go is an important programming languageRussel Winder
 
GPars: Groovy Parallelism for Java
GPars: Groovy Parallelism for JavaGPars: Groovy Parallelism for Java
GPars: Groovy Parallelism for JavaRussel Winder
 
GroovyFX: or how to program JavaFX easily
GroovyFX: or how to program JavaFX easily 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…immediatelySwitch to Python 3…now…immediately
Switch to Python 3…now…immediatelyRussel Winder
 
Given Groovy Who Needs Java
Given Groovy Who Needs JavaGiven Groovy Who Needs Java
Given Groovy Who Needs JavaRussel Winder
 
Testing: Python, Java, Groovy, etc.
Testing: Python, Java, Groovy, etc.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…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 JavaClosures: The Next "Big Thing" In Java
Closures: The Next "Big Thing" In JavaRussel Winder
 

Mehr von Russel Winder (20)

On Concurrency and Parallelism in the JVMverse
On Concurrency and Parallelism in the JVMverseOn Concurrency and Parallelism in the JVMverse
On Concurrency and Parallelism in the JVMverse
 
The Case for Kotlin and Ceylon
The Case for Kotlin and CeylonThe 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 layerOn the Architectures of Microservices: the next layer
On the Architectures of Microservices: the next layer
 
Fast Python? Don't Bother
Fast Python? Don't BotherFast Python? Don't Bother
Fast Python? Don't Bother
 
Making Computations Execute Very Quickly
Making Computations Execute Very QuicklyMaking Computations Execute Very Quickly
Making Computations Execute Very Quickly
 
Java is Dead, Long Live Ceylon, Kotlin, etc
Java is Dead,  Long Live Ceylon, Kotlin, etcJava 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.
 
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 JavaIs 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 GoWho 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 BeginningJava 8: a New Beginning
Java 8: a New Beginning
 
Why Go is an important programming language
Why Go is an important programming languageWhy Go is an important programming language
Why Go is an important programming language
 
GPars: Groovy Parallelism for Java
GPars: Groovy Parallelism for JavaGPars: Groovy Parallelism for Java
GPars: Groovy Parallelism for Java
 
GroovyFX: or how to program JavaFX easily
GroovyFX: or how to program JavaFX easily 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…immediatelySwitch to Python 3…now…immediately
Switch to Python 3…now…immediately
 
GPars Workshop
GPars WorkshopGPars Workshop
GPars Workshop
 
Given Groovy Who Needs Java
Given Groovy Who Needs JavaGiven Groovy Who Needs Java
Given Groovy Who Needs Java
 
Testing: Python, Java, Groovy, etc.
Testing: Python, Java, Groovy, etc.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…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 JavaClosures: 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 WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...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...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.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi 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...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.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...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.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 

Kürzlich hochgeladen (20)

How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow 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...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...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.pptxFactors 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 organizationScaling 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.pptxThe 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 2024Bajaj 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 slideHistor 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   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology 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 Men08448380779 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...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.pptxEIS-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 Men08448380779 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 SlidesSlack 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...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.pdfBoost 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.pptx04-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 2024Axa 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 2024A 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