Automatisierte Massentests mithilfe Künstlicher Intelligenz Basis-Setup fürs Testing eines Multiplayer-Online-Brettspiels

Ein Gastbeitrag von Sebastian Denzer *

Testen ist ein wichtiges Feedback-Element für Entwickler, kann bei einem größeren Software-Projekt aber sehr zeitaufwändig sein. Testautomatisierung hilft dabei, die in Developer-Kreisen bekanntermaßen sehr geschätzte Effizienz zu erhöhen.

Anbieter zum Thema

Zwei Spiele in einem: Catan, das Brettspiel für bis zu sechs Spieler (links), und Rivals for Catan, ein Kartenspiel für zwei Kontrahenten (rechts).
Zwei Spiele in einem: Catan, das Brettspiel für bis zu sechs Spieler (links), und Rivals for Catan, ein Kartenspiel für zwei Kontrahenten (rechts).
(Bild: United Soft Media GmbH / Catan GmbH)

Warum Testing so wichtig ist

Die Folgen schlecht getesteter Software reichen von Schönheitsfehlern und Fehlfunktionen bis hin zu einer nicht betriebsbereiten oder nicht funktionierenden Anwendung. Und die Nutzer sind gnadenlos in ihrem Feedback – und das zu Recht. Erhält eine im Live-Betrieb befindliche Software auch nur eine kleine neue Funktion, muss sichergestellt sein, dass die gesamte Anwendung nach dem Update reibungslos und wie erwartet funktioniert. Das heißt, man muss die Anwendung testen – immer und immer wieder. Manuelle und automatisierte Tests sind dabei gleichermaßen gängige Software-Testverfahren.

Der traditionelle Ansatz besteht darin, ein Quality-Assurance-, kurz QA-Team aufzustellen, das jeden Teil der Anwendung manuell prüft. Dabei werden neben Programmierfehlern auch andere Probleme aufgedeckt, die automatisierte Tests nicht erfassen – z. B. eine schlechte oder irreführende Benutzeroberfläche, fehlende Dialoge oder Lokalisierungsprobleme. Der Nachteil des manuellen Testens ist, dass die einzelnen Tester stundenlang arbeiten müssen.

In vielen Fällen können automatisierte Tests eine sehr effiziente Alternative sein und Ihren Entwicklern das Leben sehr erleichtern – sei es beim API-Testing oder beim Integrationstest, bei dem selbst Code geschrieben wird, um die Funktionalität bestimmter Funktionen, Codeteile oder ganzer Softwaremodule zu überprüfen.

Die Herausforderung: Testen des Catan-Universums

Wir haben gesehen, wie wichtig das Testen im Allgemeinen ist. Bei einem Live-Produkt wie dem Multiplayer-Online-Brettspiel Catan Universe, das wir für unseren Kunden United Soft Media GmbH in Zusammenarbeit mit der Catan GmbH entwickelt haben, wird es natürlich noch wichtiger.

Der Teil „Universe“ im Namen deutet auf eine ungeahnte Komplexität hin: die digitale Version eines ganzen Universums von Spielvarianten und -modi, darunter zwei Spiele in einem. Beide kommen mit unterschiedlichen Szenarien oder Karten, Kombinationen verschiedener Spielregeln, Einstellungen für jedes Spiel, etc. Darüber hinaus bietet Catan Universe sowohl einen Einzelspieler- als auch einen Mehrspielermodus.

Letzterer verwendet zwei verschiedene Matchmaking-Algorithmen, um mehrere Clients, d.h. Spieler, miteinander zu verbinden. Der Multiplayer-Teil selbst bietet derzeit Spiele für zwei bis sechs Gamer. Hinter den Kulissen suchen wir weiterhin nach Möglichkeiten, diese Zahl noch zu erhöhen. Eines Tages werden wir vielleicht in der Lage sein, 100 und mehr Spielern zu erlauben, eine Partie Catan gleichzeitig zu spielen.

Die Lösung: automatisierte Spieltests

