Post on 16-Jan-2017
transcript
INTEGRATIONINTEGRATION
CONTRACT TESTING CONTRACT TESTING
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
... FROM A PREVIOUS... FROM A PREVIOUSPRESENTATION OFPRESENTATION OF
MINEMINE
WHAT WE'RE TALKINGWHAT WE'RE TALKINGABOUTABOUT
..WHATWHAT
.HOW.HOW
.HOW ABOUT NEXT.HOW ABOUT NEXT
CONSUMER DRIVENCONSUMER DRIVENCONTRACT TESTINGCONTRACT TESTING
...WEB APPLICATION...WEB APPLICATION
...WEB APPLICATION TODAY...WEB APPLICATION TODAY
HTTP APIHTTP API
HOW OUR SYSTEMS LOOKSHOW OUR SYSTEMS LOOKSLIKE?LIKE?
... AT VERY LEAST... AT VERY LEAST
... A STEP FORWARD... A STEP FORWARD
TESTING STRATEGIESTESTING STRATEGIES
CONFIDENCECONFIDENCE
FASTER&EASYFASTER&EASY
ISOLATIONISOLATION
INDEPENDENTINDEPENDENT
UNIT TEST UNIT TEST
TRIVIALTRIVIAL
FUNCTIONAL TESTFUNCTIONAL TESTISOLATED FROMISOLATED FROM
EXTERNALEXTERNALDEPENDENCIES DEPENDENCIES
STUBBING EXTERNALSTUBBING EXTERNALRESPONSES!RESPONSES!
CONSUMERCONSUMER PROVIDERPROVIDER
REMOTE BOUNDARYREMOTE BOUNDARY
STUBSSTUBS
Remember!
HTTP IS AHTTP IS APROTOCOLPROTOCOL
Remember!
A NETWORK PROTOCOLDEFINES RULES TO
ALLOWINGINTERACTIONS
BETWEEN TWO PARTS
IT'S A GOOD STUBBING?IT'S A GOOD STUBBING?
WHO ENSURE?WHO ENSURE?
IT'S A GOOD INTERACTION?IT'S A GOOD INTERACTION?
WHO ENSURE?WHO ENSURE?
NO ONENO ONE
TOO OFTEN THISTOO OFTEN THISPROCESS IS DRIVENPROCESS IS DRIVEN
BY BY HUMANSHUMANS
INTEGRATION TESTINGINTEGRATION TESTING
CONSUMERCONSUMER
END 2 END TESTINGEND 2 END TESTING
PROVIDERPROVIDER
...WEB APPLICATION TODAY...WEB APPLICATION TODAY
CONSUMERCONSUMER
END 2 END TESTING (...TODAY)END 2 END TESTING (...TODAY)PROVIDERPROVIDER
&
CONSUMERCONSUMER
PROVIDERPROVIDER
&
CONSUMERCONSUMER
PROVIDERPROVIDER
&
CONSUMERCONSUMER
STRENGHTSSTRENGHTS
WEAKNESSWEAKNESS
HARD TO TEST IN DEV ENVHARD TO TEST IN DEV ENV
SLOWSLOW
HARD TO WRITEHARD TO WRITE
HARD TO SETUPHARD TO SETUP
INTEGRATIONINTEGRATIONCONTRACT TESTINGCONTRACT TESTING
(CONSUMER DRIVEN)(CONSUMER DRIVEN)
... FROM MARTIN FOWLER... FROM MARTIN FOWLER
HTTP://MARTINFOWLER.COM/BLIKI/INTEGRATIOHTTP://MARTINFOWLER.COM/BLIKI/INTEGRATIO
NCONTRACTTEST.HTMLNCONTRACTTEST.HTML
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
... FROM MARTIN FOWLER... FROM MARTIN FOWLER
RUN YOUR CONSUMER TESTS AGAINSTRUN YOUR CONSUMER TESTS AGAINSTA TEST A TEST DOUBLEDOUBLE
RECORD CONSUMERRECORD CONSUMEREXPECTATIONSEXPECTATIONS
VERIFYVERIFYEXPECTATIONS ONEXPECTATIONS ON
PROVIDERPROVIDER
HTTPS://GITHUB.COM/REALESTATE-COM-AU/PACTHTTPS://GITHUB.COM/REALESTATE-COM-AU/PACT
PACTPACT
RUBY IMPLEMENTATIONRUBY IMPLEMENTATIONSTUBBING AND VERIFYSTUBBING AND VERIFYCONSUMER CONTRACTSCONSUMER CONTRACTS
PACTPACT
WORKING WELLWORKING WELLSPECIALLY FOR RUBYSPECIALLY FOR RUBY
PROJECTSPROJECTS
HTTPS://GITHUB.COM/REALESTATE-COM-AU/PACTHTTPS://GITHUB.COM/REALESTATE-COM-AU/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
Consumer
ProvidersCONSUMERCONSUMER
RUNS TEST LOCALLYRUNS TEST LOCALLY
RUNS TEST LOCALLYRUNS TEST LOCALLY
Providers
STUB, CREATE ANDSTUB, CREATE AND
GENERATE GENERATE CONTRACTSCONTRACTS
CONSUMERCONSUMER PROVIDERPROVIDER
CONSUMERCONSUMER
RUNS TEST LOCALLYRUNS TEST LOCALLY
Providers PROVIDERPROVIDER
STUBBING, CREATE ANDSTUBBING, CREATE AND
GENERATE GENERATE CONTRACTSCONTRACTS
SAVE SAVE CONTRACTSCONTRACTS
SOMEWHERESOMEWHERE
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 } }, ...}
LOAD CONTRACTSLOAD CONTRACTS
PROVIDERPROVIDER
FOREACH CONTRACTFOREACH CONTRACT
1. SET UP WORKING STATESET UP WORKING STATE
(DATABASE AND EXTERNAL(DATABASE AND EXTERNAL
DEPENDENCIES)DEPENDENCIES)
PROVIDERPROVIDER
LOAD CONTRACTSLOAD CONTRACTS
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
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
PACTPACT
INTEROPERABILITYINTEROPERABILITY
HOW ABOUT PHP?HOW ABOUT PHP?
OOPS! SOME ERRORS COULDOOPS! SOME ERRORS COULDOCCURS...OCCURS...
LET ME TRY LIVELET ME TRY LIVECODING...CODING...
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
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
RECAPRECAP
CONSUMER DRIVENCONSUMER DRIVENCONTRACT TEST IS ANCONTRACT TEST IS AN
ALTERNATIVE TO END TOALTERNATIVE TO END TOEND TESTEND TEST
WHENWHEN
SOA/MICROSERVICESSOA/MICROSERVICESARCHITECTUREARCHITECTURE
ONLY WHEN YOU REALLYONLY WHEN YOU REALLYNEED ITNEED IT
PACTO-PHPPACTO-PHP
IMPROVE SERVICEIMPROVE SERVICEPROVIDERPROVIDER
PACTO-PHPPACTO-PHP
IMPLEMENT CONSUMERIMPLEMENT CONSUMERSIDESIDE
Integration with Guzzle?
THANKSTHANKS