72
Salenda Testing Grails 3: the good (unit), the bad (integration) and the ugly (functional) Greach ’17 Alberto De Ávila Hernández

Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

Embed Size (px)

Citation preview

Page 1: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

SalendaTesting Grails 3:

the good (unit), the bad (integration) and the ugly (functional)

Greach ’17

Alberto De Ávila Hernández

Page 2: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

A B O U T M E

✴ Software Engineer

✴ Team Lead at Salenda

✴ Groovy y Grails dev

✴ Testing obsessed

@alberto_deavila

Page 3: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

S A L E N D A

Page 4: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

S O F T W A R E D E V E L O P M E N T

Turnkey development

Gold Atlassian Solution Partner

Consulting and support in software

architecture and analysis

Application integration

Evolutionary support of our own

developments or inherited ones

@alberto_deavila

Page 5: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

O B J E C T I V E S

@alberto_deavila

Objectives

Page 6: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

F I R S T S T E P S

@alberto_deavila

First Steps

Page 7: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

F I R S T S T E P S

@alberto_deavila

✴ Install Java 8

✴ Install sdkman

>$ curl -s "https://get.sdkman.io" | bash

>$ source "$HOME/.sdkman/bin/sdkman-init.sh"

✴ Install Grails 3.2.6

>$ sdk install grails 3.2.6

✴Clone: github.com/albertodeavila/testingGrails3

Page 8: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

G U I D E

@alberto_deavila

✴ Testing types

✴ Testing in Grails 3

✴ Review app

✴ Unit testing

✴ Functional testing

✴ Integration testing

Page 9: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G T Y P E S

@alberto_deavila

Testing types

Page 10: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G T Y P E S

@alberto_deavila

Unit (the good)

Page 11: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G T Y P E S : U N I T

@alberto_deavila

✴ Test a small piece of code

✴ Simulate the rest of pieces

✴ Mock it

✴ Override behavior

✴ Independents on the environment

✴ Very quickly

Page 12: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G T Y P E S

@alberto_deavila

Integration (the bad)

Page 13: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G T Y P E S : I N T E G R AT I O N

@alberto_deavila

✴ Test a complete functionality

✴ Start the app

✴ Test inside the app

✴ Slow

✴ Depends on the environment

Page 14: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G T Y P E S

@alberto_deavila

Functional (the ugly)

Page 15: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G T Y P E S : F U N C T I O N A L

@alberto_deavila

✴ Test a complete functionality as a user

✴ Start the app

✴ Test outside the app

✴ Browsing the app / calling API

✴ Slow

✴ Not cross browser and some browser errors

Page 16: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G I N G R A I L S 3

@alberto_deavila

Testing in Grails 3

Page 17: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G I N G R A I L S 3

@alberto_deavila

✴ Plugins:

✴ Build test-data plugin

✴ Greenmail

✴ Rest client builder

✴ Spock

✴ Geb

Page 18: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G I N G R A I L S 3 : S P O C K

@alberto_deavila

Spock

Page 19: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G I N G R A I L S 3 : S P O C K

@alberto_deavila

✴ Describe test

✴ Blocks

✴ Mocks

✴ Data tables

✴ Fixture methods

✴ Tricks and recomendations

Page 20: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G I N G R A I L S 3 : S P O C K

@alberto_deavila

Describe test

Page 21: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G I N G R A I L S 3 : S P O C K

@alberto_deavila

✴ Given / Setup: preconditions and data

✴ Cleanup: postconditions

✴ When: action that trigger some outcome

✴ Then / Expect: assert outcome

✴ Where: applies varied data

Blocks

Page 22: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G I N G R A I L S 3 : S P O C K

@alberto_deavila

✴ Given, Expect

✴ Given, When, Then

✴ Given, When, Then, Where, Cleanup

✴ Given, Expect, Where

✴ When, Then, Where, Cleanup

Blocks: samples

Page 23: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G I N G R A I L S 3 : S P O C K

@alberto_deavila

Mocks Data tables

Page 24: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G I N G R A I L S 3 : S P O C K

