These will be my ideas on how to help a microservice-based (HTTP) project by integrating testing into the development process (TDD). I’ll approach the testing pyramid presented in Martin Fowler’s “Microservice Testing” as well as the test variants in “Building Microservices” (O’Reilly) and I’ll show a way of how they can be translated to real-life Python.
The main focus will be on “service tests” (aka. out-of-process component tests) and contract tests. They both can be run relatively fast on a development machine and can give fast feedback to the developer, preventing many kinds of problems.
Service tests run the whole application process without any internal modifications, but have to present the service with a fake “outside world”. I’ll show how to fake external HTTP services with Mountebank (similar to WireMock). Instead of faking other systems (like databases) we can quickly spin up the real deal as a Docker container from within the tests.
Contract tests check if the contract (interface) of your service with the outside world is kept, so no external services should be broken by the changes you are introducing. It can also work the other way around, proving that your collaborators are keeping their part of the deal. In both cases, Swagger (a RESTful API description scheme) and a few clever tricks can be used for significant advantage.