Hero background image

Tipps zur Prüfung und Qualitätssicherung von Unity Projekten

Diese Website wurde aus praktischen Gründen für Sie maschinell übersetzt. Die Richtigkeit und Zuverlässigkeit des übersetzten Inhalts kann von uns nicht gewährleistet werden. Sollten Sie Zweifel an der Richtigkeit des übersetzten Inhalts haben, schauen Sie sich bitte die offizielle englische Version der Website an.

Dieser Artikel bietet eine Einführung in verschiedene Testverfahren, mit denen Sie ein stabileres Projekt mit Unity erstellen können.

Tests oder Qualitätssicherung (QA) sind ein wichtiger Prozess, der während des gesamten Spieleentwicklungszyklus durchgeführt werden sollte. Wie erfahrene Entwickler wissen, muss jeder Code, den Sie schreiben, getestet werden.

Es gibt eine Reihe von Test- und Qualitätssicherungsmethoden, die Sie anwenden können, unabhängig davon, ob Sie ein unabhängiger Entwickler oder Teil eines großen Teams sind (in etablierten Studios gibt es oft dedizierte Qualitätssicherungstechniker).

Wenn Sie gerne spielen und/oder Sport schauen, dann wissen Sie, dass in vielen Spielen die Verteidigung die Meisterschaften gewinnt. 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.

Warum sind Tests und Qualitätssicherung wichtig?

Tests sind entscheidend, um Probleme wie Fehler in Ihrem Code, visuelle Artefakte in Grafiken oder Probleme mit der Benutzererfahrung im Spieldesign und Gameplay zu entdecken. Sie können das technisch beeindruckendste Spiel entwickeln, aber wenn es neunmal von 10 abstürzt, werden Ihre Benutzer es ziemlich schnell aufgeben.

Wann sollten Sie Tests im Spieleentwicklungszyklus implementieren?

Vermeiden Sie es, das Testen dem Ende Ihres Spieleentwicklungsprozesses zu überlassen. Anstatt Tests als eine Phase einer Sequenz zu betrachten, kann es hilfreich sein, sie als einen fortlaufenden Prozess zu betrachten, der die anderen Phasen der Spieleentwicklung untermauert. Testen Sie Ihre Ideen und Prototypen während der gesamten Produktion und vor dem Versand. Wiederholen Sie diesen Vorgang für jedes Update, das Sie für Ihr Spiel veröffentlichen.

Es gibt eine Reihe verschiedener Testtechniken, die sich besser für verschiedene Phasen Ihres Projekts eignen.

Wer ist für Tests und Qualitätssicherung zuständig?

Sind Sie Mitglied eines kleinen Studios ohne dediziertes Qualitätssicherungsteam? Holen Sie sich eine Arbeitsgruppe von Freunden, die Ihnen beim Testen helfen, oder wählen Sie einen Drittanbieter für Qualitätssicherung. Auch Studios mit einem hauseigenen QA-Team nutzen oft ein externes Unternehmen für zusätzliche Testdienste, wie z. B. Lokalisierungstests (LQA).

Spielertests, die als Untergruppe der Qualitätssicherung angesehen werden können, helfen sicherzustellen, dass Ihr Spiel bei Ihrer Zielgruppe und Ihrem Markt Anklang findet. Es ist ein Prozess, der wertvolles Feedback von Spielern geben kann, um das Spiel während der Entwicklungsphase zu verbessern.

Die Personen, die am Spielertest teilnehmen sollten, variieren je nach den spezifischen Zielen des Tests. Im Allgemeinen ist es jedoch wichtig, eine vielfältige Gruppe von Spielern einzubeziehen, die die Zielgruppe für das Spiel darstellen. Durch die Einbindung verschiedener Arten von Spielern in Spielertests können Spieleentwickler Feedback aus verschiedenen Perspektiven einholen und sicherstellen, dass das Spiel ein breites Publikum anspricht.

Wie QA und Testen eines Spiels?

In den folgenden Abschnitten können Sie über gängige Testtechniken lesen. 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 der Zielplattformen zu testen. Das gilt besonders für mobile Spiele. Sie sollten auf verschiedenen Betriebssystemen, Bildschirmgrößen und den niedrigsten Spezifikations-Mobilgeräten testen. Dies hilft Ihnen, Ihre Mindestanforderungen an Geräte zu vergleichen, 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 spielgefährdende Probleme zu identifizieren, sondern es ist auch wichtig, die langfristigen oder indirekten Auswirkungen wie die Batterieentleerung oder thermische Überhitzung für mobile Spiele zu verstehen.

Unit Testing Dialog im Unity Editor

