25. Sept. 2025·8 Min. Lesezeit

Vertragstests für APIs: Inkompatible Änderungen in schnellen Teams verhindern

Vertragstests für APIs helfen, inkompatible Änderungen zu entdecken, bevor Web‑ und Mobile‑Releases ausgeliefert werden. Praktische Schritte, typische Stolperfallen und eine kurze Pre‑Ship‑Checkliste.

Vertragstests für APIs: Inkompatible Änderungen in schnellen Teams verhindern

Warum inkompatible API-Änderungen immer wieder in Releases rutschen

Die meisten Teams haben am Ende eine API, die von vielen Clients genutzt wird: einer Web‑App, einer iOS‑App, einer Android‑App und manchmal internen Tools. Auch wenn alle dieselben Endpunkte „teilen“, nutzt jeder Client die API auf leicht unterschiedliche Weise. Ein Bildschirm erwartet vielleicht ein Feld, das immer vorhanden ist, während ein anderer es nur bei aktivem Filter nutzt.

Das eigentliche Problem tritt auf, wenn diese Komponenten zu verschiedenen Zeitpunkten ausgeliefert werden. Backend‑Änderungen können mehrmals am Tag live gehen, Web deployt schnell und Mobile‑Releases dauern länger wegen Prüfprozessen und gestaffelter Rollouts. Diese Lücke erzeugt unerwartete Ausfälle: die API wurde für den neuesten Client angepasst, aber die gestrige Mobilversion ist noch unterwegs und erhält nun Antworten, die sie nicht verarbeiten kann.

Die Symptome sind selten subtil:

  • Ein Bildschirm ist plötzlich leer, weil ein Feld umbenannt oder verschoben wurde
  • Abstürze durch unerwartete null‑Werte oder fehlende Objekte
  • Support‑Tickets „Etwas ist kaputt“ mit schwer reproduzierbaren Schritten
  • Ein Anstieg von Fehlermeldungen kurz nach einem Backend‑Deploy
  • Hotfixes, die defensive Logik hinzufügen statt die eigentliche Ursache zu beheben

Manuelle Tests und QA übersehen diese Fälle oft, weil die riskanten Szenarien nicht die Happy‑Paths sind. Ein Tester prüft vielleicht „Bestellung anlegen“, testet aber nicht eine ältere App‑Version, ein teilweise ausgefülltes Profil, eine seltene Benutzerrolle oder eine Antwort mit leerer Liste. Kommt noch Caching, Feature‑Flags und graduelle Rollouts dazu, entstehen mehr Kombinationen, als ein Testplan abdecken kann.

Ein typisches Beispiel: das Backend ersetzt status: "approved" durch status: { code: "approved" } zur Unterstützung der Lokalisierung. Die Web‑App wird am selben Tag aktualisiert und funktioniert. Die aktuelle iOS‑Version erwartet aber noch den String, kann die Antwort nicht parsen und Nutzer sehen nach dem Login eine leere Seite.

Deshalb gibt es Vertragstests für APIs: nicht um QA zu ersetzen, sondern um diese „funktioniert für meinen neuesten Client“‑Änderungen zu erkennen, bevor sie in Produktion gelangen.

Was Vertragstests sind (und was nicht)

Vertragstests sind eine Möglichkeit, wie ein API‑Consumer (Web‑App, Mobile‑App oder ein anderer Service) und ein API‑Provider (dein Backend) sich darüber einigen, wie sie miteinander kommunizieren. Diese Vereinbarung ist der Vertrag. Ein Vertragstest prüft eine einfache Frage: Verhält sich der Provider weiterhin so, wie der Consumer darauf angewiesen ist, auch nach Änderungen?

In der Praxis stehen Vertragstests zwischen Unit‑Tests und End‑to‑End‑Tests. Unit‑Tests sind schnell und lokal, aber sie können Diskrepanzen zwischen Teams übersehen, weil sie internen Code testen, nicht die gemeinsame Schnittstelle. End‑to‑End‑Tests prüfen echte Abläufe über viele Systeme, sind aber langsamer, schwerer zu warten und schlagen oft aus Gründen fehl, die nichts mit einer API‑Änderung zu tun haben (Testdaten, UI‑Timing, instabile Umgebungen).

