42
Spock I have been, and always shall be, your friendly testing framework

Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

  • Upload
    others

  • View
    72

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

SpockI have been, and always shall be, your

friendly testing framework

Page 2: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Contact Info

Ken KousenKousen IT, [email protected]://www.kousenit.comhttp://kousenit.wordpress.com (blog)@kenkousen

Page 3: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Publications

O'Reilly video courses: (See http://shop.oreilly.com for details)Groovy Programming FundamentalsPractical Groovy ProgrammingMastering Groovy ProgrammingLearning AndroidPractical AndroidGradle FundamentalsGradle for AndroidSpring Framework EssentialsAdvanced Java Development

Page 4: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Testing frameworkWritten in Groovy and Java

What is Spock?

Page 5: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Testing frameworkWritten in Groovy and Java

A logical framework for enterprise testing

What is Spock?

Page 6: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Testing frameworkWritten in Groovy

A logical framework for enterprise testing

Combination ofSpecification + Mock

What is Spock?

Page 7: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Spock home pagehttp://spockframework.org

has links to:

Githubhttps://github.com/spockframework/spock

Docshttps://docs.spockframework.org

The Search for Spock

Page 8: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Extend spock.lang.Specification

class MySpec extends Specification

Create a Spock test

Page 9: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Demo: Palindrome Checker

Simple Specification

Page 10: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

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

Fixture Methods

Page 11: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Spock JUnit ------------------- -----------------------

setup setUp, @Before

cleanup tearDown, @After

setupSpec @BeforeClass

cleanupSpec @AfterClass

Fixture Methods

Page 12: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Test methodsdef "descriptive name"() {

// blocks

}

Feature Methods

Page 13: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

setup: cleanup:given:

Syntactic sugar

Anything before when: or expect:

Blocks

Page 14: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

setup: cleanup:given:

when:Stimulus

then:Response, booleans are checked

Blocks

Page 15: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

setup: cleanup:given:

when:Stimulus

then:Response, booleans are checked

expect: where:

Blocks

Page 16: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

when:Contents are arbitrary

then:conditionsexceptionsinteractions (mocks described below)

when/then Always occur together

when: and then:

Page 17: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Sweet method in Specification class

expression value beforewhen block

when: obj.count()

then:

count == old(count) + 1

old Method what they thought old Kirk would look like

what he actually looks like

Page 18: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Annotation for shared objectsNote: instance fields are not shared

@Shared

Sql sql = Sql.newInstance(...)

@Shared

Page 19: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Demo: RESTful services

@Shared

Page 20: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

thrown()

then:

thrown(SqlException)

-- or --SqlException e = thrown()

e.sqlCode == ...

Can do work after catching exception

Exceptions are exceptions evil or just goatees?

Page 21: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

notThrown(Class)

noExceptionThrown()

Exceptions

Page 22: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Tests that iterate through dataUse where: clause

expect: name.size() == length

where:

[name,length] << [['Kirk',4],['Spock',5]]

Parameterized feature methods

Page 23: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

where: clause supports data tables

expect: name.size() == length

where:

name || length

'Kirk' || 4

'Spock' || 5

'McCoy' || 5

Data Table

Shouldn't Data run on Android?

Page 24: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Supports anything Groovy can iterate over

expect: x + y == z

where:

[x,y,z] << sql.rows(

'select x,y,z from ...')

where: clause

Page 25: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Display separate messagefor each row of data

@Unroll

def "my test #var ..."() { ... }

@Unroll

Page 26: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Demos:Hello, Spock!DataDrivenDatabaseDrivenStadiumLocationsSpec

Data Specs

Page 27: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Working with Mock objects

Interactions

interaction

NO KILL I

Page 28: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Two syntax options:def items = Mock(List)

List items = Mock()

Can mock interfaces with standard libsMock classes with CGLIB

Creating Mocks

Page 29: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Setting Expectations

Use >> operatorlist.get(0) >> 'data'

Use >>> operatorlist.get(0) >>> ['a', 'b']

First call to get(0) → 'a'

Second and sub calls → 'b'

Page 30: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

No cardinalityMust have return value

then:

list.get(0) >> 'data'

Optional

Page 31: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Must have cardinalityMay have return value

then:

1 * list.get(0) >> 'data'

then:

3 * list.size()

Required

Page 32: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Ranges with wildcardWildcard is _ (underscore)

3 * list.size() // 3 times

(3.._) * list.size() // 3 or more

(_..3) * list.size() // up to 3

Cardinalities

Page 33: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

RegexAny set method with one argpojo./set.*/(_)

Nulls, not nullpojo.method(!null)

All sorts of constraints

Page 34: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Use multiple then blocks

def 'testing order of methods'() {

when: obj.method()

then: 1*collaborator.method1()

then: 1*collaborator.method2()

}

Testing Invocation Order

Page 35: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Interactions

Demos:PublisherSubscriberTribbleSpec

Page 36: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

@Timeoutdefault time is sec

@Timeout(5)

@Timeout(value = 100,unit = TimeUnit.MILLISECONDS)

Extensions

Page 37: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

@IgnoreDon't run a particular test or test classOptional value = reason

@IgnoreRestDon't run any OTHER tests

Extensions

Page 38: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

@IgnoreIf({ os.windows })Run everywhere other than windows

@Requires({ os.windows })Run only on windows

Extensions

Page 39: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

BDD

Behavior Driven DevelopmentEach block accepts string descriptionJust 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"

}

Page 40: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Like most modern open source projects

Documentation can be thin or outdated

Tests are excellent

See "smoke" tests in source

Spock's Own Tests

Page 41: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Source code for examples is from1. spock-example project

https://github.com/spockframework/spock-example2. my GitHub repo

https://github.com/kousen/spock-workshop

Examples

Page 42: Contact Info...Groovy Programming Fundamentals Practical Groovy Programming Mastering Groovy Programming Learning Android Practical Android Gradle Fundamentals Gradle for Android Spring

Please complete your session evals

Session Evals