Recently, I set up my first ever component testing infrastructure. It all started because my Sprkl team realized we needed to have End2End & component testing for our microservices so we can make sure they actually work as expected. It was quite a learning process. Until then, my experience was only with unit testing, writing the unit tests, and mocking everything up on the function level.
I decided to test our microservices as black boxes using a real infrastructure. An experience I thought might be worth sharing.
Good luck with that.
The first attempt was a failure. We used docker-compose and dockers to create the environments for running the tests. At first, I thought it would be easier because I had no experience working with Kubernetes. But I must admit that creating these testing environments was time-consuming, leading to a bad DX (developer experience). The experience was terrible because the process was slow and took very long to spin up and down the envs. Also, managing networks for the dockers was a pain in the ass.
At that point, I understood that using dockers was not fun. And said to myself, hey, my team is already using Kubernetes; why not utilize it for the testing? The problem was that I didn’t know how to set it up.
Before diving into my component testing tale, I’d like to thank Martin Fowler for his initiative and a great website that I often refer to when researching patterns and practices that make building useful software easier. The” Testing Strategies in a Microservice Architecture” article, written by Tobias Clemson, was the first step in clearing out the mess. A highly recommended read.
After some consideration, I decided to run the test infrastructure using Tilt to spin up different clusters by injecting different values files to our Helm chart.
I.e., I have A and B services. I want to run a component test on A without having B involved. That’s because service B is still unstable, and applying it in the tests would be complex and will require test changes soon. So I spun service A by having Tilt inject a YAML file to Helm, which then lets YAML feed Kubernetes. I will use its YAML file with a mock-up of service A when I want to test service B.
BTW, Tilt is awesome. It allowed me to create similar environments to what we’ll have in production while mocking up some of the pods allowing simple test writing and a positive development experience.
The idea of using Tilt was a great pick because it also allowed us to automatically update the running code in the pods when changes were made locally.
The actual tests were running from what we call a “Tester pod” from within the cluster using the services APIs (Kafka, gRPC). And everything was running fast and as expected.
So the result of this design is that when developing a new component, we can very quickly define in a YAML file a new testing env and start running tests using real infrastructure within seconds.
Hope that some of you found this post helpful, and I’d love to hear about your testing experiences. Also, I’d highly appreciate any recommended reading materials on this subject. We’re currently enrolling our closed beta program; you can sign up for our beta if you’re using VSCode: JS/TS over Node.js.
Any questions? Ping me
Enjoy your reading 4 Min Read