Teststrategie für Spiele

13

Ich habe ein webbasiertes Lernspiel geerbt. Im letzten Jahr habe ich daran gearbeitet, den Code zu stabilisieren und neue Funktionen hinzuzufügen. Der größte Teil der Logik befindet sich im Front-End. So decken Back-End-Unit-Tests, obwohl sie hilfreich sind, einen kleinen Prozentsatz des Codes ab.

Das Spiel ist an einem Punkt angelangt, an dem es langsam komplexer wird. Es gibt zwei verschiedene Modi für jedes Spiel und das Spiel verhält sich je nach Modus unterschiedlich. Es gibt auch verschiedene Flags, die das Spiel beeinflussen.

Ich bin jetzt seit über 10 Jahren ein Anwendungsentwickler und das verwirrt mich. In der Unternehmenswelt funktioniert ein Algorithmus immer auf die gleiche Weise. Ich schreibe einen Unit-Test für einen Algorithmus, erwarte den Wert 42 und es tritt ein Fehler auf, wenn ich diesen Wert nicht erhalte.

Wenn es um Spiele geht, bin ich verloren. Wie teste ich sie? Ich habe Tester zur Verfügung. Ich kann Zeit damit verbringen, Komponententests zu schreiben.

Tester sind ... unzuverlässig. Sie sind nicht die Besten, wenn es darum geht, Probleme auszurotten, und ich habe ihnen nicht die beste Richtung gegeben. Wie soll ich sie als Ressource verwenden, ohne jede Menge Zeit in jedem Veröffentlichungszyklus zu investieren, um jede Permutation und Kombination des Spiels zu testen?

Unit-Tests scheinen begrenzt zu sein. Da der größte Teil der Logik Javascript ist (und ich den Spaghetti-Code geerbt habe), kann ich eine Front-End-Suite wie Cucumber oder Selen verwenden, um sicherzustellen, dass bestimmte Funktionen funktionieren.

Ist das die beste Strategie? Wie testen Spielefirmen Spiele?

Ich habe die Frage " Testgetriebene Entwicklung für komplexe Spiele " (unter anderem auf der Website) gelesen , aber sie geht nicht auf das ein, wonach ich suche. Ich frage nach Strategien, nicht nach konkreten Beispielen für das Testen.

Jeffkolez
quelle
Buch- / Ressourcenempfehlungen außerhalb des Standorts sind pro Hilfezentrum explizit themenunabhängig . Siehe meta.programmers.stackexchange.com/questions/6483/…
gnat
Duplikat der
gnat
Es ist kein Duplikat. Diese Frage lautet: Wie schreibt man Unit-Tests? Ich bitte um Strategie.
Jeffkolez
2
FWIW, wenn es um das Testen der GUI geht, sind es keine Unit-Tests mehr - es sind eher Integrationstests oder Akzeptanztests
slebetman

Antworten:

16

In der Unternehmenswelt funktioniert ein Algorithmus immer auf die gleiche Weise. Ich schreibe einen Unit-Test für einen Algorithmus, erwarte den Wert 42 und es tritt ein Fehler auf, wenn ich diesen Wert nicht erhalte.

Dies ist in Spielen nicht sehr unterschiedlich. Das Vorhandensein von zwei Modi und mehreren Flags in dem Spiel, an dem Sie arbeiten, ändert nichts: Wenn Sie einen bestimmten Modus mit einem bestimmten Satz von Flags verwenden, erhalten Sie beim Testen eines Teils von immer wieder denselben Wert der Quellcode.

Bei zu vielen Modi und Flags kann es aufgrund der Vielzahl möglicher Varianten sehr schnell schwierig werden, das Spiel zu testen. Um das Risiko zu verringern, dass Sie frühzeitig auf diese Schwierigkeit stoßen, sollten Sie:

  • Mock / Stub stark . Halten Sie die getesteten Teile klein und verspotten Sie alles, worauf sie sich verlassen.

    Wenn sie auf Zeit angewiesen sind, verspotten Sie das Zeitobjekt, um unabhängig von der tatsächlichen Zeit immer ein bestimmtes Ergebnis oder eine Reihe bestimmter Ergebnisse zu erhalten.

    Wenn sie sich darauf verlassen random(), verspotten Sie es, um jedes Mal eine Konstante bereitzustellen.

  • Refactor . Wenn Tests zu kompliziert werden oder wenn Sie feststellen, dass eine zu testende Klasse nach der Implementierung von Dependency Injection zwölf Argumente benötigt, während zuvor nur zwei erforderlich waren, müssen Sie den Code umgestalten.

  • Stellen Sie die tatsächlichen Geschäftsregeln der Anwendung in Frage . Ich habe aufgehört, die Anzahl der Projekte zu zählen, die fast unmöglich zu testen waren, weil die funktionalen Anforderungen, die niemand benötigte oder verstand, verschiedene Variationen erforderten - nicht einmal die Interessengruppen.

    Wenn eine kleine E-Commerce-Website zehn Seiten benötigt, um die funktionalen Anforderungen für die Ermittlung der Versandpreise zu erläutern, sollten zunächst keine Tests oder Codes geschrieben werden, sondern die Interessengruppen angesprochen und mit ihnen zusammengearbeitet werden vernünftige Anforderungen.

Schließlich automatisieren Sie jeden Test . Tester werden benötigt, um Situationen zu erkennen, in denen die Anwendung fehlschlägt. Es ist kontraproduktiv und respektlos, Tester immer wieder mit denselben Aktionen auszuführen: Regressionstests sollten von Maschinen und nicht von Personen durchgeführt werden. Die Leute sind dagegen viel besser darin, mögliche Fehler zu finden. "Was ist, wenn ich ..." ist eine der Techniken, die sie anwenden können ("Was ist, wenn ich ein paar Megabyte Binärdaten mit mehreren \ x00 in ein Feld eingebe, das nach meinem Alter fragt, und sehe, was passieren wird?"), Es können jedoch auch formalere Ansätze verwendet werden.

Arseni Mourzenko
quelle
Danke für deine Kommentare. Klingt so, als hätte ich noch viel zu tun!
Jeffkolez