contract testing php-pact

62
INTEGRATION INTEGRATION CONTRACT TESTING CONTRACT TESTING

Upload: daniele-dangeli

Post on 16-Jan-2017

327 views

Category:

Engineering


1 download

TRANSCRIPT

Page 1: Contract Testing Php-pact

INTEGRATIONINTEGRATION

CONTRACT TESTING CONTRACT TESTING

Page 2: Contract Testing Php-pact

ABOUT MEABOUT ME

DANIELE D'ANGELIDANIELE D'ANGELI

@DANGELIDANIELE@DANGELIDANIELE

HTTP://DANIELEDANGELI.COMHTTP://DANIELEDANGELI.COM

BORN AND RAISED IN ROMEBORN AND RAISED IN ROME2 YEARS IN LONDON2 YEARS IN LONDON

ACTUALLY I'M WORKING WITHACTUALLY I'M WORKING WITH

@ADESPRESSO, IN ROME WITH@ADESPRESSO, IN ROME WITH

Page 3: Contract Testing Php-pact

... FROM A PREVIOUS... FROM A PREVIOUSPRESENTATION OFPRESENTATION OF

MINEMINE

Page 4: Contract Testing Php-pact
Page 5: Contract Testing Php-pact

WHAT WE'RE TALKINGWHAT WE'RE TALKINGABOUTABOUT

Page 6: Contract Testing Php-pact

..WHATWHAT

.HOW.HOW

.HOW ABOUT NEXT.HOW ABOUT NEXT

CONSUMER DRIVENCONSUMER DRIVENCONTRACT TESTINGCONTRACT TESTING

Page 7: Contract Testing Php-pact

...WEB APPLICATION...WEB APPLICATION

Page 8: Contract Testing Php-pact

...WEB APPLICATION TODAY...WEB APPLICATION TODAY

Page 9: Contract Testing Php-pact

HTTP APIHTTP API

Page 10: Contract Testing Php-pact

HOW OUR SYSTEMS LOOKSHOW OUR SYSTEMS LOOKSLIKE?LIKE?

Page 11: Contract Testing Php-pact

... AT VERY LEAST... AT VERY LEAST

Page 12: Contract Testing Php-pact

... A STEP FORWARD... A STEP FORWARD

Page 13: Contract Testing Php-pact

TESTING STRATEGIESTESTING STRATEGIES

CONFIDENCECONFIDENCE

FASTER&EASYFASTER&EASY

Page 14: Contract Testing Php-pact

ISOLATIONISOLATION

Page 15: Contract Testing Php-pact

INDEPENDENTINDEPENDENT

UNIT TEST UNIT TEST

TRIVIALTRIVIAL

Page 16: Contract Testing Php-pact

FUNCTIONAL TESTFUNCTIONAL TESTISOLATED FROMISOLATED FROM

EXTERNALEXTERNALDEPENDENCIES DEPENDENCIES

Page 17: Contract Testing Php-pact

STUBBING EXTERNALSTUBBING EXTERNALRESPONSES!RESPONSES!

Page 18: Contract Testing Php-pact

CONSUMERCONSUMER PROVIDERPROVIDER

REMOTE BOUNDARYREMOTE BOUNDARY

STUBSSTUBS

Page 19: Contract Testing Php-pact

Remember!

HTTP IS AHTTP IS APROTOCOLPROTOCOL

Page 20: Contract Testing Php-pact

Remember!

A NETWORK PROTOCOLDEFINES RULES TO

ALLOWINGINTERACTIONS

BETWEEN TWO PARTS

Page 21: Contract Testing Php-pact

IT'S A GOOD STUBBING?IT'S A GOOD STUBBING?

WHO ENSURE?WHO ENSURE?

Page 22: Contract Testing Php-pact

IT'S A GOOD INTERACTION?IT'S A GOOD INTERACTION?

WHO ENSURE?WHO ENSURE?

Page 23: Contract Testing Php-pact
Page 24: Contract Testing Php-pact

NO ONENO ONE

Page 25: Contract Testing Php-pact

TOO OFTEN THISTOO OFTEN THISPROCESS IS DRIVENPROCESS IS DRIVEN

BY BY HUMANSHUMANS

Page 26: Contract Testing Php-pact
Page 27: Contract Testing Php-pact
Page 28: Contract Testing Php-pact

INTEGRATION TESTINGINTEGRATION TESTING

Page 29: Contract Testing Php-pact

CONSUMERCONSUMER

END 2 END TESTINGEND 2 END TESTING

PROVIDERPROVIDER

Page 30: Contract Testing Php-pact

...WEB APPLICATION TODAY...WEB APPLICATION TODAY

Page 31: Contract Testing Php-pact

