A small demonstration of using Pact with Ruby and Docker.
The demo contains 2 different services, a Consumer and a Provider. The code also assumes a Pact Broker as an external dependency.
Unit tests are intentionally not included to keep it simple and just show the tests needed for Pact to run.
Only two dependencies are required:
- Docker
- Docker Compose
Within the consumer or provider directories, you can run:
$ docker-compose run test
which will execute the Pact tests.
If you need to run rake tasks (eg. publishing a new version of a pact) you can run it with :
$ docker-compose run test rake pact:publish
-
Consumer Driven Contracts https://martinfowler.com/articles/consumerDrivenContracts.html
-
A provider's CI build will fail if it does not meet consumer expectations
-
More reliable service interactions
-
Fast feedback integration testing
-
No live testing environment required
-
You can only use it when you control both ends (consumer and provider)
-
It's a pain to setup, and a bit of a learning curve
-
It's hard to understand (it's the inverse of how you usually think)
-
It couples systems/services together and forces change a certain way (provider has to be changed first and requires backwards compatibility)
-
Does not work well if consumer/provider is across team boundaries (consumers can break the provider's build)
Pact Broker Middle man for pacts Can also use local pact file Documentation Versioning
Rake Consumer -> Publish to Pact Broker Provider -> Verifies against pact
Pact Helper Consumer/Provider differences Configs
Integration spec Consumer Provider
Mock server
Logging Pact.log Mock server log
Changing contracts Changing Consumer first Changing Provider first