Ein Vertrag ist kein langes Dokument. Er ist eine fokussierte Beschreibung der Requests, die ein Consumer sendet, und der Antworten, die er erhalten muss. Ein guter Vertrag umfasst in der Regel:

  • Endpunkte und Methoden (zum Beispiel POST /orders)
  • Pflicht- und optionale Felder, inklusive Typen und grundlegender Regeln
  • Statuscodes und Fehler‑Antwortform (wie 400 vs 404 aussehen)
  • Header‑ und Auth‑Erwartungen (Token vorhanden, Content‑Type)
  • Wichtige Defaults und Kompatibilitätsregeln (was passiert, wenn ein Feld fehlt)

Ein einfaches Beispiel für einen Bruch, den ein Vertragstest früh erkennt: das Backend benennt total_price in totalPrice um. Unit‑Tests können trotzdem grünes Licht geben. End‑to‑End‑Tests decken diesen Bildschirm möglicherweise nicht ab oder schlagen später auf verwirrende Weise fehl. Ein Vertragstest schlägt sofort fehl und zeigt die genaue Diskrepanz.

Wichtig ist auch, klar zu sagen, was Vertragstests nicht sind. Sie ersetzen keine Performance‑Tests, Sicherheitstests oder vollständige User‑Journey‑Tests. Sie fangen auch nicht jeden Logikfehler auf. Was sie tun: das häufigste Release‑Risiko in schnellen Teams reduzieren — eine „kleine“ API‑Änderung, die einen Client stillschweigend kaputt macht.

Wenn dein Backend oft generiert oder häufig geändert wird (zum Beispiel bei Regeneration von APIs in Plattformen wie AppMaster), sind Vertragstests ein praktisches Sicherheitsnetz, weil sie prüfen, ob die Erwartungen der Clients nach jeder Änderung noch gelten.

Wähle einen Vertragsansatz für Web‑ und Mobile‑Teams

Wenn Web und Mobile häufig ausliefern, ist die Schwierigkeit nicht „die API testen“. Es geht darum, sich darauf zu einigen, was für jeden Client nicht geändert werden darf. Hier helfen Vertragstests, aber du musst entscheiden, wer den Vertrag besitzt.

Option 1: Consumer‑getriebene Verträge (CDCs)

Bei consumer‑getriebenen Verträgen definiert jeder Client (Web, iOS, Android, Partnerintegration) seinen Bedarf an der API. Der Provider beweist dann, dass er diese Erwartungen erfüllen kann.

Das funktioniert gut, wenn Clients unabhängig voneinander ausgeliefert werden, weil der Vertrag reale Nutzung abbildet, nicht das, was das Backend meint, dass genutzt wird. Es passt zur Multi‑Client‑Realität: iOS ist vielleicht auf ein Feld angewiesen, das Web nicht nutzt, und Web kümmert sich um Sortierung oder Pagination, die Mobile ignoriert.

Ein einfaches Beispiel: die Mobile‑App erwartet price_cents als Integer. Web zeigt nur formatierten Preis, merkt also nicht, wenn das Backend auf String wechselt. Ein CDC von Mobile würde diese Änderung vor dem Release abfangen.

Option 2: Provider‑verwaltete Schemas

Beim provider‑verwalteten Schema veröffentlicht das Backendteam einen Vertrag (oft ein Schema oder Spec) und setzt diesen durch. Consumers testen gegen diese einzige Quelle der Wahrheit.

Das passt gut, wenn die API öffentlich oder von vielen externen Verbrauchern genutzt wird oder wenn strikte Konsistenz zwischen Teams erforderlich ist. Es ist auch einfacher zum Start: ein Vertrag, ein Ort für Reviews, ein Genehmigungsweg.

Kurze Auswahlhilfe:

  • Wähle CDCs, wenn Clients häufig liefern und unterschiedliche Teile der API nutzen.
  • Wähle provider‑verwaltete Schemas, wenn du einen stabilen „offiziellen“ Vertrag für alle brauchst.
  • Nutze eine Hybridlösung, wenn möglich: ein Provider‑Schema als Basis und CDCs für die wenigen risikoreichen Endpunkte.

Wenn du mit einer Plattform wie AppMaster baust, gilt das gleiche: behandle Web‑ und native Mobile‑Apps als separate Consumer. Auch wenn sie dasselbe Backend teilen, sind ihre Abhängigkeiten selten identisch.

Was in einen API‑Vertrag gehört (damit er echte Brüche auffängt)