Catan Universe ist ein langjähriges Produkt, das 2016 zum ersten Mal veröffentlicht wurde und über die Jahre ein kontinuierliches Wachstum verzeichnete. Die gesamte Vielfalt an unterschiedlichen Spielkonfigurationen mit all ihren verschiedenen Situationen – insbesondere in der Endgame-Phase, die bis zu einer Stunde dauern kann – ließ sich selbst vom größten QA-Team nicht manuell abdecken.

Folgerichtig wurde eine Methode benötigt, um alle Spielvarianten mit ihren verschiedenen Modi und Szenarien automatisch zu testen. Also haben wir etwas entwickelt, das wir „Automated Play Testing“ nennen. Was von Anfang an geholfen hat, war die Tatsache, dass es bereits eine KI-Implementierung (Künstliche Intelligenz) sowohl für Einzelspieler- als auch für Mehrspieler-Spiele gab: Im Spiel kann man gegen bekannte Catan-Charaktere wie Marianne oder Louis antreten, die ihre eigenen Persönlichkeiten und Spielansätze einbringen.

Während die Spielerinnen und Spieler Spaß daran haben, gegen diese Charaktere anzutreten, setzen wir sie als eigene QA-Tester ein, die das Spiel die ganze Nacht spielen können – ohne Pizza und Koffein zu brauchen. Natürlich können sie nie so schlau und kreativ sein wie die menschlichen Spieler, aber sie können jede einzelne Spielsituation abdecken, und das wiederholt, ohne dass es jemals langweilig wird.

Was wird über die KI-Tester hinaus noch benötigt?

Erstens muss das Spiel in einer Art „Autopilot-Modus“ starten, in dem es sich einfach in ein Benutzerkonto einloggt – basierend auf einer Konfigurationsdatei, die die Autopilot-Einstellungen enthält, z. B. beschrieben als JSON-Daten. Die folgende Beispiel-Konfigurationsdatei für den Autopilot-Modus bildet nur eine Teilmenge aller möglichen Parameter ab, die zum Einrichten von automatisierten Spieltests verwendet werden können.

{   "autoPilot": true,
   "email": "autopilot@automail.com",
   "password": "123456",
   "autoPlay": false,
   "turboMode": false
}

Zweitens soll der Autopilot-Modus nur in bestimmten Situationen aktiv sein, daher steuern wir über Befehlszeilenparameter, welche speziellen Funktionen aktiviert werden sollen. Wir unterscheiden zum Beispiel zwischen „aktiven“ und „passiven“ Spielinstanzen, bei denen ein aktiver Spieler andere, passive Spieler zu einem Spiel einlädt. Der folgende Befehl startet das Spiel im Autopilot-Modus als „user1“:

CatanUniverse.exe /Autopilot /Konfiguration user1.json

Sobald die automatische Anmeldung gewährleistet ist, muss der Autopilot Vorgaben erhalten, worauf er reagieren soll; oder ob er sogar seine eigene Logik starten soll, um mit anderen Clients zu kommunizieren. Entsprechende Ereignisse könnten sein:

  • Freundschafts- oder Gildenmitgliedschaftsanfragen, um eine Basis miteinander interagierender Spielerinnen und Spieler aufzubauen,
  • Lobby-Einladungen für „benutzerdefinierte Matches“ (Einladen anderer Spieler aus der Freundes-/Gildenliste haben),
  • oder eine durch den Spiel-Client ausgelöste „automatische Spielsuche“ (Suche nach Spielern, die den bevorzugten Spieleinstellungen entsprechen).

Der Autopilot-Code bleibt dabei vom Spiellogik-Code getrennt, damit kein Entwickler versehentlich die Spiellogik beschädigen kann. Natürlich soll der gesamte Autopilot-Code auch aus der endgültigen Version des Spiels entfernt werden; schließlich sollen die Spieler selbst spielen und die Autopilot-KI benutzen! Und schließlich wollen wir auf keinen Fall Sicherheitsprobleme verursachen, indem wir die automatische Steuerung mehrerer Spielinstanzen zulassen – man denke zum Beispiel an potenzielle DDoS-, sprich „Distributed Denial of Service“-Angriffe.