Einheitentests

Unit Testing ist eine Technik, bei der einzelne Units oder Komponenten eines Spiels isoliert getestet werden, um sicherzustellen, dass Fehler frühzeitig im Entwicklungsprozess erkannt werden und Änderungen am Code die bestehenden Funktionen nicht beeinträchtigen.

Unit Testing wird durchgeführt, indem kleine Testfälle geschrieben werden, die spezifische Verhaltensweisen des Codes üben. Tests können mit einzelnen Skripten, GameObjects oder bestimmten Funktionen des Spiels durchgeführt werden.

Bei der Spieleentwicklung sollten sowohl manuelle als auch automatisierte Methoden für Unit Testing zum Einsatz kommen.

Manuelle Einheitenprüfung

Manuelle Tests beinhalten Personen, die das Spiel spielen, um seine Funktionen und Funktionalität zu testen. Es ist wichtig, manuelle Tests durchzuführen, da es Probleme gibt, die automatisierte Tests möglicherweise nicht erkennen, wie z. B. Benutzeroberflächenfehler oder unausgewogenes oder schlecht ausgeführtes Gameplay oder Design.

Ein Beispiel für manuelle Einheitentests in Unity wäre das Hinzufügen einer Testbedingung für eine Funktion und die Verwendung von Debug.Log zur Ausgabe der Kriterien für ein Bestehen oder Scheitern (Ausgabe der Testszenarien) im Play-Modus von Unity.

Automatisierte Einheitentests

Automatisierte Einheitentests erfordern das Schreiben von Code, um einzelne Einheiten oder Codestücke automatisch isoliert zu testen. In Unity können Sie Tests für Skripts, Komponenten und andere Einheiten von Spielcode schreiben, die als Teil einer Testsuite ausgeführt werden können.

Das Paket Unity Test Framework (UTF) bietet Entwicklern ein Framework, um ihre eigenen automatisierten Tests sowohl im Edit- als auch im Play-Modus im Unity Editor zu schreiben. UTF sucht nach einem Test in jeder Assembly, die NUnit referenziert. Solche Baugruppen werden als TestAssemblies bezeichnet. Spielmodus- und Bearbeitungsmodus-Tests müssen in separaten Assemblys durchgeführt werden.

UTF bietet ein Fenster Test Runner im Editor, das Ihnen beim Ausführen und Verwalten Ihrer Testfälle hilft.

Da UTF eine Test Assembly-Definition verwendet, müssen Sie Ihr Projekt in Laufzeit-Assembly-Definitionen unterteilen. Dies ist einfacher, wenn Sie es in einer frühen Phase des Entwicklungsprozesses planen, und es ermutigt Sie auch, modularen Code zu schreiben.

Das Unity Paket, Performance Testing Extension, ist eine Erweiterung, die Sie mit dem UTF verwenden können. Es bietet zusätzliche APIs zum Messen und Bereitstellen benutzerdefinierter Metriken aus Ihren Testfällen.

Erfahren Sie, wie Sie mit dem Unity Test Framework beginnen können, indem Sie das Tutorial Unity Test Framework für die Entwicklung von Videospielen durchlesen.

Diagramm und Tabelle des Erfassungsverlaufs

Testgestützte Entwicklung

Test-driven Development (TDD) ist eine Technik, bei der Tests für eine bestimmte Funktionalität geschrieben werden, bevor der eigentliche Code geschrieben wird, um ihn zu implementieren. Der Prozess umfasst in der Regel das Schreiben eines durchgefallenen Tests, das Schreiben der Mindestanzahl an Code, die erforderlich ist, um den Test zu bestehen, und dann das Refactoring des Codes, um ihn wartbarer zu machen, bevor Sie mit dem Design des nächsten Testfalls fortfahren.

TTD ist in der Spieleentwicklung eher selten (in der Mainstream-Softwareentwicklung häufiger). Dies liegt wahrscheinlich daran, dass es sich um einen kontraintuitiven Prozess für das Prototyping und die Entwicklung von unterhaltsamen und überzeugenden Gameplays handelt.

Es kann jedoch den Prozess zur Identifizierung defekter Teile Ihrer Spiele beschleunigen, da jede spielabbrechende Änderung sofort zu fehlgeschlagenen Testfällen führt.

Weitere Informationen zu TDD in Unity finden Sie im Blog-Eintrag „Testen testgestützter Entwicklung mit dem Unity Test Runner“.

Codeabdeckung

