Spock
I have been, and always shall be, your
friendly testing framework
Who Am I?
Ken Kousen
Kousen IT, Inc.
http://www.kousenit.com
ken.kousen@kousenit.com
@kenkousen
Making Java Groovy
http://...
What is Spock?
Testing framework
Written in Groovy
A logical framework for enterprise testing
Combination of
Specification...
The Search for Spock
Spock home page
http://spockframework.org
redirects to
http://code.google.com/p/spock
Github
https://...
Create a Spock test
Extend spock.lang.Specification
class MySpec extends Specification
Simple Specification
Demo: Palindrome Checker
Fixture Methods
def setup() {}
run before every feature method
def cleanup() {}
run after every feature method
def setupSp...
Feature Methods
Test methods
def "descriptive name"() {
// blocks
}
Blocks
setup:
given:

cleanup:

when:
Stimulus
then:
Response, booleans are checked
expect:

where:
when: and then:
when:
Contents are arbitrary
then:
conditions
exceptions
interactions (mocks described below)
Always occur...
what they thought old Kirk
would look like

old Method

Sweet method in Specification class
expression value before
where ...
@Shared
Annotation for shared objects
Note: instance fields are not shared
@Shared res = new VeryExpensiveResource()
@Shar...
@Shared
Demo: Library Computer
Exceptions

are exceptions evil or just
goatees?

thrown() and notThrown()
then:
thrown(SqlException)