@alberto_deavila

Fixture methods

Page 25: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G I N G R A I L S 3 : S P O C K

@alberto_deavila

✴ Use assert if there are { } in then clause

✴ You can catch exceptions with thrown

✴ @Build includes @Mock

✴ Use .buildWithoutSave() to avoid persist

✴ Use @ConfineMetaClassChanges ;)

Tricks & recommendations

Page 26: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

R E V I E W A P P

@alberto_deavila

Review app

Page 27: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

L E T ’ S G O T E S T

@alberto_deavila

Let’s go test!

Page 28: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

U N I T T E S T I N G

@alberto_deavila

Unit testing

Page 29: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

U N I T T E S T I N G

@alberto_deavila

✴ Unit test extends Specification

✴ @TestFor annotation to indicate what test

✴ @Mock annotation to simulate another entity

✴ @Build annotation to create default entities

Page 30: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

U N I T T E S T I N G

@alberto_deavila

Domain classes

Page 31: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

U N I T T E S T I N G : D O M A I N C L A S S E S

@alberto_deavila

✴ @TestFor with the domain class to test

✴ Check constraints and logic in domain class

✴ Implicit variable domain

✴ Tricks:

✴ Use the @Unroll to use different data

✴ Persistence can’t be tested with unit test

Page 32: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

U N I T T E S T I N G : D O M A I N C L A S S E S

@alberto_deavila

Example:

EpisodeUnitSpec

Page 33: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

U N I T T E S T I N G : D O M A I N C L A S S E S

@alberto_deavila

Exercise:

SerieUnitSpec

Page 34: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

U N I T T E S T I N G

@alberto_deavila

Services

Page 35: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

U N I T T E S T I N G : S E R V I C E S

@alberto_deavila

✴ Again @TestFor annotation

✴ Implicit variable service

✴ defineBeans: to inject services / beans

✴ Override method:

✴ Metaclass

✴ Mock

Page 36: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

U N I T T E S T I N G : S E R V I C E S

@alberto_deavila

Example:

ActorServiceUnitSpec

Page 37: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

U N I T T E S T I N G : S E R V I C E S

@alberto_deavila

Exercise:

SerieServiceUnitSpec

Page 38: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

U N I T T E S T I N G

@alberto_deavila

Controllers

Page 39: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

U N I T T E S T I N G : C O N T R O L L E R S

@alberto_deavila

✴ Implicit variable controller

✴ Helpers: view / model / response

✴ defineBeans: to inject services / beans

✴ If action return a map, model & view are null

✴ Save the action call return in a variable

✴ Bug: view doesn’t contains the template

Page 40: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

U N I T T E S T I N G : C O N T R O L L E R S

@alberto_deavila

Example:

UserControllerUnitSpec

Page 41: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

U N I T T E S T I N G : C O N T R O L L E R S

@alberto_deavila

Exercise:

ActorControllerUnitSpec

Page 42: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

U N I T T E S T I N G : C O N T R O L L E R S

@alberto_deavila

Exercise:

SerieControllerUnitSpec

Page 43: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

F U N C T I O N A L T E S T I N G

@alberto_deavila

Functional testing

Page 44: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

F U N C T I O N A L T E S T I N G

@alberto_deavila

API

Page 45: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

F U N C T I O N A L T E S T I N G

@alberto_deavila

✴ To test APIs you can use RestBuilder

✴ Use authentication

✴ Parse JSON / XML responses

Page 46: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

F U N C T I O N A L T E S T I N G

@alberto_deavila

Example:

UserAPIFunctionalSpec

Page 47: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G I N G R A I L S 3 : G E B

@alberto_deavila

Page 48: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G I N G R A I L S 3 : G E B

@alberto_deavila

✴ Define:

✴ Pages: elements with jQuery style selectors

✴ Modules: reuse content

✴ Create test to navigate through app

✴ Check content visible in browser

Page 49: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G I N G R A I L S 3 : G E B

@alberto_deavila

Pages

Page 50: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

T E S T I N G I N G R A I L S 3 : G E B

