contract testing php-pact

Post on 16-Jan-2017

327 Views

Category:

Engineering

1 Downloads

Preview:

Click to see full reader

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

top related