CONSUMERCONSUMER

END 2 END TESTING (...TODAY)END 2 END TESTING (...TODAY)PROVIDERPROVIDER

&

CONSUMERCONSUMER

PROVIDERPROVIDER

&

CONSUMERCONSUMER

PROVIDERPROVIDER

&

CONSUMERCONSUMER

Page 32: Contract Testing Php-pact

STRENGHTSSTRENGHTS

Page 33: Contract Testing Php-pact

WEAKNESSWEAKNESS

HARD TO TEST IN DEV ENVHARD TO TEST IN DEV ENV

SLOWSLOW

HARD TO WRITEHARD TO WRITE

HARD TO SETUPHARD TO SETUP

Page 34: Contract Testing Php-pact

INTEGRATIONINTEGRATIONCONTRACT TESTINGCONTRACT TESTING

(CONSUMER DRIVEN)(CONSUMER DRIVEN)

Page 35: Contract Testing Php-pact

... FROM MARTIN FOWLER... FROM MARTIN FOWLER

HTTP://MARTINFOWLER.COM/BLIKI/INTEGRATIOHTTP://MARTINFOWLER.COM/BLIKI/INTEGRATIO

NCONTRACTTEST.HTMLNCONTRACTTEST.HTML

Page 36: Contract Testing Php-pact

Remember!

TESTTEST DOUBLEDOUBLE IS A GENERIC TERM FOR IS A GENERIC TERM FORANY CASE WHERE YOU REPLACE AANY CASE WHERE YOU REPLACE A

PRODUCTION OBJECT FOR TESTINGPRODUCTION OBJECT FOR TESTINGPURPOSES.PURPOSES.

... FROM MARTIN FOWLER... FROM MARTIN FOWLER

Page 37: Contract Testing Php-pact

... FROM MARTIN FOWLER... FROM MARTIN FOWLER

RUN YOUR CONSUMER TESTS AGAINSTRUN YOUR CONSUMER TESTS AGAINSTA TEST A TEST DOUBLEDOUBLE

Page 38: Contract Testing Php-pact

RECORD CONSUMERRECORD CONSUMEREXPECTATIONSEXPECTATIONS

Page 39: Contract Testing Php-pact

VERIFYVERIFYEXPECTATIONS ONEXPECTATIONS ON

PROVIDERPROVIDER

Page 40: Contract Testing Php-pact

HTTPS://GITHUB.COM/REALESTATE-COM-AU/PACTHTTPS://GITHUB.COM/REALESTATE-COM-AU/PACT

PACTPACT

RUBY IMPLEMENTATIONRUBY IMPLEMENTATIONSTUBBING AND VERIFYSTUBBING AND VERIFYCONSUMER CONTRACTSCONSUMER CONTRACTS

Page 41: Contract Testing Php-pact

PACTPACT

WORKING WELLWORKING WELLSPECIALLY FOR RUBYSPECIALLY FOR RUBY

PROJECTSPROJECTS

HTTPS://GITHUB.COM/REALESTATE-COM-AU/PACTHTTPS://GITHUB.COM/REALESTATE-COM-AU/PACT

Page 42: Contract Testing Php-pact

PACTPACT

HTTPS://GITHUB.COM/SEEK-JOBS/PACT-GOHTTPS://GITHUB.COM/SEEK-JOBS/PACT-GO

HTTPS://GITHUB.COM/SEEK-JOBS/PACT-NETHTTPS://GITHUB.COM/SEEK-JOBS/PACT-NET

HTTPS://GITHUB.COM/DIUS/PACT-JVMHTTPS://GITHUB.COM/DIUS/PACT-JVM

HTTPS://GITHUB.COM/REALESTATE-COM-AU/PACTHTTPS://GITHUB.COM/REALESTATE-COM-AU/PACT

Page 43: Contract Testing Php-pact

Consumer

Page 44: Contract Testing Php-pact

ProvidersCONSUMERCONSUMER

RUNS TEST LOCALLYRUNS TEST LOCALLY

Page 45: Contract Testing Php-pact

RUNS TEST LOCALLYRUNS TEST LOCALLY

Providers

STUB, CREATE ANDSTUB, CREATE AND

GENERATE GENERATE CONTRACTSCONTRACTS

CONSUMERCONSUMER PROVIDERPROVIDER

Page 46: Contract Testing Php-pact

CONSUMERCONSUMER

RUNS TEST LOCALLYRUNS TEST LOCALLY

Providers PROVIDERPROVIDER

STUBBING, CREATE ANDSTUBBING, CREATE AND

GENERATE GENERATE CONTRACTSCONTRACTS

SAVE SAVE CONTRACTSCONTRACTS

SOMEWHERESOMEWHERE

