In einem Monolithen ist das Testen relativ geradlinig — ein Deployment, eine Datenbank. Bei Microservices testen Sie ein verteiltes System. Wie stellen Sie sicher, dass die Services zusammenarbeiten, ohne alles gleichzeitig zu starten?
Testpyramide¶
Unit-Tests (Basis): Geschäftslogik, Domänenobjekte. Schnell, isoliert. Integration-Tests (Mitte): Service + Datenbank, Service + Message Broker. Contract-Tests: Überprüfung, dass der API-Vertrag zwischen Services gilt. End-to-End (Spitze): Das gesamte System. Langsam, fragil — auf ein Minimum beschränken.
Consumer-Driven Contract Testing¶
Service A (Consumer) definiert, was er von Service B (Provider) erwartet. Der Vertrag wird auf beiden Seiten unabhängig verifiziert. Pact Framework:
// Consumer test (service A)
@Pact(consumer = "OrderService", provider = "UserService")
public RequestResponsePact userDetailsPact(PactDslWithProvider builder) {
return builder
.given("user 123 exists")
.uponReceiving("get user details")
.path("/api/users/123")
.method("GET")
.willRespondWith()
.status(200)
.body(new PactDslJsonBody()
.integerType("id", 123)
.stringType("name", "Jan Novák"))
.toPact();
}
Integration-Tests mit Testcontainers¶
Testcontainers startet Docker-Container in Tests — echtes PostgreSQL, Redis, RabbitMQ. Keine Datenbank-Mocks, keine In-Memory-Ersatzlösungen. Langsamer, aber Sie verifizieren echtes Verhalten.
E2E: minimal, aber notwendig¶
Happy-Path-Szenarien — Nutzer meldet sich an, erstellt eine Bestellung, bezahlt. Smoke-Tests nach dem Deployment. Edge Cases nicht mit E2E-Tests abdecken — das ist die Aufgabe von Unit- und Contract-Tests.
Testpyramide, nicht Testeis¶
Viele Unit-Tests, weniger Integration-Tests, minimale E2E-Tests. Contract-Tests sind die entscheidende Innovation für Microservices — sie verifizieren die Kompatibilität, ohne das gesamte System zu starten.
Brauchen Sie Hilfe bei der Implementierung?
Unsere Experten helfen Ihnen bei Design, Implementierung und Betrieb. Von der Architektur bis zur Produktion.
Kontaktieren Sie uns