Wenn Sie TDD- oder Unit-Tests implementieren möchten, sollten Sie das Unity Code Coverage Paket verwenden. Bei Verwendung mit UTF kann Ihnen das Paket Code Coverage anzeigen, welche Codezeilen in Ihrem Projekt getestet werden, um Ihnen zu helfen, verwundbare oder ungetestete Teile Ihres Projekts zu identifizieren.

Code Coverage kann auch Berichte generieren, während Sie Ihr Spiel im Play-Modus testen. Dadurch werden Ihnen Teile Ihres Codes angezeigt, die Sie regelmäßig testen, auch wenn sie nicht von Unit Testing abgedeckt werden. Die Code Coverage Berichte zeigen Ihnen zwar, welche Codezeilen in Ihrem Test behandelt wurden, zeigen Ihnen jedoch nicht die verschiedenen Pfade, die die Logik im Code durchlaufen hat.

Siehe Blog-Eintrag "Code Coverage: Erkennen Sie Lücken in Ihren Tests“ für weitere Informationen.

Integrationstests

Integrationstests sind eine Technik, bei der verschiedene Komponenten eines Systems gemeinsam getestet werden, um sicherzustellen, dass sie korrekt funktionieren. Dazu gehört das Testen, wie verschiedene GameObjects, Skripts oder Systeme innerhalb des Spiels miteinander interagieren. Aufgrund seines größeren Umfangs können Integrationstests dazu beitragen, Fehler zu finden, die bei Unit-Tests möglicherweise nicht auftreten, wie z. B. Probleme mit dem Datenfluss oder der Kommunikation zwischen Komponenten.

Anstelle einzelner Einheitentests könnte beispielsweise ein Integrationstest für diese gesamte Sequenz geschrieben werden: ein Spieler feuert eine Waffe ab, die eine Kugel instanziiert, die Kugel trifft einen Feind und tötet ihn, der Spieler erhält Punkte für das Töten des Feindes und eine Errungenschaft wird freigeschaltet, wenn der Spieler eine bestimmte Punktzahl erreicht.

Sie können UTF verwenden, um Integrationstests in Unity zu erstellen. Mithilfe der SetUp- und TearDown-Methoden können Sie eine Umgebung erstellen, um mehrere Systeme gleichzeitig zu testen. Spielerlogik und -eingabe können simuliert werden, insbesondere wenn Sie sie mit dem Befehlsmuster implementiert haben (und wenn Sie das neue Eingabesystem verwenden, dann wahrscheinlich auch), um den vollständigen Fluss der Spielereingabe in die Spiellogik zu testen.

Regressionstests

Regressionstests sind eine Methode, um zu überprüfen, ob Software oder Funktionen nach der Änderung oder Aktualisierung richtig funktionieren. Regressionstests sollen sicherstellen, dass Änderungen an der Codebasis nicht zu neuen Bugs oder Softwareregressionen führen. Diese Technik wird am besten bei großen, komplexen Anwendungen mit häufigen Updates angewendet, wie z. B. bei einem Live-Spiel, bei dem es viele verschiedene Komponenten geben kann, die auf unerwartete Weise interagieren können.

Je größer Ihre Spielwelt und Mechaniken werden, desto größer wird auch die Notwendigkeit von Regressionstests, was diese kosten kann. Daher ist es wichtig, ihn nach Möglichkeit zu automatisieren. Regressionstests sollten parallel zur Entwicklung neuer Funktionen durchgeführt werden, insbesondere wenn Sie auf mehrere Plattformen abzielen.

Regressionstests eignen sich zwar am besten für größere und Live-Spiele, aber auch andere Faktoren wie die Komplexität der Software, die Häufigkeit von Änderungen oder Updates und die kritische Bedeutung betroffener Funktionen (missions- oder sicherheitskritische Systeme) bestimmen den Bedarf.

Funktionstests

Funktionstests bewerten die Funktionalität eines Systems oder einer Softwareanwendung, indem sie es anhand seiner funktionalen Anforderungen testen. Dazu gehört das Testen der Funktionen, Benutzeroberflächen, Datenbankinteraktionen und anderer Aspekte, die sich auf das Verhalten und die Funktionalität des Systems auswirken. Ziel von Funktionstests ist es, zu überprüfen, ob das System oder die Anwendung die Anforderungen und Spezifikationen des Kunden oder Endnutzers erfüllt.

Die meisten Einheitentests konzentrieren sich auf einen bestimmten Pfad durch den Code und prüfen, ob er basierend auf bestimmten Eingaben die richtigen Ausgaben liefert. Es kann nicht testen, ob das Spiel das tut, wofür es entwickelt wurde.

Funktionstests sind der Ansatz dafür. Jede Funktion oder Funktion wird mit dem Originaldesign verglichen, um festzustellen, ob die Ausgabe den Erwartungen entspricht. Dazu gehören Tests der Spielsteuerung, Gameplay-Mechaniken und der allgemeinen Benutzererfahrung.