@alberto_deavila

Test

Page 51: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

F U N C T I O N A L T E S T I N G

@alberto_deavila

✴ Functional test extends GebSpec

✴ You can use beans with @Autowired

✴ To create data: Entity.withNewSession

✴ @Stepwise to execute test depending on the previous

Page 52: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

F U N C T I O N A L T E S T I N G

@alberto_deavila

✴ To execute JS code: js.exec(“alert(‘hi’)“)

✴ Go to some URL with: go(URL)

✴ Go to some Page defined: to SomePage

✴ Check if we are at a Page: at SomePage

✴ Use waitFor to ensure content is loaded

✴ To define Optional content: (required: false)

Page 53: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

U N I T T E S T I N G : C O N T R O L L E R S

@alberto_deavila

Example:

UserFunctionalSpec

Page 54: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

U N I T T E S T I N G : C O N T R O L L E R S

@alberto_deavila

Exercise:

SerieFunctionalSpec

Page 55: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

I N T E G R AT I O N T E S T I N G

@alberto_deavila

Integration testing

Page 56: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

I N T E G R AT I O N T E S T I N G

@alberto_deavila

✴ Functional test extends Specification

✴ Mark @Integration to differentiate from unit

✴ Like functional: use services with @Autowired

✴ You don’t need to use @Build annotation

Page 57: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

I N T E G R AT I O N T E S T I N G

@alberto_deavila

Domain classes

Page 58: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

I N T E G R AT I O N T E S T I N G : D O M A I N C L A S S E S

@alberto_deavila

✴ Very similar to unit test

✴ You don’t need to mock domain classes :)

✴ You can check database persistence and integrity

✴ Remember to Delete your created data or use @Rollback

Page 59: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

I N T E G R AT I O N T E S T I N G : D O M A I N C L A S S E S

@alberto_deavila

Example:

UserIntegrationSpec

Page 60: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

I N T E G R AT I O N T E S T I N G : D O M A I N C L A S S E S

@alberto_deavila

Exercise:

EpisodeIntegrationSpec

Page 61: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

I N T E G R AT I O N T E S T I N G

@alberto_deavila

Services

Page 62: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

I N T E G R AT I O N T E S T I N G : S E R V I C E S

@alberto_deavila

✴ Define services with @Autowired

✴ Use it ;)

Page 63: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

I N T E G R AT I O N T E S T I N G : S E R V I C E S

@alberto_deavila

Example:

SerieServiceIntegrationSpec

Page 64: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

I N T E G R AT I O N T E S T I N G : S E R V I C E S

@alberto_deavila

Exercise:

UserServiceIntegrationSpec

Page 65: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

I N T E G R AT I O N T E S T I N G

@alberto_deavila

Controllers

Page 66: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

I N T E G R AT I O N T E S T I N G : C O N T R O L L E R S

@alberto_deavila

Grails docs:

“To integration test controllers it is recommended you use create-functional-test command to create a

Geb functional test.”

Page 67: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

I N T E G R AT I O N T E S T I N G : C O N T R O L L E R S

@alberto_deavila

✴ @Autowire Controller instance

✴ Define a bean WebApplicationContext

✴ To allow make request GrailsWebMockUtil. bindMockWebRequest (context)

Page 68: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

I N T E G R AT I O N T E S T I N G : C O N T R O L L E R S

@alberto_deavila

✴If action make redirect, ensure you have controller specified

✴ Use modelAndView to obtain

✴ View name

✴ Renderer data

Page 69: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

I N T E G R AT I O N T E S T I N G : C O N T R O L L E R S

@alberto_deavila

Example:

SerieControllerIntegrationSpec

Page 70: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

I N T E G R AT I O N T E S T I N G : C O N T R O L L E R S

@alberto_deavila

Exercise:

UserControllerIntegrationSpec

Page 71: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

Q U E S T I O N S

@alberto_deavila

That’s all!Thank you!!

Page 72: Testing Grails 3, the goob (unit), the bad (integration) and the ugly (functional)

Q U E S T I O N S

@alberto_deavila

Questions