Das bringt uns zum letzten Puzzleteil: Um so viele Spielclients gleichzeitig starten zu können wie benötigt, wird ein externes Tool benötigt, das so genanntes „Multi-Boxing“ ermöglicht. Dies ist eine Technik, die einige Spieler von Online-Spielen verwenden, um mit mehreren Charakteren gleichzeitig zu spielen, z. B. um mehr Ressourcen oder Erfahrung zu erhalten – oder nur als "zusätzliche Herausforderung", wie beim Schachspiel gegen mehrere Gegner gleichzeitig.

Multi-Boxing-Software ermöglicht es, eine Anwendung mehrmals auf einem einzigen Computer zu starten und jeder laufenden Instanz einen separaten Satz von Dateien zu geben, mit denen sie arbeiten kann – in diesem Fall die Benutzerkonfigurationsdatei –, damit sie sich nicht gegenseitig stören.

Nachdem wir nun die grundlegende Pipeline mit mehreren KI-Spielern, die das Spiel testen, zum Laufen gebracht haben, können wir einige fortgeschrittenere Einstellungen in Betracht ziehen: Es könnte hilfreich sein, einen „Turbomodus“ zu implementieren. Wie das Video unten zeigt, läuft das Spiel mit einer unglaublich hohen Geschwindigkeit. Darüber hinaus dient dies auch als Stresstest für die Handhabung der Multiplayer-Sitzungen auf den Servern, da die KI die Spielaktionen schneller an den Server sendet, als ein Mensch das Spiel jemals spielen könnte.

Wer Hunderte von laufenden Instanzen nicht visuell überprüfen möchte, der könnte auch Logging- und Tracking-Systeme hinzufügen. Ein solches System sollte Tag und Nacht laufen, um alle Spielmodi und -situationen abzudecken sowie mögliche Freezes, Crashes oder Blocker zu finden. Vielleicht finden sich sogar Situationen, in denen die KI das Spiel abbricht, weil sie keine nützlichen Aktionen mehr ausführen konnte. All dies trägt am Ende dazu bei, das Spielerlebnis insgesamt zu verbessern.

Fazit

„Automated Play Testing“ hilft im Catan Universe dabei, die Software-Qualität zu steigern und den Aufwand durch umfangreiche manuelle Tests zu senken. Die anfängliche Implementierung war kostenintensiv; und sowohl die Wartung als auch das Hinzufügen neuer Funktionen erhöhen die Kosten moderat.

Letztendlich ist eine solche Lösung aber wirtschaftlicher als der manuelle Aufwand, der für das Testen sowie die Sicherung und Verbesserung der Qualität des Produkts erforderlich gewesen wäre. Und schlussendlich lässt sich „Automated Play Testing“ auch in die Continuous-Integration-Pipeline einbetten, so dass es wie ein regulärer automatisierter Test bei jeder geplanten neuen Version läuft.

* Sebastian Denzer ist Senior Game Developer bei Endava. Auch als „Denzi bekannt“, verbringt er im Grunde sein ganzes Leben mit der Spieleentwicklung, da er so gut wie seine gesamte Freizeit in die Entwicklung eigener Games investiert. Er besitzt mit mehr als 15 Jahren Erfahrung in allen Bereichen der Spieleentwicklung, von der Gameplay-Programmierung mit Spezialisierung auf Spiele-KI über Grafik- und Soundprogrammierung bis hin zu UI/UX und Multiplayer/Networking. Seit 2019 ist er der Lead Developer für „Catan Universe“, die digitale Version des berühmten Brettspiels. In dieser Rolle sorgt er dafür, dass die Vision des Produkts in UX und UI erhalten bleibt und ist stets darauf bedacht, das physische Brettspielgefühl – die „Haptik“ – auf das digitale Pendant zu übertragen.

(ID:48104109)