Softwareentwicklung: Testcontainers nimmt Integrationstests ihren Schrecken
Es war an einem Dienstagmorgen, an einem Tag, an dem ich eigentlich Produktivität geplant hatte. Ich klickte gut gelaunt auf "Run All Tests" und rechnete mit einem grünen Balken, einem kurzen Schulterklopfen an mich selbst und vielleicht sogar einem zweiten Kaffee. Stattdessen bekam ich: rot. Alles rot. "Connection refused". Super. Meine Integrationstests beschlossen offenbar, ohne mich in den Streik zu treten. Ich öffnete Docker Desktop. Laut UI lief meine Datenbank "healthy" – was aber unglaubwürdig war. Ein Kollege rief rüber: "Hast du wieder Ports verhext?" Ich nicht, diesmal nicht!
Aber zugeben musste ich: Möglich war es immer. Nach einer halben Stunde digitalem Höhlenforschen fand ich den Übeltäter: Ein anderer Test hatte meinen lokalen PostgreSQL-Container verstellt. Meine Tests redeten also mit einer Datenbank, die praktisch in einem Paralleluniversum lebte. Ich nahm einen tiefen Schluck Kaffee, sah resigniert auf den Bildschirm und dachte: "Warum baue ich eigentlich Software – wenn ich jeden Morgen Indiana Jones spielen muss?" Genau an diesem Tag stolperte ich über Testcontainers. Seitdem muss ich meine Datenbank nicht mehr suchen. Sie kommt einfach von selbst. Im diesem Deep Dive werden die Mechanismen von Testcontainers, Best Practices und ein praxisnahes C#-/xUnit-Setup im Detail betrachtet.