Consumer Driven Contracts and
Your Microservice Architecture
Marcin Grzejszczak Adib Saikali
@mgrzejszczak @asaikali
1
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
About Marcin
Spring Cloud developer at Pivotal working mostly on
● Spring Cloud Sleuth
● Spring Cloud Contract
● Spring Cloud Pipelines
Connect with me
● Twitter: @mgrzejszczak
● Blog: http://toomuchcoding.com
2
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Advisory Platform Architect at Pivotal helping customers
● Adopt cloud native application architecture patterns
● Define strategy for modernizing legacy monolithic apps
● Succeed with PCF
Connect with me
● Twitter: @asaikali
About Adib
3
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Just Another Day at Work
4
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
How the code is currently organized
5
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Application Architecture
6
Legacy
service
Customer Rental
History Service
Payment
processor
Mainframe
Audit service
Insurance
service
● Interservice calls are over http
● Legacy service that is hard to test due the dependencies it
has on other downstream services
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Testing Strategy - Hard Coded Object Stubs
7
Legacy
service
Customer Rental
History Service
Payment
processor
Mainframe
Audit service
insurance
service
Hard coded
Customer
Rental History
Service Stub
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Problems with hand coding stubs
8
● 1225 line JSON response
● Hard to keep hard coded
stub in sync with the api
being stubbed
● Stub does not test that
requests are made
correctly to the remote
service
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Let’s see some code
https://github.com/marcingrzejszczak/the-legacy-app
9
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Generating Stubs From Contracts
10
Contract.make {
description """
should return a list of a charges
"""
request {
urlPath("/v1/charges") {
queryParameters {
parameter("limit", 25)
}
}
method GET()
}
response {
status 200
body($(consumer(file("charges.json")),
producer(execute('assertResponse($it)'))))
}
}
Spring Cloud
Contract
Maven/Gradle
Plugin
Wiremock stub
definition stored in
-stubs.jar
OutputsReads
Stub jar files are published to a maven repo
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Testing Strategy - Auto Generated Remote Stub
11
Legacy
service
Customer Rental
History Service
Payment
processor
Mainframe
Audit service
insurance
service
Auto-generated
Customer Rental
History Service Stub
Stubs can be launched on specified a port number using
the @AutoConfigureStubRunner annotation on test classesAudit Service
integration test
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Spring Cloud Contract Auto-Generated Stub Workflow
12
01
02
03
04
Developer
codes a contract defining
the interaction between
a consumer and the API
using the Spring Cloud
Contract Groovy DSL
Spring Cloud Contract
Maven/gradle plugin
generates wiremock stubs
from contract definitions
packaged in -stubs.jar
published in a maven
repository
CI/CD Server runs tests
Spring Cloud Contract starts
wiremock during the test
execution and configures it
with the scenario specified
by the contract
Developer writes an
integration test and
annotates it with
@AutoConfigureStubRunner
specifying the port number
for the stub to run on
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
How to involve other teams?
https://github.com/marcingrzejszczak/2017-s1p-external-contracts
13
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Spring Cloud Contract plugin
does more than that...
14
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Generating Stubs & Tests From Contracts
15
Contract.make {
description """
should return a list of a charges
"""
request {
urlPath("/v1/charges") {
queryParameters {
parameter("limit", 25)
}
}
method GET()
}
response {
status 200
body($(consumer(file("charges.json")),
producer(execute('assertResponse($it)'))))
}
}
Spring Cloud
Contract
Maven Plugin
Generates
Wiremock stub
definition stored in
-stubs.jar
Reads
Stub jar files are published to a maven repo
junit integration
tests that execute
the contract against
the api
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Testing Strategy - Auto Generated tests & stubs
16
Legacy
service
Customer Rental
History Service
Payment
processor
Mainframe
Audit service
Insurance
service
Auto-generated
Legacy Service Stub
Stubs can be launched on specified a port number using
the @AutoConfigureStubRunner annotation on test classes
Auto-generated
junit integration tests
Auto-generated
Legacy Service Stub
Auto-generated
stubs
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Producer of an API
● Accept pull requests from consumers
containing contract definitions
● Add spring cloud contract maven/gradle
plugin to the build file
● Run generated contract integration tests
against api
● Publish generated -stubs.jar files to the
maven repo
Spring Cloud Contract Workflow
Consumer of an API
● Write a contract that defines the
interaction with the API
● Send a pull request to the producer to
contribute the consumer contract
● Write integration tests that uses the
generated wiremock stubs
● Run integration tests as part of CD
pipeline
17
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Hard Problems
● How can something be added to a service without breaking the clients?
● How can something be removed from a service without breaking the clients?
● How can a service developer find out how clients are using their service?
● How to enable short release cycles and continuous delivery of services?
18
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Service Evolution Patterns
● Single Message Argument
● Dataset Amendment
● Tolerant Reader
● Schema Versioning
● Extension Points
● Consumer-Driven Contracts
19
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Provider Contract
• The implementer of a service defines the interface of the
service everyone uses the same interface
20
Service
Client A
Client B
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Consumer Contract
● The consumer of a service defines their interface to the service within the
conventions / spirit of provider contract
21
Service
Client A
Client B
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Consumer Driven Contracts Workflow
● Every consumer of a service must write an executable integration test that
defines how the consumer uses the service
● Each test must only test what the client cares about
● Consumer tests are sent as pull requests to the service producer
22
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Consumer Driven Contracts
23
Source: http://martinfowler.com/articles/consumerDrivenContracts.html
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Consumer Driven Contracts
24
http://www.servicedesignpatterns.com/WebServiceEvolution/ConsumerDrivenContracts
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Benefits of Consumer Driven Contracts
● Align service providers with the business goals of their consumer through the
consumer driven contracts
● Provide insights into how a service is being used by its consumers
● Make evolving services easier by reducing the amount of co-ordination
required to evolve interfaces
● Help in the configuration of continuous delivery pipelines
○ Spring Cloud Pipelines - https://cloud.spring.io/spring-cloud-pipelines/
25
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Generating Stubs & Tests From Contracts
26
Contract.make {
description """
should return a list of a charges
"""
request {
urlPath("/v1/charges") {
queryParameters {
parameter("limit", 25)
}
}
method GET()
}
response {
status 200
body($(consumer(file("charges.json")),
producer(execute('assertResponse($it)'))))
}
}
Spring Cloud
Contract
Maven Plugin
Generates
Wiremock stub
definition stored in
-stubs.jar
Reads
Stub jar files are published to a maven repo
junit integration
tests that execute
the contract against
the api
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TheLegacyApp.class,
properties = "api.url=http://localhost:8765",
webEnvironment = NONE)
@AutoConfigureStubRunner(
ids = "com.example:the-legacy-app-stubs:+:stubs:8765"
, workOffline = true
)
public class CustomerWithStubRunnerTests {
@Autowired CustomerRentalHistoryManager manager;
@Test
public void should_return_charge_collection() {
Charges charges = manager.listAllCharges("foo");
BDDAssertions.then(charges.getCharges())
.hasSize(25);
}
}
Using Stubs on the Client Side
27
Stub Runner
Automatically runs a
WireMock server
and feeds it with
stubs
downloads the JAR
with the stubs or
uses classpath to
find them
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
● Messaging (Spring Integration / Stream / Apache Camel)
● Integration with Spring Mock MVC
● Maven and Gradle plugins
● Scenarios
● Dynamic pieces
● Stub Runner Boot
● JUnit rule
● Spring Cloud integration
● Pact support
What else
28
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Messaging
29
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
MockMvc
30
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Maven & Gradle
31
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Scenarios
32
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Dynamic Pieces
33
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Dynamic Pieces
34
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
NodeJs app
35
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Doesn’t work
36
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Stub Runner Boot
37
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Run Stub Runner Boot (java -jar)
38
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Run Stub Runner Boot (Spring Cloud Cli)
39
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Run Stub Runner Boot (Spring Cloud Cli)
40
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
NodeJs works
41
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Not a Spring app? JUnit Rule FTW!
42
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Spring Cloud integration
43
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Pact support
44
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 45
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Learn More. Stay Connected.
▪ Read the docs
http://cloud.spring.io/spring-cloud-contract/
▪ Talk to us on Gitter
https://gitter.im/spring-cloud/spring-cloud-contract
Twitter: twitter.com/springcentral
YouTube: spring.io/video
LinkedIn: spring.io/linkedin
Google Plus: spring.io/gplus
46
Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-
NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Disclaimer Statement
The following is intended to outline the general direction of Pivotal's offerings. It is
intended for information purposes only and may not be incorporated into any
contract. Any information regarding pre-release of Pivotal offerings, future updates
or other planned modifications is subject to ongoing evaluation by Pivotal and is
subject to change. This information is provided without warranty or any kind,
express or implied, and is not a commitment to deliver any material, code, or
functionality, and should not be relied upon in making purchasing decisions
regarding Pivotal's offerings. These purchasing decisions should only be based on
features currently available. The development, release, and timing of any features
or functionality described for Pivotal's offerings in this presentation remain at the
sole discretion of Pivotal. Pivotal has no obligation to update forward looking
information in this presentation.
47
asaikali
mgrzejszczak

