Dieser Artikel bietet eine Einführung in verschiedene Testverfahren, die Ihnen dabei helfen werden, ein stabileres Projekt mit Unity zu erstellen.
Das Testen oder die Qualitätssicherung (QA) ist ein wichtiger Prozess, der während des gesamten Spielentwicklungszyklus durchgeführt werden sollte. Wie erfahrene Entwickler wissen, muss jeder Code, den Sie schreiben, getestet werden.
Es gibt eine Reihe von Test- und QA-Methoden, die Sie anwenden können, unabhängig davon, ob Sie ein unabhängiger Entwickler oder Teil eines großen Teams sind (etablierte Studios haben oft eigene QA-Ingenieure).
Wenn Sie gerne Sport spielen und/oder beobachten, dann wissen Sie, dass in vielen Spielen die Verteidigung den Sieg davonträgt. Betrachten Sie Ihren QA-Prozess als Ihre Verteidigungsstrategie, die nichts dem Zufall überlässt, wenn es darum geht, ein Spiel mit der bestmöglichen Leistung und Stabilität zu veröffentlichen.
Das Testen ist entscheidend für die Entdeckung von Problemen wie Bugs im Code, visuelle Artefakte im Artwork oder Probleme bei der Benutzererfahrung im Spieldesign und Gameplay. Sie können das technisch beeindruckendste Spiel entwickeln, aber wenn es in neun von zehn Fällen abstürzt, werden Ihre Benutzer es ziemlich schnell aufgeben.
Vermeiden Sie es, das Testen erst am Ende des Entwicklungsprozesses durchzuführen. Anstatt das Testen als eine Phase in einer Abfolge zu betrachten, kann es hilfreich sein, es als einen fortlaufenden Prozess zu sehen, der die anderen Phasen der Spielentwicklung untermauert. Testen Sie Ihre Ideen und Prototypen während der Produktion und vor der Auslieferung. Wiederholen Sie diesen Vorgang für jedes Update, das Sie für Ihr Spiel veröffentlichen.
Es gibt eine Reihe verschiedener Testtechniken, die sich für unterschiedliche Phasen Ihres Projekts eignen.
Gehören Sie zu einem kleinen Studio, das kein eigenes QA-Team hat? Bitten Sie eine Arbeitsgruppe von Freunden, Ihnen beim Testen zu helfen, oder beauftragen Sie einen externen QA-Anbieter mit der Durchführung. Sogar Studios mit einem internen QA-Team beauftragen oft ein externes Unternehmen für zusätzliche Testdienstleistungen, wie z. B. Lokalisierungstests (LQA).
Spielertests, die als Teilbereich der Qualitätssicherung angesehen werden können, tragen dazu bei, dass Ihr Spiel bei Ihrer Zielgruppe und Ihrem Markt Anklang findet. Es ist ein Prozess, der wertvolles Feedback von Spielern liefern kann, um das Spiel während der Entwicklungsphase zu verbessern.
Die Personen, die an den Spielertests teilnehmen sollten, hängen von den spezifischen Zielen der Tests ab. Im Allgemeinen ist es jedoch wichtig, eine vielfältige Gruppe von Spielern einzubeziehen, die das Zielpublikum des Spiels repräsentieren. Indem sie verschiedene Arten von Spielern in die Spielertests einbeziehen, können die Spieleentwickler Feedback aus einer Vielzahl von Perspektiven einholen und sicherstellen, dass das Spiel ein breites Publikum anspricht.
In den folgenden Abschnitten finden Sie Informationen über gängige Testverfahren. Diese Methoden können kombiniert werden, um sicherzustellen, dass Ihre Codebasis so reibungslos wie möglich funktioniert.
Es ist auch wichtig, das Spiel auf einer Reihe von Geräten innerhalb Ihrer Zielplattformen zu testen. Dies gilt vor allem für mobile Spiele. Sie sollten auf verschiedenen Betriebssystemen, Bildschirmgrößen und den am wenigsten leistungsfähigen mobilen Geräten getestet werden. Auf diese Weise können Sie Ihre Mindestanforderungen an das Gerät festlegen, und jede Kategorie sollte ständig überprüft werden, wenn Sie Ihrer Anwendung weitere Funktionen hinzufügen.
Beim Testen auf verschiedenen Plattformen geht es nicht nur darum, potenzielle Probleme zu erkennen, die das Spiel zerstören könnten, sondern auch darum, langfristige oder indirekte Auswirkungen zu verstehen, wie z. B. Batterieentladung oder thermische Überhitzung bei mobilen Spielen.
Unit-Tests sind eine Technik, bei der einzelne Einheiten oder Komponenten eines Spiels isoliert getestet werden, um sicherzustellen, dass Fehler schon früh im Entwicklungsprozess gefunden werden und dass Änderungen am Code nicht die bestehende Funktionalität zerstören.
Unit-Tests werden durch das Schreiben kleiner Testfälle durchgeführt, die bestimmte Verhaltensweisen des Codes trainieren. Die Tests können für einzelne Skripte, Spielobjekte oder bestimmte Funktionen des Spiels durchgeführt werden.
Bei der Entwicklung von Spielen sollten sowohl manuelle als auch automatisierte Methoden für Unit-Tests eingesetzt werden.
Manuelle Einheitstests
Beim manuellen Testen wird das Spiel von Personen gespielt, um seine Merkmale und Funktionen zu testen. Es ist wichtig, manuelle Tests durchzuführen, da es Probleme gibt, die automatisierte Tests möglicherweise nicht erkennen, z. B. Fehler in der Benutzeroberfläche, unausgewogenes oder schlecht ausgeführtes Gameplay oder Design.
Ein Beispiel für manuelle Unit-Tests in Unity wäre das Hinzufügen einer Testbedingung für eine Funktion und die Verwendung von Debug.Log, um die Kriterien für das Bestehen oder Scheitern der Funktion (die Ausgabe der Testszenarien) mit dem Play-Modus von Unity auszugeben.
Automatisierte Einheitstests
Automatisierte Unit-Tests erfordern das Schreiben von Code zum automatischen Testen einzelner Einheiten oder Codeteile in Isolation. In Unity können Sie Tests für Skripte, Komponenten und andere Einheiten des Spielcodes schreiben, die als Teil einer Testsuite ausgeführt werden können.
Das Unity Test Framework (UTF) Paket bietet ein Framework für Entwickler, um ihre eigenen automatisierten Tests sowohl im Edit- als auch im Play-Modus im Unity Editor zu schreiben. UTF sucht in jeder Assembly, die auf NUnit verweist, nach einem Test. Solche Baugruppen werden als TestAssemblies bezeichnet. Die Tests im Wiedergabemodus und im Bearbeitungsmodus müssen in getrennten Baugruppen durchgeführt werden.
UTF bietet ein Test Runner-Fenster im Editor, das Sie bei der Ausführung und Verwaltung Ihrer Testfälle unterstützt.
Da UTF eine Test Assembly Definition verwendet, müssen Sie Ihr Projekt in Laufzeit-Assembly-Definitionen unterteilen. Dies ist einfacher, wenn Sie es in einem frühen Stadium des Entwicklungsprozesses planen; es ermutigt Sie auch, mehr modularen Code zu schreiben.
Das Unity-Paket " Performance Testing Extension" ist eine Erweiterung, die Sie mit der UTF verwenden können. Es bietet zusätzliche APIs, um Messungen durchzuführen und benutzerdefinierte Metriken aus Ihren Testfällen bereitzustellen.
Erfahren Sie, wie Sie mit dem Unity Test Framework beginnen können, indem Sie das Unity Test Framework für die Entwicklung von Videospielen durchlesen.
Testgetriebene Entwicklung (TDD) ist eine Technik, bei der Tests für eine Funktion geschrieben werden, bevor der eigentliche Code zur Implementierung geschrieben wird. Der Prozess umfasst in der Regel das Schreiben eines fehlgeschlagenen Tests, das Schreiben der minimalen Menge an Code, die notwendig ist, um den Test zu bestehen, und das anschließende Refactoring des Codes, um ihn wartungsfreundlicher zu machen, bevor man zum Entwurf des nächsten Testfalls übergeht.
TTD ist in der Spieleentwicklung recht selten (in der Mainstream-Softwareentwicklung ist sie üblicher). Das liegt wahrscheinlich daran, dass es ein kontraintuitiver Prozess für das Prototyping und die Entwicklung eines unterhaltsamen und fesselnden Gameplays ist.
Es kann jedoch den Prozess der Identifizierung fehlerhafter Teile Ihrer Spiele beschleunigen, da jede spielverändernde Änderung sofort zu fehlerhaften Testfällen führt.
Weitere Informationen zu TDD in Unity finden Sie im Blogbeitrag "Testing Test-Driven Development with the Unity Test Runner".
Codeabdeckung
Wenn Sie TDD oder Unit-Tests implementieren möchten, sollten Sie das Unity Code Coverage-Paket verwenden. In Verbindung mit UTF kann das Code Coverage-Paket Ihnen zeigen, welche Codezeilen in Ihrem Projekt getestet werden, um Ihnen zu helfen, verwundbare oder ungetestete Teile Ihres Projekts zu identifizieren.
Code Coverage kann auch Berichte erstellen, während Sie Ihr Spiel im Spielmodus testen. Dies zeigt Ihnen Teile Ihres Codes, die Sie regelmäßig testen, auch wenn sie nicht von Unit-Tests abgedeckt sind. Die Codeabdeckungsberichte zeigen Ihnen zwar, welche Codezeilen in Ihrem Test abgedeckt wurden, aber sie zeigen Ihnen nicht die verschiedenen Pfade, die die Logik im Code durchlaufen hat.
Siehe den Blogbeitrag "Code Coverage: Erkennen Sie Lücken in Ihren Tests" für weitere Informationen.
Integrationstests sind eine Technik, bei der verschiedene Komponenten eines Systems zusammen getestet werden, um sicherzustellen, dass sie korrekt funktionieren. Dabei kann getestet werden, wie verschiedene GameObjects, Skripte oder Systeme im Spiel miteinander interagieren. Aufgrund ihres größeren Umfangs können Integrationstests dazu beitragen, Fehler zu finden, die bei Unit-Tests möglicherweise nicht auftauchen, z. B. Probleme mit dem Datenfluss oder der Kommunikation zwischen Komponenten.
Anstatt einzelne Unit-Tests zu verwenden, könnte beispielsweise ein Integrationstest für die gesamte Sequenz geschrieben werden: Ein Spieler feuert eine Waffe ab, die ein Geschoss instanziiert, das Geschoss trifft einen Feind und tötet ihn, der Spieler erhält Punkte für das Töten des Feindes und eine Leistung wird freigeschaltet, wenn der Spieler eine bestimmte Punktzahl erreicht.
Sie können UTF verwenden, um Integrationstests in Unity zu erstellen. Mit den Methoden SetUp und TearDown können Sie eine Umgebung schaffen, in der Sie mehrere Systeme gleichzeitig testen können. Spielerlogik und -eingaben können simuliert werden, vor allem, wenn Sie sie mit dem Befehlsmuster implementiert haben (und wenn Sie das neue Eingabesystem verwenden, haben Sie das wahrscheinlich schon getan), damit Sie den vollständigen Fluss der Spielereingaben zur Spiellogik testen können.
Regressionstests sind eine Methode, um zu überprüfen, ob Software oder Funktionen nach einer Änderung oder Aktualisierung korrekt funktionieren. Das Ziel von Regressionstests ist es, sicherzustellen, dass Änderungen an der Codebasis keine neuen Fehler oder Regressionen in die Software einführen. Diese Technik eignet sich am besten für große, komplexe Anwendungen mit häufigen Aktualisierungen, wie z. B. ein Live-Spiel, bei dem es viele verschiedene Komponenten geben kann, die auf unerwartete Weise interagieren können.
Mit der Erweiterung der Spielwelt und der Spielmechanik steigt auch der Bedarf an Regressionstests, was sich als kostspielig erweisen kann. Deshalb ist es wichtig, sie so weit wie möglich zu automatisieren. Regressionstests sollten parallel zur Entwicklung neuer Funktionen durchgeführt werden, insbesondere wenn Sie mehrere Plattformen anvisieren.
Regressionstests eignen sich zwar am besten für größere und laufende Spiele, aber auch andere Faktoren wie die Komplexität der Software, die Häufigkeit von Änderungen oder Aktualisierungen und die kritische Bedeutung der betroffenen Funktionen (missions- oder sicherheitskritische Systeme) bestimmen ihre Notwendigkeit.
Funktionstests bewerten die Funktionalität eines Systems oder einer Softwareanwendung, indem sie diese anhand ihrer funktionalen Anforderungen testen. Dazu gehört das Testen der Systemfunktionen, der Benutzerschnittstellen, der Datenbankinteraktionen und anderer Aspekte, die das Verhalten und die Funktionalität des Systems beeinflussen. Ziel des Funktionstests ist es, zu überprüfen, ob das System oder die Anwendung die vom Kunden oder Endbenutzer vorgegebenen Anforderungen und Spezifikationen erfüllt.
Die meisten Unit-Tests konzentrieren sich auf einen bestimmten Pfad durch den Code und testen, ob dieser auf der Grundlage bestimmter Eingaben die richtigen Ergebnisse liefert. Es ist nicht in der Lage zu testen, ob das Spiel das tut, was es tun soll.
Funktionstests sind der Ansatz dafür. Jede Funktion oder jedes Merkmal wird mit dem ursprünglichen Entwurf verglichen, um festzustellen, ob das Ergebnis den Erwartungen entspricht. Dies kann das Testen der Spielsteuerung, der Spielmechanik und der allgemeinen Benutzerfreundlichkeit beinhalten.
Es kann nützlich sein, bei der Entwicklung Ihres Spiels funktionale Tests im Hinterkopf zu behalten und Aufgaben nach dem Prinzip "wenn dies, dann das" zu erstellen. Wenn der Spieler zum Beispiel die Leertaste drückt, sollte die Figur springen: Dies ist sowohl eine Anweisung an den Entwickler, wie er eine Funktion implementieren soll, als auch ein Abnahmekriterium für den Tester, gegen das er testen kann. Manchmal kann ein Merkmal einige zugehörige Akzeptanzkriterien enthalten, z. B. wann ein Merkmal verwendet werden kann und wann nicht. Sie sollten sich jedoch im Allgemeinen auf eine einzige Funktion konzentrieren.
Funktionstests sind am wirkungsvollsten, wenn die Anforderungen klar definiert und abgegrenzt sind. Es kann daher nützlich sein, um Freiberufler oder Studios mit der Lieferung von Komponenten für Ihr Gameplay oder Ihre Spielwelt zu beauftragen.
Sie können sowohl automatisierte als auch manuelle Funktionstests durchführen. Es sollten sowohl "Black-Box"-Tests (Testen des Systems ohne Kenntnis seiner internen Funktionsweise) als auch "White-Box"-Tests (Testen des Systems mit Kenntnis seiner internen Funktionsweise) durchgeführt werden.
Bei den Leistungstests wird das Spiel getestet, um sicherzustellen, dass es auf verschiedenen Hardware- und Softwarekonfigurationen reibungslos und effizient läuft. Dies steht in engem Zusammenhang mit der Profilerstellung und allgemeinen Leistungsoptimierungsabläufen und kann helfen, Leistungsengpässe oder Probleme zu erkennen, die sich auf die Leistung des Spiels auswirken können.
Das Hauptziel besteht darin, die Leistung eines Systems oder einer Anwendung unter verschiedenen Arbeitsbedingungen zu bewerten. Bei der Spieleentwicklung wird durch Leistungstests geprüft, ob das Spiel mit einer akzeptablen Leistung, Bildrate, Reaktionsfähigkeit und Stabilität läuft und den Speicher möglichst effizient nutzt.
Zu den verschiedenen Arten von Leistungstests gehören:
- Belastungstests: Bestimmt, wie das Spiel bei hoher Arbeitsbelastung abschneidet
- Stresstests: Bewertet, wie das Spiel mit unerwarteten Situationen umgeht, z. B. einem plötzlichen Anstieg der Spieleraktivität
- Ausdauertests: Bewertet, wie das Spiel über lange Zeiträume hinweg funktioniert
Der Unity Profiler
Das Profiler-Tool in Unity hilft Ihnen, die Leistung Ihres Spiels während der Entwicklung zu analysieren. Es funktioniert sowohl im Editor, so dass Sie sich während der Entwicklung einen Überblick verschaffen können, als auch auf einem beliebigen Gerät, das per Kabel oder über ein lokales Netzwerk mit Ihrem Rechner verbunden ist, so dass Sie genau analysieren können, wie Ihr Spiel auf dem Zielgerät läuft.
Der Profiler kann erweitert werden, um sowohl die Art der zu erfassenden Daten als auch deren visuelle Darstellung im Profiler-Fenster anzupassen.
Erfahren Sie mehr über die Anpassung des Profiler in der Unite 2022-Sitzung "How to customize performance metrics in the Unity Profiler".
Sie können auch Ihre eigenen Tools schreiben, um automatisierte Leistungstests durchzuführen. Eine interessante Diskussion darüber, wie man dies angehen kann, bietet der Vortrag der Monument Valley-Entwickler, ustwo Games, auf der Unite 2022: "Alba machen: Wie man ein performantes Open-World-Spiel entwickelt."
Das Testen beschränkt sich nicht auf das Auffinden von Fehlern und die Überwachung der Leistung. Manchmal möchten Sie vielleicht zwei Versionen eines Spielmerkmals miteinander vergleichen, um festzustellen, welche Version bei den Spielern mehr Anklang findet und besser abschneidet. Dies wird als A/B-Test bezeichnet.
A/B-Tests sind nützlich, um die Werte eines Charakters oder einer Waffe zu verändern, die die Balance des Spiels beeinflussen würden, aber die Spielmechanik nicht verändern. Andere Beispiele sind Tests, die durchgeführt werden, um die Wirksamkeit verschiedener Tutorials, Spielmechaniken oder Benutzeroberflächen zu vergleichen. Durch die Analyse der von den beiden Gruppen gesammelten Daten können Sie feststellen, welche Version des Spiels oder der Funktion effektiver ist, und datengestützte Entscheidungen darüber treffen, welche Änderungen in das Endprodukt aufgenommen werden sollen.
Bei A/B-Tests werden Spieler nach dem Zufallsprinzip zwei Gruppen zugewiesen: Eine Gruppe spielt die ursprüngliche Version des Spiels oder Features (die Kontrollgruppe), während die andere Gruppe eine veränderte Version des Spiels oder Features spielt (die Versuchsgruppe).
Der Schlüssel liegt darin, Daten darüber zu sammeln, wie sich die verschiedenen Änderungen auf eine kleine Gruppe von Spielern ausgewirkt haben, um eine Entscheidung darüber zu treffen, welcher Ansatz als weit verbreitetes Update veröffentlicht werden soll.
A/B-Tests können dazu beitragen, das Benutzererlebnis zu verbessern und das Engagement und die Bindung der Spieler zu erhöhen. Dies ist besonders nützlich für Spiele mit einer großen Nutzerbasis, bei denen selbst kleine Verbesserungen in der Nutzerbindung oder -bindung eine große Wirkung haben können.
A/B-Tests werden in der Regel als Backend-Service angeboten, wobei die Spieler nicht einmal wissen, dass sie eine andere Variante verwenden. Unity Gaming Services (UGS) bietet Tools, mit denen Sie A/B-Tests in Ihrem Spiel durchführen können. Sie können sich auch die UGS Use Cases ansehen, eine Sammlung von Beispielen für unsere Backend-Services, um zu erfahren, wie Sie A/B-Tests in einem Spiel einrichten könnten.
Cloud Diagnostics Advanced ist ein von Backtrace unterstütztes Tool für Absturzberichte und Analysen, das sich in Unity integriert und Entwicklern detaillierte Informationen über Abstürze und Ausnahmen in ihren Spielen liefert. Wenn ein Absturz auftritt, erfasst Cloud Diagnostics Advanced einen Schnappschuss des Spielzustands zum Zeitpunkt des Absturzes, einschließlich Informationen über die Umgebung, den Aufrufstapel, den Heap und die Register. Dieser Snapshot wird dann an die Backtrace-Server gesendet, wo er analysiert wird, um die Ursache des Absturzes zu ermitteln.
Cloud Diagnostics Advanced bietet außerdem detaillierte Analyse- und Berichtstools, mit denen Sie Trends und Muster in der Leistung und Stabilität Ihrer Spiele im Laufe der Zeit erkennen können. Ein Deduplizierungsalgorithmus gruppiert häufige Abstürze nach ihrer Ursache im Code, was dabei helfen kann, Prioritäten zu setzen, welche Fehler zuerst behoben werden müssen, um die Stabilität für möglichst viele Spieler zu verbessern.
Unabhängig davon, welche Testtechniken Sie verwenden, ist es wichtig, dass Sie einen Plan haben, wie Sie Ihr Spiel testen wollen, und dass Sie sicherstellen, dass das Testen ein integraler Bestandteil Ihres Entwicklungsprozesses ist. Mit einer Kombination dieser Techniken können Sie sicherstellen, dass Ihr Unity-Spiel von höchster Qualität und produktionsreif ist.
Eine neue Reihe von E-Books für Programmierer ist jetzt kostenlos bei Unity erhältlich. Jeder Leitfaden wurde von erfahrenen Programmierern verfasst und enthält bewährte Verfahren für bestimmte Themen, die für Entwicklungsteams wichtig sind.
Erstellen Sie einen C# Style Guide: Schreiben Sie sauberen, skalierbaren Code leitet Teams bei der Entwicklung eines Styleguides an, um ihre Vorgehensweise bei der Erstellung einer kohärenteren Codebasis zu vereinheitlichen.
Verbessern Sie Ihren Code mit Programmiermustern für Spiele hebt Best Practices für die Verwendung der SOLID-Prinzipien und gängiger Programmiermuster hervor, um eine skalierbare Spielcode-Architektur in Ihrem Unity-Projekt zu erstellen.
Erstellen einer modularen Spielarchitektur in Unity mit ScriptableObjects bietet Best Practices für den Einsatz von ScriptableObjects in der Spieleproduktion.
Wir haben diese Serie ins Leben gerufen, um den erfahrensten Kreativen praktische Tipps und Anregungen zu geben. Aber sie sind keine Regelbücher! Es gibt viele Möglichkeiten, Ihr Unity-Projekt zu strukturieren. Bewerten Sie gemeinsam mit Ihren Kollegen die Vor- und Nachteile jeder Empfehlung, jedes Tipps und jedes Musters, bevor Sie es einsetzen.
Weitere Anleitungen und Artikel für Fortgeschrittene finden Sie im Unity Best Practices Hub.