Page 47: Contract Testing Php-pact

ARTIFACTSARTIFACTS{ "consumer": { "name": "collaborator client" }, "provider": { "name": "collaborator api" }, "interactions": [ { "provider_state": "there is a collaborator with id 23", "description": "get collaborator", "request": { "headers": { "Accept": "application/json" }, "method": "GET", "path": "/collaborators/23" }, "response": { "body": { "name": "John", "role": "Client Relantionship" }, "headers": { "Content-Type": "application/json" }, "status": 200 } }, ...}

Page 48: Contract Testing Php-pact

LOAD CONTRACTSLOAD CONTRACTS

PROVIDERPROVIDER

Page 49: Contract Testing Php-pact

FOREACH CONTRACTFOREACH CONTRACT

1. SET UP WORKING STATESET UP WORKING STATE

(DATABASE AND EXTERNAL(DATABASE AND EXTERNAL

DEPENDENCIES)DEPENDENCIES)

PROVIDERPROVIDER

LOAD CONTRACTSLOAD CONTRACTS

Page 50: Contract Testing Php-pact

1. SET UP WORKING STATESET UP WORKING STATE

(DATABASE AND EXTERNAL(DATABASE AND EXTERNAL

DEPENDENCIES)DEPENDENCIES)

2. MAKE INTERNAL HTTP CALLMAKE INTERNAL HTTP CALL

(BASED ON CONTRACT)(BASED ON CONTRACT)

LOAD CONTRACTSLOAD CONTRACTS

FOREACH CONTRACTFOREACH CONTRACT

PROVIDERPROVIDER

Page 51: Contract Testing Php-pact

1. SET UP WORKING STATESET UP WORKING STATE

(DATABASE AND EXTERNAL(DATABASE AND EXTERNAL

DEPENDENCIES)DEPENDENCIES)

2. MAKE INTERNAL HTTP CALLMAKE INTERNAL HTTP CALL

(BASED ON CONTRACT)(BASED ON CONTRACT)

3. VERIFY RESPONSEVERIFY RESPONSE

FOREACH CONTRACTFOREACH CONTRACT

LOAD CONTRACTSLOAD CONTRACTS

PROVIDERPROVIDER

Page 52: Contract Testing Php-pact

PACTPACT

INTEROPERABILITYINTEROPERABILITY

Page 53: Contract Testing Php-pact

HOW ABOUT PHP?HOW ABOUT PHP?

Page 54: Contract Testing Php-pact
Page 55: Contract Testing Php-pact

OOPS! SOME ERRORS COULDOOPS! SOME ERRORS COULDOCCURS...OCCURS...

LET ME TRY LIVELET ME TRY LIVECODING...CODING...

Page 56: Contract Testing Php-pact

PACT-PHP [PROVIDER]PACT-PHP [PROVIDER]

PARSE CONTRACTSPARSE CONTRACTS

LOAD STATELOAD STATE

PARSE AND CREATEPARSE AND CREATE

PSR7PSR7 REQUEST REQUEST

PROVIDER APIPROVIDER API

CREATECREATE

PSR7 PSR7 RESPONSERESPONSE

VERIFY EXPECTEDVERIFY EXPECTED

PSR7PSR7 RESPONSE RESPONSE

Page 57: Contract Testing Php-pact

PACT-PHP [PROVIDER]PACT-PHP [PROVIDER]

/** * @param \Closure $makeRequest How make a ps7Request * @param \Closure $setUp Setup the test state * @param \Closure $tearDown Setup up back the state */ public function honorContracts( \Closure $makeRequest, \Closure $setUp, \Closure $tearDown )

FRAMEWORK INDEPENDENTFRAMEWORK INDEPENDENT

Page 58: Contract Testing Php-pact

RECAPRECAP

CONSUMER DRIVENCONSUMER DRIVENCONTRACT TEST IS ANCONTRACT TEST IS AN

ALTERNATIVE TO END TOALTERNATIVE TO END TOEND TESTEND TEST

Page 59: Contract Testing Php-pact

WHENWHEN

SOA/MICROSERVICESSOA/MICROSERVICESARCHITECTUREARCHITECTURE

ONLY WHEN YOU REALLYONLY WHEN YOU REALLYNEED ITNEED IT

Page 60: Contract Testing Php-pact

PACTO-PHPPACTO-PHP

IMPROVE SERVICEIMPROVE SERVICEPROVIDERPROVIDER

Page 61: Contract Testing Php-pact

PACTO-PHPPACTO-PHP

IMPLEMENT CONSUMERIMPLEMENT CONSUMERSIDESIDE

Integration with Guzzle?

Page 62: Contract Testing Php-pact

THANKSTHANKS