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, cs
und od
sind per-Modul Vorrichtungen und TestCommand
ist ein Mockobjekt.)