Testing multiple implementations with contract tests

If you have multiple implementations of a service, as I mentioned in yesterday's email, you need to ensure they all provide the same functionality.

You need to be able to run the same tests against each implementation and have them pass.

How do you do this?

In PHP, I use a trait that contains the test methods and then have a test class for each implementation that uses the trait and sets up any test data.

Then, each test class will run the methods from the contract test trait and ensure they all provide the same behaviour, regardless of how it does so - whether it communicates with an API, uses an SDK, or returns fake values.

If one implementation doesn't return the same result as the others, its test will fail.

If you add a new implementation, you create a new test class, use the trait and get the tests to pass.