Ist es praktisch, ein Testframework wie JUnit in einer Spieleentwicklungssituation zu verwenden? Welche Art von Design-Überlegungen können Sie befolgen, um Ihr Spiel testbarer zu machen? Welche Teile eines Spiels können / sollten getestet werden und welche Teile sollten / müssen menschlichen Tests überlassen werden?
Wenn zum Beispiel die Spieleschleife in einer Funktion verkapselt ist, scheint es schrecklich schwierig zu sein, sie zu testen. Ich möchte eine "Update" -Funktion überarbeiten, die ein Zeitdelta benötigt und die Spiellogik vorantreibt. Dies ermöglicht einige interessante Tricks wie die Fähigkeit, das Spiel zu verlangsamen, indem es mit falschen, langsameren Zeitdeltas gefüttert wird.
architecture
unit-testing
Ricket
quelle
quelle
Antworten:
Einer der Grundsätze von TDD ist, dass Sie TDD in einigen Fällen Ihr Design beeinflussen lassen. Sie schreiben einen Test für das System und schreiben dann den Code, damit dieser Test bestanden wird. Halten Sie die Abhängigkeiten so gering wie möglich.
Für mich gibt es nur zwei Dinge, die ich im Rahmen von Unit-Tests nicht teste:
Erstens teste ich keine visuellen Elemente und wie die Dinge aussehen. Ich teste das und das Objekt wird an der richtigen Stelle sein, nachdem es aktualisiert wurde. Eine Kamera wird ein Objekt außerhalb seiner Grenzen aussortieren, die Transformationen (zumindest die, die außerhalb von Shadern durchgeführt werden) werden ordnungsgemäß durchgeführt, bevor sie an die Grafik-Engine übergeben werden , aber sobald es das Grafiksystem trifft, zeichne ich die Linie. Ich mag es nicht, Dinge wie DirectX zu verhöhnen.
Zweitens teste ich die Hauptspielschleifenfunktion nicht wirklich. Ich teste, dass jedes System funktioniert, wenn ein vernünftiges Delta überschritten wird, und dass die Systeme bei Bedarf ordnungsgemäß zusammenarbeiten. Dann aktualisiere ich einfach jedes System mit dem richtigen Delta in der Spielschleife. Ich könnte tatsächlich einen Test haben, um zu zeigen, dass jedes System mit dem richtigen Delta aufgerufen wurde, aber in vielen Fällen finde ich diesen Overkill (es sei denn, Sie führen eine komplexe Logik aus, um Ihr Delta zu erhalten, dann ist es kein Overkill).
quelle
Noel Llopis hat Unit-Tests in dem Maße behandelt, wie Sie es meines Erachtens suchen:
In Bezug auf das Testen der gesamten Spielschleife gibt es eine andere Technik, um funktionale Regressionen in Ihrem Code zu verhindern. Die Idee ist, Ihr Spiel selbst über ein Wiedergabesystem spielen zu lassen (dh zuerst Spielereingaben aufzuzeichnen und sie dann über einen anderen Lauf wiederzugeben). Während der Wiedergabe generieren Sie für jedes Bild eine Momentaufnahme des Status jedes Objekts. Diese Staatssammlung kann dann als "goldenes Bild" bezeichnet werden. Wenn Sie Ihren Code überarbeiten, führen Sie die Wiedergabe erneut aus und vergleichen den Status jedes Frames mit dem Status des goldenen Bildes. Ist dies nicht der Fall, ist der Test fehlgeschlagen.
Während die Vorteile dieser Technik offensichtlich sind, gibt es ein paar Dinge, mit denen Sie vorsichtig sein müssen:
quelle
Ich stimme den Kommentaren von Jeff und Jpaver zu. Ich wollte auch hinzufügen, dass die Übernahme eines Komponentenmodells für Ihre Architektur die Testbarkeit erheblich verbessert. Bei einem Komponentenmodell sollte jede Komponente eine einzelne Arbeitseinheit ausführen und einzeln (oder mit begrenzten Scheinobjekten) getestet werden können.
Ebenso sollten sich die anderen Teile des Spiels, die auf Entitäten beruhen, nur auf eine Teilmenge der Komponenten stützen, um zu funktionieren. In der Praxis bedeutet dies, dass Sie normalerweise einige gefälschte Komponenten verspotten können, um das Testen dieser Bereiche zu vereinfachen, oder Sie können einfach Teilentitäten zu Testzwecken zusammenstellen. ZB lassen Sie die Rendering- und Eingabekomponenten weg, da diese zum Testen der Physik nicht benötigt werden.
Abschließend möchte ich den Rat bezüglich der Leistung, den Sie von einigen Spielern in Bezug auf Schnittstellen erhalten, ignorieren. Schreiben Sie den Code gut mit Schnittstellen, und wenn Sie später auf Leistungsprobleme stoßen, können Sie das Problem leicht analysieren, identifizieren und umgestalten. Ich war nicht von Noels Bedenken hinsichtlich der Auswirkungen von Schnittstellen auf die Leistung oder des zusätzlichen Komplexitätsaufwands überzeugt.
Das heißt, gehen Sie nicht über Bord und versuchen Sie nicht, jede Kleinigkeit einzeln zu testen. Wie bei den meisten Tests und Designs geht es auch hier darum, die richtige Balance zu finden.
quelle
Ich dachte, ich würde eine zweite Antwort hinzufügen, um auf den Kommentar des OP zu antworten, dass Benutzer Komponententests ersetzen könnten. Ich glaube, das ist völlig falsch, da der Zweck von Komponententests nicht darin besteht, die Qualität zu gewährleisten. Wenn Sie Tests durchführen möchten, um die Qualität Ihres Programms sicherzustellen, sollten Sie wahrscheinlich Szenarientests untersuchen oder in eine hervorragende Überwachung investieren.
(Mit einer hervorragenden Überwachung und einem Produkt, das als Dienstleistung ausgeführt wird, ist es in der Tat möglich, einige "Tests" auf den Kunden zu übertragen. Sie benötigen jedoch ein ausgeklügeltes System, das Fehler schnell erkennt und die dafür verantwortlichen Änderungen rückgängig macht. Dies ist höchstwahrscheinlich zu viel ein kleines Entwicklungsteam.)
Der Hauptvorteil von Unit-Tests besteht darin, dass sie den Entwickler dazu zwingen, besser gestalteten Code zu schreiben. Das Testen fordert den Entwickler auf, Bedenken zu trennen und Daten zu kapseln. Außerdem wird der Entwickler ermutigt, Schnittstellen und andere Abstraktionen zu verwenden, um nur eines zu testen.
quelle