Ein API‑Vertrag hilft nur, wenn er widerspiegelt, wovon deine Web‑ und Mobile‑Clients wirklich abhängig sind. Eine hübsche Spezifikation, die niemand verwendet, fängt nicht die Änderung ab, die die Produktion kaputt macht.

Starte mit realer Nutzung, nicht mit Annahmen. Nimm die häufigsten Client‑Aufrufe (aus dem App‑Code, API‑Gateway‑Logs oder einer kurzen Liste von Teams) und verwandele sie in Vertragsfälle: der exakte Pfad, Methode, Header, Query‑Parameter und die typische Request‑Body‑Form. So bleibt der Vertrag klein, relevant und schwer anfechtbar.

Schließe sowohl Success‑ als auch Fehlerantworten ein. Teams testen oft nur den Happy‑Path und vergessen, dass Clients sich auch auf Fehler verlassen: Statuscode, Fehler‑Form und sogar stabile Fehlercodes/-meldungen. Wenn eine Mobile‑App eine spezifische „E‑Mail bereits verwendet“‑Meldung anzeigt, sollte ein Vertrag die 409‑Antwortform sichern, damit sie nicht plötzlich ein 400 mit anderem Body wird.

Achte besonders auf Bereiche, die am häufigsten brechen:

  • Optionale vs. erforderliche Felder: Ein Feld zu entfernen ist meist sicherer, als ein optionales Feld verpflichtend zu machen.
  • Null‑Werte: Einige Clients unterscheiden null von „fehlt“. Entscheide, was erlaubt ist und halte es konsistent.
  • Enums: Eine neue Option kann ältere Clients brechen, die von einer geschlossenen Liste ausgehen.
  • Pagination: Vereinbare Parameter und Antwortfelder (wie cursor oder nextPageToken) und halte sie stabil.
  • Datums‑ und Zahlenformate: Mach sie explizit (ISO‑Strings, Cents als Integer usw.).

Wie man den Vertrag darstellt

Wähle ein Format, das Teams lesen können und von Tools validiert wird. Übliche Optionen sind JSON Schema, beispielbasierte Verträge oder typisierte Modelle, die aus einer OpenAPI‑Spec generiert werden. In der Praxis funktionieren Beispiele plus Schema‑Checks gut: Beispiele zeigen reale Payloads, Schema‑Regeln fangen „Feld umbenannt“ oder „Typ geändert“ Fehler.

Eine einfache Regel: Wenn eine Änderung einen Client‑Update erzwingen würde, sollte sie einen Vertragstest fehlschlagen lassen. Diese Denkweise hält Verträge auf reale Brüche fokussiert, nicht auf theoretische Perfektion.

Schritt für Schritt: Vertragstests in deine CI‑Pipeline einbauen

Make schema changes safer
Design PostgreSQL models visually and regenerate clean backend code when fields change.
Backend erstellen

Das Ziel von Vertragstests ist einfach: Wenn jemand die API ändert, soll dir CI sagen, ob irgendein Web‑ oder Mobile‑Client vor dem Release kaputtgeht.

1) Fang damit an, was Clients tatsächlich brauchen

Wähle einen Endpunkt und notiere die Erwartungen, die wirklich zählen: Pflichtfelder, Feldtypen, erlaubte Werte, Statuscodes und übliche Fehlerantworten. Versuche nicht, die ganze API auf einmal zu beschreiben. Für Mobile‑Apps nimm auch die Erwartungen älterer App‑Versionen dazu, da Nutzer nicht sofort updaten.

Praktisch ist: Nimm ein paar reale Requests, die die Clients heute machen (aus Logs oder Test‑Fixtures) und verwandle sie in reproduzierbare Beispiele.

2) Leg die Verträge dort ab, wo Teams sie pflegen

Verträge scheitern, wenn sie in einem vergessenen Ordner liegen. Halte sie nahe am Code, der sich ändert:

  • Wenn ein Team beide Seiten besitzt, speichere Verträge im API‑Repo.
  • Wenn Web, Mobile und API unterschiedliche Teams sind, nutze ein gemeinsames Repo, das von den Teams gepflegt wird, nicht von einer einzelnen Person.
  • Behandle Vertrags‑Updates wie Code: reviewen, versionieren und diskutieren.

3) Füge Prüfungen auf beiden Seiten in CI hinzu

