Welches Unit Test Framework für C ++ basierte Spiele? [geschlossen]

13

Welche Kombination von Testwerkzeugen halten Sie für die beste? In Anbetracht des Frameworks / der Bibliothek Ihrer Wahl könnten Sie Folgendes in Betracht ziehen:


Hinweis: Während dies möglicherweise eine allgemeine Frage wie die zu SO ist, würde ich argumentieren, dass die Spieleentwicklung normalerweise an einen bestimmten Arbeitsablauf gebunden ist, der die Auswahl für das Testen beeinflusst. Für eine übergeordnete Perspektive siehe Frage Automatisiertes Testen von Spielen .

jmp97
quelle
Obwohl ich mit dieser Frage nichts direkt falsches sehe, denke ich, dass es von Vorteil wäre, ein Community-Wiki zu erstellen. Zum Beispiel: gamedev.stackexchange.com/questions/480/…
Jesse Dorsey
Ich habe es geschafft, CW. Ich denke jedoch, dass die Richtlinien, wann CW eine Frage stellen soll, mir als Neuling etwas unklar erscheinen, zumal dies allgemein diskutiert wird ( meta.stackexchange.com/questions/55888 ). Vielleicht könnten wir die diesbezügliche gamedev-Richtlinie explizit in den FAQ angeben?
jmp97

Antworten:

7

Ich fand UnitTest ++ sehr einfach zu handhaben . Ich werde es noch mit amop versuchen müssen , was als guter Begleiter von UnitTest ++ für die Scheinobjektfunktionalität erwähnt wurde. Ansonsten ist Google Mock eine beliebte Wahl. Vielleicht möchten Sie sich auch über UnitTest ++ und Mock Objects informieren .

UnitTest ++ kann mit Ihrem Continuous Integration-Ansatz eingerichtet werden, z. B. mit Hudson

Vielleicht möchten Sie diesen inspirierenden Beitrag lesen , wenn Sie nicht überzeugt sind, dass Unit-Tests und Spiele gut zusammenpassen.

jmp97
quelle
UnitTest ++ ist das einzige Testframework, das Sie benötigen sollten, insbesondere, da es leicht zu ändern und zu erweitern ist. Wenn Sie später eine Java-Programmierung ausführen, schlägt JUnit Ihnen mit einem Hammer mit der äußersten Unschärfe, die er anzeigt, immer wieder ins Gesicht.
Dash-Tom-Bang
Für UnitTest ++ gehen Sie zu github.com/unittest-cpp/unittest-cpp. Alles andere ist veraltet.
Markus
4

Eine weitere Abstimmung für UnitTest ++ . Sehr einfach zu integrieren, für unsere Ziel-Embedded-Plattform kompiliert, sehr einfach, unkompliziert und benutzerfreundlich. Wir haben es auch in Hudson integriert. Wir haben uns GoogleTest angesehen, es jedoch abgelehnt (ich glaube, es gab Probleme beim Kompilieren für unsere Zielplattform), aber es verfügt über einen ähnlichen Funktionsumfang und ist möglicherweise für Sie geeignet.

Außerdem möchten Sie vielleicht einen Einblick in eine Art Rahmen für Rauchprüfungen erhalten. Nach meiner Erfahrung ist es schwierig, eine ausreichende Testabdeckung für ein Spiel mit Einzeltests zu erhalten. Besonders, wenn Sie Unit-Tests in eine vorhandene Codebasis einführen, und sogar für ein großes Team. Das Testen von Rauch bedeutet, hochrangige Dinge wie "Stellen Sie sicher, dass alle Ebenen geladen sind" zu testen. Meine Theorie ist, dass wenn ich beide Arten von Tests habe, sie sich irgendwann in der Mitte treffen und einen anständigen Durchschnitt ergeben könnten. :)

Chris Howe
quelle
2

Als ich in C ++ arbeitete (Haftungsausschluss: das war ungefähr 2005), verwendete ich eine leicht modifizierte Version von TUT (Template Unit Test Framework) . Ich mochte es, weil es so leicht war, dass es leicht zu modifizieren war, und das bedeutete, dass beim Schreiben von Tests nur sehr wenig "Klebstoff" erforderlich war.

Hier ist eine sehr einfache Modifikation, die es noch einfacher macht, Tests zu schreiben:

static int BogusFunction() { return __COUNTER__; } // Increment the __COUNTER__ to the correct position for the begining of the tests
#define TEST template<> template<> void object::test<__COUNTER__>()
#define ENSURE(msg, cond) ensure(msg, cond, __FILE__, __LINE__)
#define ENSURE_EQUALS(msg, actual, expected) ensure_equals(msg, actual, expected, __FILE__, __LINE__)
#define ENSURE_DISTANCE(msg, actual, expected, distance) ensure_distance(msg, actual, expected, distance, __FILE__, __LINE__)
#define FAIL(msg) fail(msg, __FILE__, __LINE__)

Die andere Änderung, die ich vorgenommen habe, betraf das Ausgabeformat, sodass Testfehler in der Fehlerliste von Visual Studios korrekt angezeigt wurden (wenn sie als Teil eines Builds ausgeführt wurden). Klicken Sie darauf, um zur Datei und Zeile des fehlgeschlagenen Tests zu wechseln.

(Die Fähigkeit, solche Dinge zu tun, bedeutet, dass sie in Ihren TDD / CI-Prozess passen, anstatt Sie dazu zu zwingen, in seinen zu passen.)

