Contract Testing
Contract Tests sichern Schnittstellen ab – ohne das komplette System end-to-end zu testen.
Sie beantworten eine sehr praktische Frage:
Verstehen sich Consumer und Provider noch – auch nach Änderungen?
Contract Testing ist damit ein Stabilitäts- und Skalierungsinstrument: weniger Integrationsbrüche, weniger Koordination, schnellere Releases.
1. Was ist ein „Contract“?
Ein Contract ist der vereinbarte Austausch zwischen zwei Parteien, z. B.:
- HTTP API (Request/Response)
- Events (Schema + Semantik)
- gRPC/Proto
- Message Queues
Ein Contract besteht nicht nur aus Feldern, sondern auch aus Verhalten:
- Statuscodes / Fehlerformate
- Required vs optional
- Default-Werte
- Semantik („was bedeutet status=ACTIVE?“)
- Versionierung / Deprecation
2. Warum Contract Tests notwendig sind
Ohne Contract Tests entstehen typische Integrationsprobleme:
- Breaking Changes „merken“ wir erst spät (meist in E2E oder Produktion)
- Teams müssen ständig synchronisieren („habt ihr das Feld geändert?“)
- Integrationstests werden zu schwergewichtig und flakey
- E2E wird als „einziger Nachweis“ missbraucht
Contract Tests sind der Mittelweg:
Mehr Sicherheit als nur Unit Tests,
deutlich günstiger und stabiler als E2E.
3. Contract Testing vs. Integration vs. E2E
| Testart | Prüft | Typischer Scope | Hauptproblem |
|---|---|---|---|
| Unit | Verhalten isoliert | eine Komponente | Integration fehlt |
| Integration | Zusammenspiel realer Teile | Service + DB/HTTP/Stubs | Setup & Wartung |
| Contract | Schnittstellenvertrag | Consumer ↔ Provider | Semantik muss klar sein |
| E2E | System-Flow | komplett | teuer, langsam, flakey |
Merksatz:
E2E validiert „funktioniert das System?“.
Contract Tests validieren „passt der Vertrag?“.
4. Arten von Contract Testing
4.1 Consumer-Driven Contracts (CDC)
Der Consumer beschreibt, was er braucht:
- welche Requests er sendet
- welche Responses er erwartet
- welche Felder er nutzt
- welche Fehlerfälle relevant sind
Der Provider muss beweisen, dass er diese Erwartungen erfüllt.
Vorteil: Consumer-Sicht ist maßgeblich (realer Bedarf).
Risiko: Provider muss mehrere Consumer-Verträge erfüllen → Governance nötig.
4.2 Provider Contracts / Schema Validation
Der Provider veröffentlicht ein Schema (z. B. OpenAPI, AsyncAPI, Proto)
und Consumer prüfen dagegen.
Vorteil: klare zentrale Spezifikation
Risiko: Spezifikation driftet von realer Nutzung weg, wenn nicht gelebt
5. Was genau testet man?
Contract Tests testen typischerweise:
- Payload-Struktur (Felder, Typen, optional/required)
- Statuscodes & Fehlerformate
- Backward Compatibility (optional fields, defaults)
- Semantik auf Schnittstellenebene (z. B. „createdAt“ ist ISO-8601 UTC)
- Event-Schemas inkl. Version/Type
Nicht testen sie:
- echte End-to-End Business-Flows
- UI-Verhalten
- vollständige Datenkonsistenz über mehrere Systeme
6. Wo gehören Contract Tests in die Teststrategie?
Contract Tests sind der „Stabilisator“ zwischen Teams.
Empfehlung:
- Viele Unit Tests (Domänenlogik)
- Gezielte Integrationstests (kritische Infrastruktur)
- Contract Tests für alle externen Schnittstellen
- Wenige E2E-Tests für Kernflows
Contract Tests reduzieren die Anzahl notwendiger E2E-Tests deutlich.
7. Praktische Regeln für stabile Contracts
Regel 1: Additiv statt Breaking
- Neue Felder optional hinzufügen
- Default-Werte definieren
- Bestehende Felder nicht umdeuten
Regel 2: Fehlerformate standardisieren
Ein einheitliches Error-Schema ist Gold wert:
- code
- message
- details
- correlationId
Regel 3: Deprecation ist ein Prozess
Breaking Change ohne Deprecation-Phase = Integrationsvorfall.
Regel 4: Contract Ownership
Ein Contract braucht Ownership:
- wer veröffentlicht?
- wer versioniert?
- wer entscheidet Breaking Changes?
8. Tooling (Beispiele)
Contract Testing ist Konzept, nicht Tool.
Typische Tools/Standards:
- OpenAPI für REST
- AsyncAPI für Events
- Pact (Consumer-Driven Contracts)
- Schema Registry (z. B. für Avro/JSON Schema bei Events)
Wichtiger als Tooling ist:
dass Contracts als „Produkt“ behandelt werden.
9. CI/CD Integration (Minimal)
Consumer:
- erzeugt Contract (Artefakt)
- veröffentlicht ihn (Repository/Registry)
Provider:
- zieht Contracts der Consumer
- validiert sie in CI
- blockiert Releases bei Breaking Changes
So wird aus „wir hoffen, es passt“ ein Gate.
10. Typische Anti-Patterns
- „OpenAPI existiert, aber wird nie getestet“
- „Contract Tests prüfen nur happy path“
- „Provider ändert Semantik, ohne Schema zu ändern“
- „Consumer ignoriert Deprecation“
- „Events ohne Version/Type“ (Chaos Engineering by accident)
11. Verbindung zu Qualitätsstufen
- Stufe 2: erste Contracts (OpenAPI), wenige Contract Checks
- Stufe 3: Contract Tests als Standard für externe APIs
- Stufe 4: Contracts + Traceability (Ticket → Change → Contract → Test)
- Stufe 5: auditierbare Evidence zu Schnittstellenänderungen
Contract Testing ist ein Skalierungshebel ab Stufe 3.
Kernaussage
Contract Testing macht Integration planbar.
Es ersetzt nicht E2E – aber es verhindert,
dass E2E zur einzigen Sicherheitsinstanz wird.
Je mehr Teams und Services, desto wichtiger sind Contracts.
Ohne Contracts skaliert nicht Software – sondern Reibung.