Du willst zwei Signale:

  • Provider‑Verifikation bei jedem API‑Build: „Erfüllt die API noch alle bekannten Verträge?“
  • Consumer‑Checks bei jedem Client‑Build: „Ist dieser Client noch kompatibel mit dem aktuell veröffentlichten Vertrag?“

So fängst du Probleme von beiden Seiten ab. Ändert die API ein Antwortfeld, schlägt die API‑Pipeline fehl. Erwartet ein Client ein neues Feld, schlägt die Client‑Pipeline fehl, bis die API es liefert.

4) Entscheide die Fail‑Regel und setze sie durch

Sei explizit, was einen Merge oder Release blockiert. Eine gängige Regel: jede vertragbrechende Änderung schlägt CI fehl und blockiert den Merge in den main‑Branch. Wenn Ausnahmen nötig sind, erfordere eine schriftliche Entscheidung (z. B. ein koordinierter Release‑Plan).

Konkretes Beispiel: ein Backend ändert totalPrice zu total_amount. Die Provider‑Verifikation schlägt sofort fehl, also fügt das Backendteam das neue Feld hinzu und behält das alte für eine Übergangszeit, sodass Web und Mobile weiterlaufen.

Versionierung und Abwärtskompatibilität ohne das Tempo zu drosseln

Go from contract to product
Turn your contract-first API plan into a working backend and apps in one place.
App erstellen

Schnelle Teams verursachen Brüche meist, indem sie das ändern, worauf bestehende Clients angewiesen sind. Eine „breaking change“ ist alles, was eine zuvor funktionierende Anfrage fehlschlagen lässt oder die Antwort so verändert, dass der Client sie nicht mehr verarbeiten kann.

Häufige Breaking Changes sind:

  • Entfernen eines Antwortfeldes, das Clients lesen
  • Ändern eines Feldtyps (z. B. "total": "12" zu "total": 12)
  • Ein optionales Feld verpflichtend machen (oder ein neues Pflichtfeld in Requests)
  • Ändern der Auth‑Regeln (ein öffentlicher Endpunkt benötigt plötzlich ein Token)
  • Ändern von Statuscodes oder Fehler‑Formen, die Clients parsen (200 zu 204, oder neues Fehlerformat)

Die meisten Teams können Versionssprüngen aus dem Weg gehen, indem sie sichere Alternativen wählen. Wenn du mehr Daten brauchst, füge ein neues Feld hinzu statt ein vorhandenes umzubenennen. Wenn du einen besseren Endpunkt brauchst, füge eine neue Route hinzu und lass die alte weiterlaufen. Wenn Validierung verschärft werden muss, akzeptiere eine Zeitlang sowohl das alte als auch das neue Format und setze die neuen Regeln schrittweise durch. Vertragstests helfen dabei, weil sie nachweisen, dass bestehende Consumer weiterhin das Bekannte erhalten.

Deprecation ist der Teil, der Tempo erhält, ohne Nutzer zu schaden. Web‑Clients updaten vielleicht täglich, Mobile‑Apps können wegen Prüfprozessen Wochen hinten liegen. Plane Deprecation nach realem Client‑Verhalten, nicht nach Wunschdenken.

Eine praktikable Deprecation‑Policy könnte so aussehen:

  • Änderung früh ankündigen (Release Notes, internes Channel, Ticket)
  • Altes Verhalten beibehalten, bis die Nutzung unter eine vereinbarte Schwelle fällt
  • Warnungen in Headern/Logs senden, wenn der veraltete Pfad genutzt wird
  • Ein Entferndatum erst setzen, wenn die meisten Clients geupdatet haben
  • Altes Verhalten erst löschen, wenn Vertragstests bestätigen, dass kein aktiver Consumer es mehr braucht

Versionierung benutze nur, wenn du die Änderung nicht abwärtskompatibel gestalten kannst (z. B. fundamentale Änderung der Ressourcenform oder des Sicherheitsmodells). Versionen verursachen langfristigen Aufwand: zwei Verhaltensweisen, zwei Dokumentationen und mehr Edge‑Cases. Halte Versionen selten und bewusst und nutze Verträge, um sicherzustellen, dass beide Versionen so lange korrekt funktionieren, bis das alte Verhalten sicher entfernt werden kann.

Häufige Fehler bei Vertragstests (und wie man sie vermeidet)

