Überspringen zum Hauptinhalt

So testen Sie gemischte Client-, Backend-, Content- und Konfigurationsversionen vor der Veröffentlichung

Originales Persistium-Versions-Mesh zeigt alte und neue Client-, Dienst-, Inhalts- und Konfigurationsknoten, die durch Kompatibilitätsgrenzen verbunden sind.

Eine risikoorientierte Methode zum Testen von Versionen verzerrt sich vor einer Veröffentlichung eines Connected-Games oder Live-Services über Clients, Dienste, Inhalte und Konfigurationen hinweg.

Ein Release ist ein Mesh, nicht eine Versionsnummer

Vernetzte Spiele und Anwendungen werden selten als ein unteilbares Objekt aktualisiert. Ein Spieler kann einen alten Client öffnen, während sich ein Dienst bereits geändert hat. Ein Inhaltskatalog kann vor dem Client aktualisiert werden, der ein neues Element versteht. Ein Konfigurations-Rollout kann eine Region vor der anderen erreichen. Ein Backend kann sowohl alte als auch neue Anfrageformen für eine Weile akzeptieren und dann einen Adapter zurückziehen. Wenn man all dies als "Version 42" behandelt, werden die Beziehungen, die unter realen Rollout-Bedingungen am ehesten unterbrochen werden.

Beginnen Sie damit, die Versionsdimensionen getrennt zu benennen. Mindestens Client-Build, Backend- oder Service-Revision, Protokollversion, Schema- oder Speicherversion, Inhaltskatalogversion, Konfigurationsversion und Migrationsstatus aufzeichnen. Einige Produkte benötigen auch Asset-Bundle-Version, Feature-Flag-Set, Betriebssystemfähigkeit, Kontokohorte oder Region. Das Ziel ist nicht, eine riesige Tabellenkalkulation für sich selbst zu erstellen, sondern zu zeigen, wo eine Komponente die Ausgabe einer anderen Komponente interpretiert.

Die nützliche Frage ist nicht „Hat der neueste Client bestanden?“ Es ist „Welche Kombinationen koexistieren können, was muss jede Kombination tun und welche Kombinationen sind verboten?“ Eine Kompatibilitätsrichtlinie verwandelt diese Frage in einen begrenzten Testraum. Sie benennt die akzeptierten Bereiche, Übersetzer, Kill-Schalter, anmutige Ablehnungen und Rollout-Gates, bevor ein Produktionsvorfall das Team dazu zwingt, zu erraten.

Schreibe Kompatibilitätsbeschränkungen in beide Richtungen

Kompatibilität ist oft asymmetrisch. Ein neues Backend kann Anfragen von einem alten Client akzeptieren, während ein altes Backend einen neuen Client nicht verstehen kann. Ein neuer Client kann einen alten Speicher nach der Migration lesen, während ein alter Client die migrierte Version nicht erneut öffnen darf. Neue Inhalte können für alte Clients harmlos sein, wenn sie durch ein Feature-Flag ausgeblendet werden, aber gefährlich, wenn ein alter Client einen unbekannten Elementtyp als gültigen Standard behandelt.

Schreibe jede Einschränkung als Beziehung mit einem erwarteten Verhalten. Zum Beispiel: Client 5 kann sich gegenüber dem Dienst 7 über das Protokoll 2 authentifizieren; Client 4 kann den Katalog 10 nur lesen, wenn Elemente des Typs X ausgeschlossen sind; Speicherschema 3 kann über unterstützte Kanten zu 5 migrieren; Konfiguration 12 darf keine Funktion für Clients unter Build 6 aktivieren. Fügen Sie eine Disposition für nicht unterstützte Kombinationen hinzu: Blockieren Sie vor der Mutation, dienen Sie einer kompatiblen Darstellung, routen Sie zu einem erforderlichen Update oder halten Sie die Änderung, bis die alte Kohorte abläuft.

Verlassen Sie sich nicht nur auf den Versionsvergleich. Eine höhere Zahl beweist nicht, dass eine Fähigkeit vorhanden ist, und eine ältere Zahl beweist nicht, dass ein Feature abwesend ist. Verwenden Sie Fähigkeitsverhandlungs- oder explizite Kompatibilitätsmetadaten, wo dies praktisch möglich ist. Die Metadaten selbst müssen getestet werden; ein fehlendes Flag sollte nicht versehentlich "sicher" bedeuten.