Consumer Driven Contracts and Your Microservice Architecture

  • 1.
    Consumer Driven Contractsand Your Microservice Architecture Marcin Grzejszczak Adib Saikali @mgrzejszczak @asaikali 1
  • 2.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ About Marcin Spring Cloud developer at Pivotal working mostly on ● Spring Cloud Sleuth ● Spring Cloud Contract ● Spring Cloud Pipelines Connect with me ● Twitter: @mgrzejszczak ● Blog: http://toomuchcoding.com 2
  • 3.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Advisory Platform Architect at Pivotal helping customers ● Adopt cloud native application architecture patterns ● Define strategy for modernizing legacy monolithic apps ● Succeed with PCF Connect with me ● Twitter: @asaikali About Adib 3
  • 4.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Just Another Day at Work 4
  • 5.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ How the code is currently organized 5
  • 6.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Application Architecture 6 Legacy service Customer Rental History Service Payment processor Mainframe Audit service Insurance service ● Interservice calls are over http ● Legacy service that is hard to test due the dependencies it has on other downstream services
  • 7.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Testing Strategy - Hard Coded Object Stubs 7 Legacy service Customer Rental History Service Payment processor Mainframe Audit service insurance service Hard coded Customer Rental History Service Stub
  • 8.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Problems with hand coding stubs 8 ● 1225 line JSON response ● Hard to keep hard coded stub in sync with the api being stubbed ● Stub does not test that requests are made correctly to the remote service
  • 9.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Let’s see some code https://github.com/marcingrzejszczak/the-legacy-app 9
  • 10.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Generating Stubs From Contracts 10 Contract.make { description """ should return a list of a charges """ request { urlPath("/v1/charges") { queryParameters { parameter("limit", 25) } } method GET() } response { status 200 body($(consumer(file("charges.json")), producer(execute('assertResponse($it)')))) } } Spring Cloud Contract Maven/Gradle Plugin Wiremock stub definition stored in -stubs.jar OutputsReads Stub jar files are published to a maven repo
  • 11.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Testing Strategy - Auto Generated Remote Stub 11 Legacy service Customer Rental History Service Payment processor Mainframe Audit service insurance service Auto-generated Customer Rental History Service Stub Stubs can be launched on specified a port number using the @AutoConfigureStubRunner annotation on test classesAudit Service integration test
  • 12.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring Cloud Contract Auto-Generated Stub Workflow 12 01 02 03 04 Developer codes a contract defining the interaction between a consumer and the API using the Spring Cloud Contract Groovy DSL Spring Cloud Contract Maven/gradle plugin generates wiremock stubs from contract definitions packaged in -stubs.jar published in a maven repository CI/CD Server runs tests Spring Cloud Contract starts wiremock during the test execution and configures it with the scenario specified by the contract Developer writes an integration test and annotates it with @AutoConfigureStubRunner specifying the port number for the stub to run on
  • 13.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ How to involve other teams? https://github.com/marcingrzejszczak/2017-s1p-external-contracts 13
  • 14.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring Cloud Contract plugin does more than that... 14
  • 15.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Generating Stubs & Tests From Contracts 15 Contract.make { description """ should return a list of a charges """ request { urlPath("/v1/charges") { queryParameters { parameter("limit", 25) } } method GET() } response { status 200 body($(consumer(file("charges.json")), producer(execute('assertResponse($it)')))) } } Spring Cloud Contract Maven Plugin Generates Wiremock stub definition stored in -stubs.jar Reads Stub jar files are published to a maven repo junit integration tests that execute the contract against the api
  • 16.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Testing Strategy - Auto Generated tests & stubs 16 Legacy service Customer Rental History Service Payment processor Mainframe Audit service Insurance service Auto-generated Legacy Service Stub Stubs can be launched on specified a port number using the @AutoConfigureStubRunner annotation on test classes Auto-generated junit integration tests Auto-generated Legacy Service Stub Auto-generated stubs
  • 17.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Producer of an API ● Accept pull requests from consumers containing contract definitions ● Add spring cloud contract maven/gradle plugin to the build file ● Run generated contract integration tests against api ● Publish generated -stubs.jar files to the maven repo Spring Cloud Contract Workflow Consumer of an API ● Write a contract that defines the interaction with the API ● Send a pull request to the producer to contribute the consumer contract ● Write integration tests that uses the generated wiremock stubs ● Run integration tests as part of CD pipeline 17
  • 18.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Hard Problems ● How can something be added to a service without breaking the clients? ● How can something be removed from a service without breaking the clients? ● How can a service developer find out how clients are using their service? ● How to enable short release cycles and continuous delivery of services? 18
  • 19.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Service Evolution Patterns ● Single Message Argument ● Dataset Amendment ● Tolerant Reader ● Schema Versioning ● Extension Points ● Consumer-Driven Contracts 19
  • 20.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Provider Contract • The implementer of a service defines the interface of the service everyone uses the same interface 20 Service Client A Client B
  • 21.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Consumer Contract ● The consumer of a service defines their interface to the service within the conventions / spirit of provider contract 21 Service Client A Client B
  • 22.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Consumer Driven Contracts Workflow ● Every consumer of a service must write an executable integration test that defines how the consumer uses the service ● Each test must only test what the client cares about ● Consumer tests are sent as pull requests to the service producer 22
  • 23.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Consumer Driven Contracts 23 Source: http://martinfowler.com/articles/consumerDrivenContracts.html
  • 24.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Consumer Driven Contracts 24 http://www.servicedesignpatterns.com/WebServiceEvolution/ConsumerDrivenContracts
  • 25.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Benefits of Consumer Driven Contracts ● Align service providers with the business goals of their consumer through the consumer driven contracts ● Provide insights into how a service is being used by its consumers ● Make evolving services easier by reducing the amount of co-ordination required to evolve interfaces ● Help in the configuration of continuous delivery pipelines ○ Spring Cloud Pipelines - https://cloud.spring.io/spring-cloud-pipelines/ 25
  • 26.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Generating Stubs & Tests From Contracts 26 Contract.make { description """ should return a list of a charges """ request { urlPath("/v1/charges") { queryParameters { parameter("limit", 25) } } method GET() } response { status 200 body($(consumer(file("charges.json")), producer(execute('assertResponse($it)')))) } } Spring Cloud Contract Maven Plugin Generates Wiremock stub definition stored in -stubs.jar Reads Stub jar files are published to a maven repo junit integration tests that execute the contract against the api
  • 27.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ @RunWith(SpringRunner.class) @SpringBootTest(classes = TheLegacyApp.class, properties = "api.url=http://localhost:8765", webEnvironment = NONE) @AutoConfigureStubRunner( ids = "com.example:the-legacy-app-stubs:+:stubs:8765" , workOffline = true ) public class CustomerWithStubRunnerTests { @Autowired CustomerRentalHistoryManager manager; @Test public void should_return_charge_collection() { Charges charges = manager.listAllCharges("foo"); BDDAssertions.then(charges.getCharges()) .hasSize(25); } } Using Stubs on the Client Side 27 Stub Runner Automatically runs a WireMock server and feeds it with stubs downloads the JAR with the stubs or uses classpath to find them
  • 28.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ● Messaging (Spring Integration / Stream / Apache Camel) ● Integration with Spring Mock MVC ● Maven and Gradle plugins ● Scenarios ● Dynamic pieces ● Stub Runner Boot ● JUnit rule ● Spring Cloud integration ● Pact support What else 28
  • 29.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Messaging 29
  • 30.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ MockMvc 30
  • 31.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Maven & Gradle 31
  • 32.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Scenarios 32
  • 33.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Dynamic Pieces 33
  • 34.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Dynamic Pieces 34
  • 35.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ NodeJs app 35
  • 36.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Doesn’t work 36
  • 37.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Stub Runner Boot 37
  • 38.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Run Stub Runner Boot (java -jar) 38
  • 39.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Run Stub Runner Boot (Spring Cloud Cli) 39
  • 40.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Run Stub Runner Boot (Spring Cloud Cli) 40
  • 41.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ NodeJs works 41
  • 42.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Not a Spring app? JUnit Rule FTW! 42
  • 43.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring Cloud integration 43
  • 44.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Pact support 44
  • 45.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 45
  • 46.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Learn More. Stay Connected. ▪ Read the docs http://cloud.spring.io/spring-cloud-contract/ ▪ Talk to us on Gitter https://gitter.im/spring-cloud/spring-cloud-contract Twitter: twitter.com/springcentral YouTube: spring.io/video LinkedIn: spring.io/linkedin Google Plus: spring.io/gplus 46
  • 47.
    Unless otherwise indicated,these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution- NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Disclaimer Statement The following is intended to outline the general direction of Pivotal's offerings. It is intended for information purposes only and may not be incorporated into any contract. Any information regarding pre-release of Pivotal offerings, future updates or other planned modifications is subject to ongoing evaluation by Pivotal and is subject to change. This information is provided without warranty or any kind, express or implied, and is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions regarding Pivotal's offerings. These purchasing decisions should only be based on features currently available. The development, release, and timing of any features or functionality described for Pivotal's offerings in this presentation remain at the sole discretion of Pivotal. Pivotal has no obligation to update forward looking information in this presentation. 47
  • 48.