Vertragstests funktionieren am besten, wenn sie reale Erwartungen prüfen, nicht eine Spielzeugversion deines Systems. Die meisten Probleme entstehen aus ein paar vorhersehbaren Mustern, die Teams ein falsches Sicherheitsgefühl geben, während Fehler trotzdem in Produktion landen.

Fehler 1: Verträge wie „fancy mocks“ behandeln

Over‑Mocking ist die klassische Falle: Der Vertragstest besteht, weil das Provider‑Verhalten so gemockt wurde, dass es dem Vertrag entspricht, nicht weil der echte Service das leisten kann. Beim Deploy schlägt der erste echte Call fehl.

Eine sichere Regel: Verträge sollten gegen den laufenden Provider (oder ein Build‑Artefakt, das sich gleich verhält) verifiziert werden, mit echter Serialisierung, echter Validierung und echten Auth‑Regeln.

Die häufigsten Fehler und die üblichen Gegenmaßnahmen:

  • Over‑Mocking des Providers: verifiziere Verträge gegen einen echten Provider‑Build, nicht gegen einen Stub.
  • Verträge zu strikt machen: nutze flexible Matches für IDs, Timestamps und Arrays; fordere nicht jedes Feld, wenn Clients das nicht brauchen.
  • Fehlerantworten ignorieren: teste mindestens die wichtigsten Fehlerfälle (401, 403, 404, 409, 422, 500) und die Fehler‑Body‑Form, die der Client parst.
  • Keine klare Ownership: lege fest, wer den Vertrag aktualisiert, wenn sich Anforderungen ändern; mache es zur „Definition of Done“ für API‑Änderungen.
  • Mobile‑Realitäten vergessen: teste auch mit langsameren Netzen und älteren App‑Versionen, nicht nur mit der neuesten Version im schnellen WLAN.

Fehler 2: Zerbrechliche Verträge, die harmlose Änderungen blockieren

Wenn ein Vertrag immer dann fehlschlägt, wenn du ein neues optionales Feld hinzufügst oder JSON‑Keys neu anordnest, lernen Entwickler, den roten Build zu ignorieren. Das macht den Sinn zunichte.

Strebe „strict dort, wo es zählt“ an. Sei strikt bei Pflichtfeldern, Typen, Enum‑Werten und Validierungsregeln. Sei flexibel bei zusätzlichen Feldern, Reihenfolge und Werten, die sich natürlich ändern.

Ein kleines Beispiel: Dein Backend ändert status von "active" | "paused" zu "active" | "paused" | "trial". Wenn eine Mobile‑App unbekannte Werte als Crash behandelt, ist das ein Breaking Change. Der Vertrag sollte das abfangen, indem er prüft, wie der Client mit unbekannten Enum‑Werten umgeht, oder indem er vom Provider verlangt, vorerst nur bekannte Werte zurückzugeben, bis alle Clients damit umgehen können.

Mobile Clients verdienen besondere Aufmerksamkeit, weil sie länger in der Wildnis leben. Bevor du eine API‑Änderung als „sicher“ deklarierst, frage:

  • Können ältere App‑Versionen die Antwort noch parsen?
  • Was passiert, wenn die Anfrage nach einem Timeout erneut gesendet wird?
  • Kollidieren gecachte Daten mit dem neuen Format?
  • Haben wir einen Fallback, wenn ein Feld fehlt?

Wenn deine APIs schnell generiert oder aktualisiert werden (auch mit Plattformen wie AppMaster), sind Verträge ein praktisches Schutzinstrument: Sie erlauben schnelles Arbeiten und beweisen gleichzeitig, dass Web‑ und Mobile‑Clients nach jeder Änderung weiter funktionieren.

Kurze Pre‑Ship‑Checkliste für API‑Änderungen

Protect mobile releases
Deliver native iOS and Android apps without rewriting logic after every API update.
Native App erstellen

Nutze das vor jedem Merge oder Release einer API‑Änderung. Es dient dazu, die kleinen Änderungen zu finden, die nachlässig die größten Brände auslösen, wenn Web und Mobile häufig ausliefern. Wenn du bereits Vertragstests verwendest, hilft dir diese Liste, den Fokus auf die Brüche zu legen, die Verträge blockieren sollten.

