Applying the concept of Consumer Driven Contract Testing is useful when you are building a system that is composed of multiple decoupled services. Some of these services will provide APIs, others will consume these APIs. Consumer Driven Contract Testing is about the API consumer publishing their expectations on the API in a way that allows
- the provider of the API to verify that that it fulfils these expectations
- the consumer of the API to easily stand up a mock of the provider API to run their own tests against
If you are not already familiar with the concept, you can dive deeper into the topic by reading Frank Rosner's excellent article or visit https://pact.io/. PACT is one of the major libraries available to implement Consumer Driven Contract Tests. The examples shown in this article however are based on the Impact library.
The basic idea is, that the consuming service defines a so called Pact
that codifies the consumers expectations on the API structure & behavior:
The Pact
shown in the example above defines an HTTP API that responds to any GET
request to an URL with a path matching weatherforecast\/([a-zA-Z]+)\/(\d+)
and responds with weather forecast data.
Based on this Pact
, the consumer can stand up a test server on localhost
and run tests of the consuming service using this mocked API:
After successfully running its own tests against this mocked API, the consumer can publish the PACT to the provider as a JSON file:
The provider can now take this JSON file and run the expectations defined in that file against its own API:
Hosting the mocked API on an Azure Function
If the consuming service does not want to run the mocked provider API on localhost
- e.g. because it wants to run its own tests against a cloud hosted environment - we need a way to host the MockServer in the cloud as well. The following code snippet shows a fully working example of an Azure Function that will host an HTTP endpoint which will respond to any request as defined in the Pact
:
You can find the whole example (and more) on my GitHub repo
Top comments (0)