Originalversionsmesh-Figur zeigt Client-, Service-, Inhalts- und Konfigurationsversionen, die über getestete Kompatibilitätspfade verbunden sind.
Ein Versions-Mesh macht Koexistenzbeschränkungen über unabhängig eingesetzte Teile eines Systems sichtbar.

Generieren Sie eine risikoorientierte Matrix

Das vollständige kartesische Produkt kann enorm sein. Vier Client-Builds, drei Dienste, vier Inhaltsversionen und fünf Konfigurationszustände erzeugen bereits 240-Kombinationen, bevor Plattform- und Migrationszustand betrachtet werden. Das Testen jedes möglichen Tupels kann langsamer sein als der Release-Zyklus und immer noch die Grenze überschreiten, auf die es ankommt.

Fügen Sie immer den neuesten kompatiblen Pfad, den ältesten noch unterstützten Pfad und die Übergangsgrenzen hinzu. Fügen Sie Kombinationen hinzu, die ein geändertes Protokollfeld, einen Migrationsrand, eine Inhaltsinterpretationsregel, einen Berechtigungspfad oder ein Feature-Flag überschreiten. Fügen Sie mindestens einen Rollback-förmigen Pfad hinzu: einen Client oder Dienst, der in einen vorherigen kompatiblen Zustand zurückkehrt, nachdem der neue Zustand Daten beobachtet hat.

Die paarweise Generierung kann helfen, Interaktionen abzudecken, aber sie sollte kein Urteil ersetzen. Einige Fehler erfordern drei oder vier Dimensionen, um sich auszurichten: ein alter Client, ein neuer Katalog, ein migriertes Speichern und ein Konfigurationskennzeichen könnten in jedem Paar sicher sein, aber zusammen ungültig. Fügen Sie benannte Szenariotests für diese produktspezifischen Risiken hinzu. Die Matrix sollte von den Personen, die die Funktionen verstehen, überprüft werden können, nicht nur durch einen Testgenerator.

Testen Sie alte und neue Kunden, die zusammenleben

Koexistenz ist eine normale Rollout-Bedingung. Simulieren Sie einen alten Client beim Erstellen oder Ändern des Zustands, während ein neuer Client ihn liest, und kehren Sie dann die Reihenfolge um. Testen Sie erneut, gleichzeitige Sitzungen, unterbrochene Update-Downloads und einen Benutzer, der auf einem anderen Gerät fortfährt. Identifizieren Sie für jeden Pfad, welche Seite die maßgebliche Interpretation besitzt. Ein Client sollte keinen neuen Feldwert erfinden, den der Dienst später als vertrauenswürdig behandelt, nur weil beide in einem lokalen Testlauf aktualisiert wurden.

Protokolländerungen verdienen explizite Adapter. Wenn ein Feld umbenannt, erweitert oder in mehrere Werte aufgeteilt wird, testen Sie die alte Repräsentation, die neue Repräsentation und jede Übersetzungsebene. Eine Übersetzung muss die dokumentierte Bedeutung bewahren oder die Anforderung vor einer unsicheren Mutation ablehnen. Ein Server, der einen plausiblen, aber falschen Standard zurückgibt, kann gefährlicher sein als eine klare Inkompatibilität, weil er stille Korruption verbreitet.

Clientkompatibilität beinhaltet die Benutzererfahrung. Wenn ein alter Build nicht sicher fortgesetzt werden kann, sollte der Aktualisierungspfad vor einer zustandsbezogenen Aktion angezeigt werden, nicht nach einer fehlgeschlagenen Transaktion. Wenn ein Feature vor alten Builds verborgen ist, bestätigen Sie, dass es in Menüs, tiefen Links, Push-ähnlichen Einstiegspunkten und wiederhergestellten Sitzungen verborgen bleibt. Eine korrekte Backend-Entscheidung kann sich immer noch gebrochen anfühlen, wenn die Benutzeroberfläche eine Aktion darstellt, die der aktuelle Client nicht abschließen kann.

Inhalt und Konfiguration als ausführbare Abhängigkeiten behandeln

Inhaltskataloge und Remote-Konfiguration werden oft als Betriebsdaten und nicht als Code betrachtet. In einem Live-System sind sie ausführbare Abhängigkeiten, weil sie die Bedeutung von Identifikatoren ändern, welche Features erscheinen und welche Regeln gelten. Testen Sie einen neuen Inhaltskatalog mit alten und neuen Clients. Testen Sie einen veralteten Konfigurations-Cache mit einem neuen Dienst. Testen Sie ein Feature-Flag, das einen Codepfad aktiviert, bevor der gewünschte Inhalt vorhanden ist. Testen Sie ein Rollback von Inhalten, nachdem einige Spieler Referenzen zum neuen Datensatz erhalten haben.