Die 5 Fragen, die du jedes Mal stellen solltest

  • Haben wir Antwortfelder hinzugefügt, entfernt oder umbenannt, die Clients lesen (inklusive verschachtelter Felder)?
  • Haben sich Statuscodes geändert (200 vs 201, 400 vs 422, 404 vs 410) oder hat sich das Fehler‑Body‑Format geändert?
  • Haben Felder ihren Status zwischen Pflicht und optional gewechselt (inklusive „kann null sein“ vs „muss vorhanden sein")?
  • Haben sich Sortierung, Pagination oder Default‑Filter geändert (Page‑Größe, Reihenfolge, Cursor‑Token, Defaults)?
  • Wurden Vertragstests für den Provider und alle aktiven Consumer (Web, iOS, Android und interne Tools) ausgeführt?

Ein einfaches Beispiel: Deine API gab früher totalCount zurück, ein Client nutzt das, um „24 Ergebnisse“ anzuzeigen. Du entfernst es, weil „die Liste ja schon Items hat“. Backend läuft weiter, aber im UI steht plötzlich leer oder „0 Results“ für manche Nutzer. Das ist ein echter Breaking Change, selbst wenn der Endpunkt 200 zurückgibt.

Wenn du eine der Fragen mit „Ja“ beantwortet hast

Mach diese schnellen Follow‑Ups vor dem Shipping:

  • Kläre, ob alte Clients ohne Update weiter funktionieren. Wenn nicht, füge einen abwärtskompatiblen Pfad hinzu (altes Feld behalten oder beide Formate unterstützen für eine Übergangszeit).
  • Prüfe das Fehler‑Handling in den Clients. Viele Apps behandeln unbekannte Fehlerformen als generisches „Etwas ist schiefgegangen“ und verbergen dadurch nützliche Meldungen.
  • Führe Consumer‑Vertragstests für jede veröffentlichte Client‑Version aus, die du noch unterstützt, nicht nur für den neuesten Branch.

Wenn du interne Tools schnell baust (z. B. Admin‑Panel oder Support‑Dashboard), stelle sicher, dass diese Consumer ebenfalls abgedeckt sind. In AppMaster generieren Teams oft Web‑ und Mobile‑Apps aus denselben Backend‑Modellen — das macht es leicht zu vergessen, dass eine kleine Schema‑Änderung einen bereits ausgelieferten Client brechen kann, wenn der Vertrag nicht in CI geprüft wird.

Beispiel: Einen Breaking Change fangen, bevor Web und Mobile liefern

Replace hotfixes with clear logic
Use drag-and-drop business logic to reduce quick fixes that quietly break clients.
Workflow erstellen

Stell dir eine übliche Situation vor: Das API‑Team deployed mehrmals täglich, die Web‑App liefert täglich, und Mobile‑Apps liefern wöchentlich (wegen Store‑Review und gestaffelten Rollouts). Alle bewegen sich schnell, das Risiko sind kleine Änderungen, die harmlos aussehen.

Ein Support‑Ticket wünscht klarere Feldnamen in der User‑Profile‑Antwort. Das API‑Team benennt in GET /users/{id} das Feld phone in mobileNumber um.

Diese Umbenennung wirkt aufgeräumt, ist aber ein Breaking Change. Die Web‑App zeigt möglicherweise eine leere Telefonnummer im Profil. Schlimmer: Die Mobile‑App stürzt vielleicht ab, wenn sie phone als erforderlich behandelt, oder die Validierung schlägt beim Speichern fehl.

Mit Vertragstests wird das vor Benutzerkontakt entdeckt. So schlägt es typischerweise fehl, abhängig davon, wie die Prüfungen laufen:

  • Provider‑Build schlägt fehl (API‑Seite): Der API‑CI‑Job verifiziert den Provider gegen gespeicherte Consumer‑Verträge von Web und Mobile. Er sieht, dass die Consumer noch phone erwarten, das Provider jetzt aber mobileNumber liefert — die Verifikation schlägt fehl und der Deploy wird blockiert.
  • Consumer‑Build schlägt fehl (Client‑Seite): Das Web‑Team aktualisiert seinen Vertrag, um mobileNumber zu fordern, bevor die API das Feld liefert. Ihr Vertragstest schlägt fehl, weil der Provider das Feld noch nicht bereitstellt.

In beiden Fällen ist der Fehler früh, laut und konkret: Er zeigt den genauen Endpunkt und das exakte Feld‑Mismatch, statt erst als „Profilseite kaputt“ nach dem Release aufzutauchen.

Die Lösung ist meist einfach: die Änderung additive statt destruktiv gestalten. Die API liefert für eine Weile beide Felder:

  • mobileNumber hinzufügen.
  • phone als Alias behalten (gleicher Wert).
  • phone in den Vertragsnotizen als deprecated markieren.
  • Web und Mobile so aktualisieren, dass sie mobileNumber lesen.
  • phone erst entfernen, wenn alle unterstützten Client‑Versionen umgestellt haben.

Ein realistischer Zeitplan unter Release‑Druck könnte so aussehen:

  • Mon 10:00: API‑Team fügt mobileNumber hinzu und behält phone. Provider‑Verträge grünen.
  • Mon 16:00: Web wechselt zu mobileNumber und shipped.
  • Thu: Mobile wechselt zu mobileNumber und reicht ein Release ein.
  • Next Tue: Mobile‑Release erreicht die meisten Nutzer.
  • Following sprint: API entfernt phone und Vertragstests bestätigen, dass kein unterstützter Consumer es mehr braucht.

Das ist der Kernnutzen: Vertragstests verwandeln „Breaking‑Change‑Roulette“ in einen kontrollierten, zeitlich abgestimmten Übergang.

Nächste Schritte für schnell arbeitende Teams (inklusive No‑Code‑Option)

Wenn du willst, dass Vertragstests wirklich Breakages verhindern (und nicht nur zusätzliche Checks sind), rolle sie klein aus und mache Ownership klar. Das Ziel ist einfach: Breaking Changes auffangen, bevor sie Web‑ und Mobile‑Releases erreichen.

Starte mit einem leichten Rollout‑Plan. Wähle die drei Endpunkte, die beim Ändern den meisten Ärger verursachen — typischerweise Auth, User‑Profile und ein zentrales List/ Search‑Endpoint. Schließe diese zuerst in Verträge, dann weite aus, wenn das Team dem Workflow vertraut.

Ein praktikabler Rollout, der überschaubar bleibt:

  • Woche 1: Vertragstests für die Top‑3‑Endpoints, laufen bei jedem Pull Request
  • Woche 2: Füge die nächsten 5 Endpunkte mit dem meisten Mobile‑Traffic hinzu
  • Woche 3: Decke Fehlerantworten und Edge‑Cases ab (leere Zustände, Validierungsfehler)
  • Woche 4: Mach „Vertrag grün“ zur Release‑Hürde für Backend‑Änderungen

Als Nächstes: wer macht was. Teams sind schneller, wenn klar ist, wer einen Fehler besitzt und wer eine Änderung absegnet.

Halte Rollen einfach:

  • Contract Owner: meist das Backend‑Team, verantwortlich für Vertrags‑Updates bei Verhaltensänderungen
  • Consumer Reviewer: Web‑ und Mobile‑Leads, die bestätigen, dass Änderungen für ihre Clients sicher sind
  • Build Sheriff: rotiert täglich oder wöchentlich, priorisiert Contract‑Test‑Fehler in CI
  • Release Owner: entscheidet, ob ein Release wegen eines Vertragsbruchs blockiert wird

Verfolge eine Erfolgsmetrik, die allen wichtig ist. Für viele Teams ist das beste Signal weniger Hotfixes nach Releases und weniger „Client‑Regressions“ wie Abstürze, leere Bildschirme oder kaputte Checkout‑Flows, die auf API‑Änderungen zurückzuführen sind.

Wenn du noch schnellere Feedback‑Loops willst, können No‑Code‑Plattformen die Drift verringern, indem sie sauberen Code nach Änderungen regenerieren. Wenn Logik oder Datenmodelle sich ändern, hilft Regeneration, das langsame Ansammeln von Patches zu vermeiden, die unbeabsichtigt Verhalten ändern.

Wenn du APIs und Clients mit AppMaster baust, ist ein praktischer nächster Schritt: Erstelle eine Anwendung, modelliere deine Daten im Data Designer (PostgreSQL), aktualisiere Workflows im Business Process Editor und regeneriere und deploye in deine Cloud (oder exportiere den Quellcode). Kombiniere das mit Vertragschecks in deiner CI, damit jeder regenerierte Build nachweist, dass er den Erwartungen von Web und Mobile entspricht.

Einfach zu starten
Erschaffe etwas Erstaunliches

Experimentieren Sie mit AppMaster mit kostenlosem Plan.
Wenn Sie fertig sind, können Sie das richtige Abonnement auswählen.

Starten