Es kann nützlich sein, Funktionstests bei der Entwicklung Ihres Spiels im Auge zu behalten und Aufgaben mit dem „Wann, dann das“-Ansatz zu erstellen. Wenn der Spieler beispielsweise die Leertaste drückt, sollte der Charakter springen: Dies ist sowohl eine Anleitung für den Entwickler, wie er eine Funktion implementieren soll, als auch ein Akzeptanzkriterium, gegen das der Tester testen muss. Manchmal kann eine Funktion einige verwandte Akzeptanzkriterien enthalten, z. B. wann eine Funktion verwendet werden kann und wann nicht. Sie sollten sich jedoch in der Regel auf ein einzelnes Funktionselement konzentrieren.

Funktionstests sind am leistungsfähigsten, wenn die Anforderungen klar definiert und festgelegt sind. Es kann daher nützlich sein, wenn Sie Freiberufler oder Studios beauftragen, Komponenten Ihres Gameplays oder Ihrer Spielwelt-Assets bereitzustellen.

Sie können sowohl automatisierte als auch manuelle Funktionstests durchführen. Es sollten sowohl „Black-Box“-Tests (Testen des Systems ohne Kenntnis der internen Funktionsweise) als auch „White-Box“-Tests (Testen des Systems mit Kenntnis der internen Funktionsweise) durchgeführt werden.

GPU-Graph für Spiel

Leistungstests

Leistungstests beinhalten Tests des Spiels, um sicherzustellen, dass es reibungslos und effizient auf verschiedenen Hardware- und Softwarekonfigurationen läuft. Dies hängt eng mit dem Profiling und allgemeinen Leistungsoptimierungsworkflows zusammen und kann dazu beitragen, Leistungsengpässe oder Probleme zu identifizieren, die sich auf die Leistung des Spiels auswirken können.

Das Hauptziel besteht darin, die Leistung eines Systems oder einer Anwendung unter verschiedenen Arbeitsauslastungsbedingungen zu bewerten. Bei der Spieleentwicklung wird durch Leistungstests festgestellt, ob das Spiel mit einem akzeptablen Maß an Leistung, Framerate, Reaktionsfähigkeit und Stabilität läuft und den Speicher am effizientesten nutzt.

Verschiedene Arten von Leistungstests umfassen:

  • Belastungstests: Bestimmt die Leistung des Spiels bei hoher Auslastung
  • Stresstests: Beurteilt, wie das Spiel mit unerwarteten Situationen umgeht, wie z. B. plötzlicher Zunahme der Spieleraktivität
  • Dauertests: Beurteilt die Leistung des Spiels über lange Zeiträume

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, bietet eine Übersicht, während Sie entwickeln, als auch auf jedem Gerät, das per Kabel oder über ein lokales Netzwerk mit Ihrem Rechner verbunden ist, und bietet eine genaue Analyse der Ausführung Ihres Spiels auf einem Zielgerät.

Der Profiler kann erweitert werden, um die Darstellung sowohl der Art der Daten, die Sie erfassen möchten, als auch der Art und Weise, wie sie visuell im Profiler-Fenster dargestellt werden, anzupassen.

Weitere Informationen zur Anpassung des Profilers finden Sie in der Unite 2022-Sitzung „Anpassung von Leistungsmetriken im Unity Profiler“.

Sie können auch Ihre eigenen Tools schreiben, um automatisierte Leistungstests zu erstellen. Für eine interessante Diskussion darüber, wie man dies angeht, werfen Sie einen Blick auf den Vortrag der Monument Valley-Entwickler, ustwo Games, von der Unite 2022: „Die Herstellung von Alba: Wie man ein leistungsstarkes Open-World-Spiel entwickelt.

A/B-Tests zu Metriken und Events

A/B-Tests

Das Testen beschränkt sich nicht auf das Auffinden von Fehlern und die Überwachung der Leistung. Manchmal möchten Sie vielleicht zwei Versionen einer Spielfunktion vergleichen, um festzustellen, welche mehr Spielerbindung erhält und besser abschneidet. Dies wird als A/B-Test bezeichnet.

A/B-Tests sind nützlich, um die Statistiken eines Charakters oder von Waffen zu modifizieren, die sich auf die Balance Ihres Spiels auswirken würden, aber bei denen die Spielmechaniken unverändert bleiben. Andere Beispiele könnten Tests sein, die durchgeführt wurden, um die Effektivität verschiedener Tutorials, Spielmechaniken oder Benutzeroberflächen zu vergleichen. Durch die Analyse der Daten aus den beiden Gruppen 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 übernommen werden sollen.