-- or -SqlException...
Parameterized feature methods
Tests that iterate through data
Use where: clause
expect: name.size() == length
where:
[name...
Data Table
where: clause supports data tables
expect:
where:
name
'Kirk'
'Spock'
'McCoy'

name.size() == length
|
|
|
|

l...
where: clause
Supports anything Groovy can iterate over
expect: x + y == z
where:
[x,y,z] << sql.rows('select x,y,z from ....
@Unroll
Display separate message
for each row of data
Spock 0.5:
@Unroll({"...$var..."})

Spock 0.6+:
@Unroll
def "my test...
Data Specs
Demos:
Hello, Spock!
DataDriven
DatabaseDriven
StadiumLocationsSpec
Interactions
Working with Mock objects

interaction

NO KILL I
Creating Mocks
Two syntax options:
def items = Mock(List)
List items = Mock()
Can mock interfaces with standard libs
Mock ...
Setting Expectations
Use >> operator
list.get(0) >> 'data'
Global vs Local
Global:
Defined outside then: block
Valid to end of feature method
Local:
Defined inside then: block
Valid...
Optional
No cardinality
Must have return value
then:
list.get(0) >> 'data'
Required
Must have cardinality
May have return value
then:
1 * list.get(0) >> 'data'
then:
3 * list.size()
Cardinalities
Ranges with wildcard
Wildcard is _ (underscore)
3 * list.size()
(3.._) * list.size()
(_..3) * list.size()

/...
All sorts of constraints
Regex
Any set method with one arg
pojo./set.*/(_)
Nulls, not null
pojo.method(!null)
All sorts of constraints
as Operator
dir.listFiles(_ as FileFilter)

Closures
count.increment { it ==~ /a*b/ }
Testing Invocation Order
Use multiple then blocks
def 'testing order of methods'() {
when: obj.method()
then: 1*collaborat...
Interactions
Demos:
PublisherSubscriber
TribbleSpec
Extensions
@Timeout
@Ignore
@IgnoreRest
@FailsWith
@FailsWith
Test fails with expected exception
@FailsWith(TooFewInvocationsError)
def "required interaction"() {
def m = Mo...
@FailsWith
Parameters
value=ExpectedExceptionOrError
reason="reason for failure"
@Ignore and @IgnoreRest
@Ignore
Don't run a particular test or test class
Optional value = reason
@IgnoreRest
Don't run an...
interaction block
Method in Specification class
Takes closure argument
def 'use interaction block'() {
when: obj.method()
...
BDD
Behavior Driven Development
Each block accepts string description
Just documentation
def "number of tribbles in storag...
Spock's Own Tests
Like most modern open source projects
Documentation can be thin or outdated
Tests are excellent
See "smo...
Links
http://github.com/spockframework/spock
http://code.google.com/p/spock
http://spockframework.org
http://meet.spockfra...
Session Evals
Please complete your session evals
Upcoming SlideShare
Loading in...5
×

Spock: Logical Testing for Enterprise Applications

638

Published on

Speaker: Kenneth Kousen
The Spock framework brings simple, elegant testing to Java and Groovy projects. It integrates cleanly with JUnit, so Spock tests can be integrated as part of an existing test suite. Spock also includes an embedded mocking framework that can be used right away.
In this presentation, we'll look at several examples of Spock tests and review most of its capabilities, including mock objects and integration with Spring.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
638
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Spock: Logical Testing for Enterprise Applications

  1. 1. Spock I have been, and always shall be, your friendly testing framework
  2. 2. Who Am I? Ken Kousen Kousen IT, Inc. http://www.kousenit.com ken.kousen@kousenit.com @kenkousen Making Java Groovy http://manning.com/kousen
  3. 3. What is Spock? Testing framework Written in Groovy A logical framework for enterprise testing Combination of Specification + Mock
  4. 4. The Search for Spock Spock home page http://spockframework.org redirects to http://code.google.com/p/spock Github https://github.com/spockframework/spock
  5. 5. Create a Spock test Extend spock.lang.Specification class MySpec extends Specification
  6. 6. Simple Specification Demo: Palindrome Checker
  7. 7. Fixture Methods def setup() {} run before every feature method def cleanup() {} run after every feature method def setupSpec() {} run before first feature method def cleanupSpec() {} run after last feature method Like JUnit 4: @Before, @After, @BeforeClass, @AfterClass
  8. 8. Feature Methods Test methods def "descriptive name"() { // blocks }
  9. 9. Blocks setup: given: cleanup: when: Stimulus then: Response, booleans are checked expect: where:
  10. 10. when: and then: when: Contents are arbitrary then: conditions exceptions interactions (mocks described below) Always occur together
  11. 11. what they thought old Kirk would look like old Method Sweet method in Specification class expression value before where block when: obj.count() then: count == old(count) + 1 what he actually looks like
  12. 12. @Shared Annotation for shared objects Note: instance fields are not shared @Shared res = new VeryExpensiveResource() @Shared sql = Sql.newInstance(...)
  13. 13. @Shared Demo: Library Computer
  14. 14. Exceptions are exceptions evil or just goatees? thrown() and notThrown() then: thrown(SqlException) -- or -SqlException e = thrown() e.sqlCode == ... Can do work after catching exception
  15. 15. Parameterized feature methods Tests that iterate through data Use where: clause expect: name.size() == length where: [name,length] << [['Kirk',4],['Spock',5]]
  16. 16. Data Table where: clause supports data tables expect: where: name 'Kirk' 'Spock' 'McCoy' name.size() == length | | | | length 4 5 5 Shouldn't Data run on Android?
  17. 17. where: clause Supports anything Groovy can iterate over expect: x + y == z where: [x,y,z] << sql.rows('select x,y,z from ...')
  18. 18. @Unroll Display separate message for each row of data Spock 0.5: @Unroll({"...$var..."}) Spock 0.6+: @Unroll def "my test #var ..."() { ... }
  19. 19. Data Specs Demos: Hello, Spock! DataDriven DatabaseDriven StadiumLocationsSpec
  20. 20. Interactions Working with Mock objects interaction NO KILL I
  21. 21. Creating Mocks Two syntax options: def items = Mock(List) List items = Mock() Can mock interfaces with standard libs Mock classes with CGLIB
  22. 22. Setting Expectations Use >> operator list.get(0) >> 'data'
  23. 23. Global vs Local Global: Defined outside then: block Valid to end of feature method Local: Defined inside then: block Valid inside preceding when: block
  24. 24. Optional No cardinality Must have return value then: list.get(0) >> 'data'
  25. 25. Required Must have cardinality May have return value then: 1 * list.get(0) >> 'data' then: 3 * list.size()
  26. 26. Cardinalities Ranges with wildcard Wildcard is _ (underscore) 3 * list.size() (3.._) * list.size() (_..3) * list.size() // 3 times // 3 or more // up to 3
  27. 27. All sorts of constraints Regex Any set method with one arg pojo./set.*/(_) Nulls, not null pojo.method(!null)
  28. 28. All sorts of constraints as Operator dir.listFiles(_ as FileFilter) Closures count.increment { it ==~ /a*b/ }
  29. 29. Testing Invocation Order Use multiple then blocks def 'testing order of methods'() { when: obj.method() then: 1*collaborator.method1() then: 1*collaborator.method2() }
  30. 30. Interactions Demos: PublisherSubscriber TribbleSpec
  31. 31. Extensions @Timeout @Ignore @IgnoreRest @FailsWith
  32. 32. @FailsWith Test fails with expected exception @FailsWith(TooFewInvocationsError) def "required interaction"() { def m = Mock(List) 2 * m.get(_) >> "foo" expect: m.get(3) == "foo" }
  33. 33. @FailsWith Parameters value=ExpectedExceptionOrError reason="reason for failure"
  34. 34. @Ignore and @IgnoreRest @Ignore Don't run a particular test or test class Optional value = reason @IgnoreRest Don't run any OTHER tests
  35. 35. interaction block Method in Specification class Takes closure argument def 'use interaction block'() { when: obj.method() then: interaction { // do whatever } }
  36. 36. BDD Behavior Driven Development Each block accepts string description Just documentation def "number of tribbles in storage compartment"() { given: "average litter of 10" and: "new generation every 12 hours over a period of three days" when: "tribbles get into storage compartments" then: "compute number of tribbles" }
  37. 37. Spock's Own Tests Like most modern open source projects Documentation can be thin or outdated Tests are excellent See "smoke" tests in source
  38. 38. Links http://github.com/spockframework/spock http://code.google.com/p/spock http://spockframework.org http://meet.spockframework.org http://groups.google.com/group/spockframework?pli=1 Source code for examples is from 1. spock-example project https://github.com/spockframework/spock-example 2. my GitHub repo https://github.com/kousen/Spock-NFJS-Article
  39. 39. Session Evals Please complete your session evals
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×