INTEGRATIONINTEGRATION
CONTRACT TESTINGCONTRACT TESTING
ABOUT MEABOUT ME
DANIELE D'ANGELIDANIELE D'ANGELI
@DANGELIDANIELE@DANGELIDANIELE
HTTP://DANIELEDANGELI.COMHTTP://DANIELEDANGELI.COM
BORN AND RAISED IN ROMEBORN AND RAISED IN ROME
2 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 PREVIOUS
PRESENTATION OFPRESENTATION OF
MINEMINE
WHAT WE'RE TALKINGWHAT WE'RE TALKING
ABOUTABOUT
..WHATWHAT
.HOW.HOW
.HOW ABOUT NEXT.HOW ABOUT NEXT
CONSUMER DRIVENCONSUMER DRIVEN
CONTRACT TESTINGCONTRACT TESTING
...WEB APPLICATION...WEB APPLICATION
...WEB APPLICATION TODAY...WEB APPLICATION TODAY
HTTP APIHTTP API
HOW OUR SYSTEMS LOOKSHOW OUR SYSTEMS LOOKS
LIKE?LIKE?
... AT VERY LEAST... AT VERY LEAST
... A STEP FORWARD... A STEP FORWARD
TESTING STRATEGIESTESTING STRATEGIES
CONFIDENCECONFIDENCE
FASTER&EASYFASTER&EASY
ISOLATIONISOLATION
INDEPENDENTINDEPENDENT
UNIT TESTUNIT TEST
TRIVIALTRIVIAL
FUNCTIONAL TESTFUNCTIONAL TEST
ISOLATED FROMISOLATED FROM
EXTERNALEXTERNAL
DEPENDENCIESDEPENDENCIES
STUBBING EXTERNALSTUBBING EXTERNAL
RESPONSES!RESPONSES!
CONSUMERCONSUMER PROVIDERPROVIDER
REMOTE BOUNDARYREMOTE BOUNDARY
STUBSSTUBS
Remember!
HTTP IS AHTTP IS A
PROTOCOLPROTOCOL
Remember!
A NETWORK PROTOCOL
DEFINES RULES TO
ALLOWING
INTERACTIONS
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 THIS
PROCESS IS DRIVENPROCESS IS DRIVEN
BYBY 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
INTEGRATIONINTEGRATION
CONTRACT 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 FORIS A GENERIC TERM FOR
ANY CASE WHERE YOU REPLACE AANY CASE WHERE YOU REPLACE A
PRODUCTION OBJECT FOR TESTINGPRODUCTION OBJECT FOR TESTING
PURPOSES.PURPOSES.
... FROM MARTIN FOWLER... FROM MARTIN FOWLER
... FROM MARTIN FOWLER... FROM MARTIN FOWLER
RUN YOUR CONSUMER TESTS AGAINSTRUN YOUR CONSUMER TESTS AGAINST
A TESTA TEST DOUBLEDOUBLE
RECORD CONSUMERRECORD CONSUMER
EXPECTATIONSEXPECTATIONS
VERIFYVERIFY
EXPECTATIONS ONEXPECTATIONS ON
PROVIDERPROVIDER
HTTPS://GITHUB.COM/REALESTATE-COM-AU/PACTHTTPS://GITHUB.COM/REALESTATE-COM-AU/PACT
PACTPACT
RUBY IMPLEMENTATIONRUBY IMPLEMENTATION​​
STUBBING AND VERIFYSTUBBING AND VERIFY
CONSUMER CONTRACTSCONSUMER CONTRACTS
PACTPACT
WORKING WELLWORKING WELL
SPECIALLY 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
GENERATEGENERATE CONTRACTSCONTRACTS
CONSUMERCONSUMER PROVIDERPROVIDER
CONSUMERCONSUMER
RUNS TEST LOCALLYRUNS TEST LOCALLY
Providers PROVIDERPROVIDER
STUBBING, CREATE ANDSTUBBING, CREATE AND
GENERATEGENERATE CONTRACTSCONTRACTS
SAVESAVE 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 COULD
OCCURS...OCCURS...
LET ME TRY LIVELET ME TRY LIVE
CODING...CODING...
PACT-PHP [PROVIDER]PACT-PHP [PROVIDER]
PARSE CONTRACTSPARSE CONTRACTS
LOAD STATELOAD STATE
PARSE AND CREATEPARSE AND CREATE
PSR7PSR7 REQUESTREQUEST
PROVIDER APIPROVIDER API
CREATECREATE
PSR7PSR7 RESPONSERESPONSE
VERIFY EXPECTEDVERIFY EXPECTED
PSR7PSR7 RESPONSERESPONSE
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 DRIVEN
CONTRACT TEST IS ANCONTRACT TEST IS AN
ALTERNATIVE TO END TOALTERNATIVE TO END TO
END TESTEND TEST
WHENWHEN
SOA/MICROSERVICESSOA/MICROSERVICES
ARCHITECTUREARCHITECTURE
ONLY WHEN YOU REALLYONLY WHEN YOU REALLY
NEED ITNEED IT
PACTO-PHPPACTO-PHP
IMPROVE SERVICEIMPROVE SERVICE
PROVIDERPROVIDER
PACTO-PHPPACTO-PHP
IMPLEMENT CONSUMERIMPLEMENT CONSUMER
SIDESIDE
Integration with Guzzle?
THANKSTHANKS

Contract Testing Php-pact