Package Usage: go: github.com/pact-foundation/pact-go/v2
Pact Go enables consumer driven contract testing, providing a mock service and
DSL for the consumer project, and interaction playback and verification
for the service provider project.
Consumer side Pact testing is an isolated test that ensures a given component
is able to collaborate with another (remote) component. Pact will automatically
start a Mock server in the background that will act as the collaborators' test
double.
This implies that any interactions expected on the Mock server will be validated,
meaning a test will fail if all interactions were not completed, or if unexpected
interactions were found:
A typical consumer-side test would look something like this:
If this test completed successfully, a Pact file should have been written to
./pacts/my_consumer-my_provider.json containing all of the interactions
expected to occur between the Consumer and Provider.
In addition to verbatim value matching, you have 3 useful matching functions
in the `dsl` package that can increase expressiveness and reduce brittle test
cases.
Here is a complex example that shows how all 3 terms can be used together:
This example will result in a response body from the mock server that looks like:
See the examples in the dsl package and the matcher tests
(https://github.com/pact-foundation/pact-go/v2/blob/master/dsl/matcher_test.go)
for more matching examples.
NOTE: You will need to use valid Ruby regular expressions
(http://ruby-doc.org/core-2.1.5/Regexp.html) and double escape backslashes.
Read more about flexible matching (https://github.com/pact-foundation/pact-ruby/wiki/Regular-expressions-and-type-matching-with-Pact.
Provider side Pact testing, involves verifying that the contract - the Pact file
- can be satisfied by the Provider.
A typical Provider side test would like something like:
The `VerifyProvider` will handle all verifications, treating them as subtests
and giving you granular test reporting. If you don't like this behaviour, you may
call `VerifyProviderRaw` directly and handle the errors manually.
Note that `PactURLs` may be a list of local pact files or remote based
urls (possibly from a Pact Broker
- http://docs.pact.io/documentation/sharings_pacts.html).
Pact reads the specified pact files (from remote or local sources) and replays
the interactions against a running Provider. If all of the interactions are met
we can say that both sides of the contract are satisfied and the test passes.
When validating a Provider, you have 3 options to provide the Pact files:
1. Use "PactURLs" to specify the exact set of pacts to be replayed:
Options 2 and 3 are particularly useful when you want to validate that your
Provider is able to meet the contracts of what's in Production and also the latest
in development.
See this [article](http://rea.tech/enter-the-pact-matrix-or-how-to-decouple-the-release-cycles-of-your-microservices/)
for more on this strategy.
Each interaction in a pact should be verified in isolation, with no context
maintained from the previous interactions. So how do you test a request that
requires data to exist on the provider? Provider states are how you achieve
this using Pact.
Provider states also allow the consumer to make the same request with different
expected responses (e.g. different response codes, or the same resource with a
different subset of data).
States are configured on the consumer side when you issue a dsl.Given() clause
with a corresponding request/response pair.
Configuring the provider is a little more involved, and (currently) requires
running an API endpoint to configure any [provider states](http://docs.pact.io/documentation/provider_states.html) during the
verification process. The option you must provide to the dsl.VerifyRequest
is:
An example route using the standard Go http package might look like this:
See the examples or read more at http://docs.pact.io/documentation/provider_states.html.
See the Pact Broker (http://docs.pact.io/documentation/sharings_pacts.html)
documentation for more details on the Broker and this article
(http://rea.tech/enter-the-pact-matrix-or-how-to-decouple-the-release-cycles-of-your-microservices/)
on how to make it work for you.
Publishing using Go code:
Publishing from the CLI:
Use a cURL request like the following to PUT the pact to the right location,
specifying your consumer name, provider name and consumer version.
The following flags are required to use basic authentication when
publishing or retrieving Pact files to/from a Pact Broker:
Pact Go uses a simple log utility (logutils - https://github.com/hashicorp/logutils)
to filter log messages. The CLI already contains flags to manage this,
should you want to control log level in your tests, you can set it like so:
27 versions
Latest release: about 1 year ago
11 dependent packages
View more package details: https://packages.ecosystem.code.gouv.fr/registries/proxy.golang.org/packages/github.com/pact-foundation/pact-go/v2