Versionierte Inhaltsverträge verwenden. Ein Katalogeintrag sollte die Felder und Fähigkeiten angeben, die zum Rendern oder Ausführen erforderlich sind. Ein Konfigurationspaket sollte die erwarteten Client- oder Dienstbereiche identifizieren. Wenn ein Datensatz von einer nicht verfügbaren Fähigkeit abhängt, wählen Sie ein sicheres Verhalten: Ausblenden, Ersetzen eines dokumentierten Fallbacks, Aufschieben der Aktivierung oder Stoppen des Rollouts. Verwenden Sie keinen generischen Standard, der versehentlich ein Element gewährt, eine Berechtigungsprüfung umgeht oder den Fortschritt ändert.

Für den gespeicherten Zustand ist eine Schemamigration von einer semantischen Migration zu unterscheiden. Eine Schemaänderung kann ein Feld mit einem Standard hinzufügen. Eine semantische Änderung kann ein Element auslagern, eine Quest aufteilen oder eine Economy-Regel ändern. Letzteres erfordert Domäneninvarianten und Wiederherstellungsentscheidungen, nicht nur einen Deserialisierertest. Aufzeichnen, welche Version des Katalogs und der Konfiguration den gespeicherten Zustand interpretiert hat, insbesondere wenn eine Wiederholungs- oder Unterstützungsuntersuchung ein Ergebnis reproduzieren muss.

Beweisen Sie Rollback, bevor das Release es benötigt

Rollback ist nicht einfach die Bereitstellung von älterem Code. Fragen Sie, ob ein alter Client den vom neuen Client geschriebenen Zustand lesen kann, ob ein alter Dienst neue Anforderungen interpretieren kann, ob Inhaltsaufzeichnungen einen neuen Renderer erfordern und ob eine Migration eine Einweggrenze überschritten hat. Einige Änderungen sind nur vorwärts. Das kann akzeptabel sein, wenn deklariert, aber es ändert den Releaseplan: Verwenden Sie eine inszenierte Kohorte, ein Kompatibilitätsfenster, eine Backup- oder Snapshot-Richtlinie und einen Supportpfad, anstatt eine sofortige Rückkehr anzunehmen.

Test-Rollback-Fähigkeit als Szenario. Beginnen Sie mit dem alten kompatiblen Satz, schalten Sie eine Komponente vor, nehmen Sie eine repräsentative Zustandsänderung vor, verschieben Sie dann eine ausgewählte Komponente zurück. Legen Sie den erwarteten Zustand fest: fortgesetzte Kompatibilität, schreibgeschützte Sicherheit, kontrollierte Ablehnung oder geplante Wiederherstellung. Das Ergebnis sollte benennen, was ausgeführt wurde und was simuliert wurde. Eine Überprüfung sollte ein Designdiagramm niemals mit einer ausführbaren Rollback-Probe verwechseln.

Halten Sie die Entscheidungsausgabe kurz und konkret. Der Release-Record kann folgende Angaben enthalten: unterstützte Kompatibilitätsbereiche, ausgeführte Szenarien, bekannte nicht ausgeführte Risiken, Änderungen, die nur vorwärts gerichtet sind, Rollout-Gates und Bedingungen für das Anhalten. Er sollte keine universelle Sicherheit beanspruchen, weil eine Matrix bestanden hat. Das ehrliche Ergebnis ist eine evidenzgestützte Release-Grenze.

Teilen Sie die Beweise in CI

Führen Sie bei jeder Änderung, die gemeinsame Verträge berührt, einen kleinen Kompatibilitätsrauch aus. Führen Sie erweiterte Shards aus, wenn sich Client-, Protokoll-, Speicher-, Inhalts-, Konfigurations- oder Rollout-Code ändert. Teilen Sie sie nach Szenariofamilien und nicht nach zufälligen Kombinationen: Authentifizierung und Sitzungswiederherstellung, Kauf und Berechtigung, Migration und gespeicherter Zustand, Inhaltswiedergabe, Feature-Gated-Verhalten und Rollback. Dies hält Fehler sinnvoll und macht die Kosten einer neuen Dimension sichtbar.