Hier ist ein Beispieltest (aus dem Befehlsstapel meines Editors):

TEST // Undoing a command
{
    cs.AddCommand(new TestCommand);
    cs.AddCommand(new TestCommand(od));

    ENSURE("Undo success", cs.Undo());
    ENSURE_EQUALS("Stack size", cs.size(), 2);
    ENSURE_EQUALS("Command's Undo() was called", od.undo, 1);
    ENSURE_EQUALS("Command's Redo() not called", od.redo, 0);

    ACommandStack::const_iterator it = cs.end();
    ENSURE("Command is redoable", cs.GetUndoPos() == --it);
}

(In dem obigen Code, csund odsind per-Modul Vorrichtungen und TestCommandist ein Mockobjekt.)

Andrew Russell
quelle
2

Wenn es um C ++ geht, habe ich das googletest-Framework http://code.google.com/p/googletest/ ausprobiert und verwendet . Es ist einfach einzurichten, einfach zu bedienen und funktioniert hervorragend.

Simon
quelle
2

Ich bin kein professioneller Spieleentwickler, aber ein professioneller Embedded-Entwickler. Vielleicht nicht gerade wie Spiele, aber in der Nähe. An meinem Arbeitsplatz haben wir ein paar benutzt.

Ich mag Google Test wirklich . Es verfügt über die besten Funktionen der jüngsten Unit-Test-Frameworks und bietet gleichzeitig eine minimale, übersichtliche Benutzeroberfläche.

Als nächstes steht Boost Test auf meiner Liste . Die API von Google Test ist etwas moderner als Boost.Test, aber Boost Test hat erstaunliche Arbeit geleistet, indem er neue Funktionen hinzugefügt und das schäbige CppUnit-Paradigma über Bord geworfen hat.

Ich habe auch CxxTest verwendet . Es ist ziemlich gut gemacht, aber man merkt, dass es nicht so modern ist wie Boost.Test oder Google Test. Insbesondere die Unterstützung für Testsuiten und Fixtures ist etwas umständlich.

Ich verwende gerne die erweiterten Funktionen, aber wenn Sie ein Minimalist sind, werden Sie nie den Unterschied zwischen den drei sehen. Die meisten meiner Kollegen würden sich über ein Unit-Test-Framework freuen, das den automatischen Registrierungstest (deklarativ) unterstützt und eine Art CHECK_EQUALS (a, b) -Makro enthält.

deft_code
quelle
1

Meine bevorzugte Testbibliothek ist QuickCheck http://en.wikipedia.org/wiki/QuickCheck . Es gibt eine experimentelle C ++ - Version, aber sie sieht zu schwer aus, aber auch ohne eine dedizierte Bibliothek sind die Prinzipien einfach zu verwenden.

Alle meine Klassen haben eine genArbitrary-Methode, die eine zufällige Instanz generieren kann. Ich benutze dies, um umkehrbare Prozesse wie Be- und Entladen zu testen. Ich kann Tausende zufälliger Szenen erzeugen und prüfen, ob verschiedene Eigenschaften zutreffen (z. B., dass die von mir serialisierte Szene mit der von mir deserialisierten Szene identisch ist).

Es ersetzt keine herkömmlichen Komponententests (es reduziert die Notwendigkeit für viele potenzielle Komponententests), ist jedoch eine großartige Möglichkeit, Fehler zu entdecken, und hilft dabei, meine Speicherzuweisungsstrategie (zusammen mit Valgrind) zu testen. Es ist großartig zu sehen, wie über eine Million Zuteilungen aus Valgrind reingekommen sind :).

Ich habe CxxTest als Testgurt benutzt, was mir sehr gut gefallen hat. Jetzt sind alle meine Tests separate Exes. Ich habe nur einen Ordner namens Test, und jede Datei, die mit Test_ beginnt, wird zu einem Test. Bisher ist es ein wirklich einfaches Leichtgewicht, Tests durchzuführen.

Jonathan Fischoff
quelle
0

Mit Java gibt es so viele gute Bibliotheken ... Nicht so mit C ++.

Für C ++ - Benutzer gibt es ein Kettenwerkzeug von Kitware, das sehr interessant ist:

  • CMake: Werkzeug machen
  • CDash: kontinuierliches Integrationstool

Kitware schreibt C ++ - Codes für die Informatik.

Für persönliche Projekte verwende ich die Boost Unit Test Library (auf der Desktop-Plattform). Für die kontinuierliche Integration verwende ich Hudson:

  • einfache Installation auf Tomcat
  • skriptfähig
Ellis
quelle
0

Ich werde das TUT-Framework (Template Unit Test) unterstützen . Es ist superleicht und extrem flexibel, ganz zu schweigen von der einfachen Einrichtung und sofortigen Verwendung (ein einzelnes Header-Include, ein bisschen Haupt- / Setup-Code und 24 Zeilen Testcode später haben Sie einen Unit-Test). Ich habe es mit binfmtc (C ++ - Programme als Skripte ausführen) kombiniert, um Rapid Prototyping / TDD / Lernvorlagen erfolgreich durchzuführen , einschließlich der Entwicklung eingebetteter Software. Da es in der Lage ist, in XML auszugeben, passte es auch gut zu Jenkins (CI) und Sonar bei aufeinanderfolgenden Projekten von mir.

Nathan Paul Simons
quelle