A/B-Tests beinhalten die zufällige Zuweisung von Spielern zu zwei Gruppen: Eine Gruppe spielt die ursprüngliche Version des Spiels oder der Funktion (die Kontrollgruppe), während die andere Gruppe eine modifizierte Version des Spiels oder der Funktion (die experimentelle Gruppe) spielt.

Der Schlüssel besteht darin, Daten darüber zu sammeln, wie eine kleine Gruppe von Spielern von den verschiedenen Änderungen betroffen war, um Ihnen bei der Designentscheidung zu helfen, welchen Ansatz Sie als weit verbreitetes Update veröffentlichen sollten.

A/B-Tests können dazu beitragen, die Benutzererfahrung zu verbessern und die Spielerbindung und -bindung zu erhöhen. Besonders nützlich ist es für Spiele mit einer großen Benutzerbasis, bei denen bereits kleine Verbesserungen bei der Nutzerbindung oder -bindung erhebliche Auswirkungen haben können.

A/B-Tests werden in der Regel als Backend-Service angeboten, wobei den Spielern nicht einmal bewusst ist, dass sie eine andere Variante verwenden. Unity Gaming Services (UGS) verfügt über Tools, die Ihnen helfen, A/B-Tests in Ihrem Spiel durchzuführen, worüber Sie hier mehr erfahren können. Sie können sich auch die UGS Use Cases ansehen, eine Sammlung von Beispielen für unsere Backend-Dienste, um Beispiele für die Einrichtung von A/B-Tests in einem Spiel zu finden.

Diagnosetest-Tools

Cloud Diagnostics Advanced ist ein Tool zur Meldung und Analyse von Abstürzen, das von Backtrace unterstützt wird und sich in Unity integriert, um Entwicklern detaillierte Informationen über Abstürze und Ausnahmen in ihren Spielen zu liefern. Bei einem Absturz erfasst Cloud Diagnostics Advanced einen Schnappschuss des Spielzustands zum Zeitpunkt des Absturzes, einschließlich Informationen zur Umgebung, zum Aufrufstapel, zum Heap und zu Registern. Dieser Snapshot wird dann an die Backtrace-Server gesendet und dort analysiert, um die Absturzursache zu ermitteln.

Cloud Diagnostics Advanced bietet auch detaillierte Analytics und Reporting-Tools, mit denen Sie Trends und Muster in der Leistung und Stabilität Ihrer Spiele im Laufe der Zeit identifizieren können. Ein Deduplizierungsalgorithmus gruppiert häufige Abstürze nach ihrer eigentlichen Ursache im Code, was dazu verwendet werden kann, die zuerst zu behebenden Fehler zu priorisieren, um die Stabilität für die meisten Spieler zu verbessern.

Mehr Ressourcen zur Qualitätssicherung für Spieleentwickler

Unabhängig davon, welche Testtechniken Sie verwenden, ist es wichtig, einen Plan zu haben, wie Sie Ihr Spiel testen werden, und sicherzustellen, dass das Testen ein integraler Bestandteil Ihres Entwicklungsprozesses ist. Durch die 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 wird von erfahrenen Programmierern erstellt und enthält Best Practices für spezifische Themen, die für Entwicklungsteams wichtig sind.

Erstellen Sie eine C#-Anleitung: Schreiben Sie saubereren Code, der skaliert, um Teams bei der Entwicklung eines Style-Leitfadens zu unterstützen und ihren Ansatz für eine zusammenhängendere Codebasis zu vereinheitlichen.

Das Verbessern Ihres Codes mit Spielprogrammierungsmustern zeigt bewährte Verfahren für die Verwendung der SOLID-Grundsätze und gängigen Programmiermuster zur Erstellung einer skalierbaren Spielcodearchitektur in Ihrem Unity Projekt.

Die Erstellung modularer Spielarchitekturen in Unity mit ScriptableObjects bietet bewährte Verfahren für die Bereitstellung von ScriptableObjects in der Spieleproduktion.

Wir haben diese Serie entwickelt, um unseren erfahrensten Entwicklern praktische Tipps und Inspiration zu geben. Aber es sind keine Regelbücher! Es gibt viele Möglichkeiten, Ihr Unity Projekt zu strukturieren. Bewerten Sie die Vor- und Nachteile der einzelnen Empfehlungen, Tipps und Muster mit Ihren Kollegen, bevor Sie es bereitstellen.

Weiterführende Anleitungen und Artikel finden Sie im Hub für bewährte Verfahren von Unity.