Der CI-Bericht sollte das getestete Tupel und die Ergebnisklassifizierung beibehalten. Client-Build, Service-Revision, Protokoll-, Inhalts- und Konfigurationsversionen, Fixture- oder Szenario-ID, Umgebungstyp und die erste fehlgeschlagene Kompatibilitätsregel einschließen. Dumping-Konto oder Spielerstatus vermeiden. Wenn ein Szenario simuliert wird, beschriften. Wenn ein Szenario gegen einen ausführbaren Adapter oder eine Sandbox läuft, beschriften Sie dies auch. Die Evidenzqualität ist Teil der Veröffentlichungsentscheidung.

Überprüfen Sie diese Berichte mit Release-Eigentümern, bevor Sie einen Rollout erweitern; Kompatibilitätsnachweise sind eine Entscheidungsinput, kein dekoratives Dashboard.

Fehlerminimierung verwenden, wenn ein Matrixfall bricht. Das erste versagende Tupel kann unnötige Versionen oder Flags enthalten. Halten Sie die deterministische Umgebung still, reduzieren Sie die Dimensionen, während Sie den Kompatibilitätsfehler beibehalten, und speichern Sie das resultierende Minimalszenario als Regressionsfall. Dies macht die Matrix im Laufe der Zeit wertvoller, anstatt stetig zu einer lauten Sammlung historischer Unfälle zu werden.

Praktische Checkliste

  • Benennen Sie Client, Service, Protokoll, Schema, Inhalt, Konfiguration und Migrationsdimensionen separat.
  • Schreiben Sie unterstützte, übersetzte und verbotene Kompatibilitätsbeziehungen mit erwartetem Verhalten.
  • Fügen Sie älteste unterstützte, neueste unterstützte, Übergangs- und Rollback-förmige Szenarien hinzu.
  • Fügen Sie benannte multidimensionale Tests hinzu, bei denen die paarweise Abdeckung unzureichend ist.
  • Testen Sie alte und neue Clients, die den Status über die gleiche Dienstgrenze erstellen, lesen und wieder aufnehmen.
  • Katalog- und Konfigurationsänderungen als ausführbare Kompatibilitätsabhängigkeiten behandeln.
  • Deklarieren Sie nur Vorwärtsmigrationen und stellen Sie einen gestaffelten Rollout- oder Wiederherstellungsplan bereit.
  • Notieren Sie, ob Beweise simuliert, lokal ausführbar, sandboxed oder extern verifiziert werden.
  • Bewahren Sie das minimale ausfallende Tupel als ein überprüftes Regressionsszenario auf.

Häufig gestellte Fragen

Ist das paarweise Testen genug für die Release-Kompatibilität?

Die paarweise Abdeckung ist ein nützlicher Weg, um eine große Matrix zu reduzieren, aber sie kann nicht alle mehrdimensionalen Einschränkungen nachweisen. Verwenden Sie sie für eine breite Interaktionsabdeckung und fügen Sie dann explizite Szenarien für Kombinationen mit hohem Risiko hinzu, z. B. migrierter Zustand plus neuer Inhalt plus alter Client oder ein Rollback, nachdem sich ein Konfigurationstor geändert hat.

Wann sollte ein alter Kunde blockiert werden?

Blockieren Sie es vor der Mutation, wenn es den erforderlichen Inhalt nicht sicher interpretieren, einen Protokollvertrag erfüllen oder die aktuelle Zustandsgrenze lesen kann. Eine klare Aktualisierungsanforderung ist sicherer als mit einem Standard fortzufahren, der die Bedeutung ändert. Die genaue Richtlinie ist produktspezifisch, aber der Zustand und das Benutzerverhalten sollten gemeinsam getestet werden.

Kann ein Feature Flag die Kompatibilität von selbst lösen?

Ein Flag kann die Belichtung kontrollieren, aber es kann keinen inkompatiblen Protokoll-, Schema- oder Inhaltsdatensatz sichern. Testen Sie die zwischengespeicherten und aktualisierten Zustände des Flags, seine Abhängigkeit von den Clientfähigkeiten und was passiert, wenn es sich ändert, während eine Sitzung aktiv ist.

Was bedeutet das für Persistium?

Persistium ist eine in der Entwicklung befindliche lokale Zuverlässigkeitsproduktfamilie. Dieser Artikel beschreibt einen Test-Design-Ansatz, nicht eine Behauptung, dass ein freigegebenes Produkt automatisch jede Matrix generiert oder gehostetes Release-Management bietet. Seine Kontinuitätsrichtung untersucht begrenzte Beweise für die Art von Kompatibilitätsentscheidungen, die hier beschrieben werden.

Verbundenes SystemEntdecken Sie Persistium