Quando lavoravo in C ++ (dichiarazione di non responsabilità: era circa il 2005), utilizzavo una versione leggermente modificata di TUT (Template Unit Test Framework) . Mi è piaciuto perché era così leggero, il che ha reso facile la modifica, e significava che era richiesta pochissima "colla" durante la scrittura dei test.
Ecco una modifica molto semplice che ho fatto, che rende ancora più desideroso / pulito scrivere test:
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__)
L'altra modifica che ho apportato è stata il suo formato di output, in modo che gli errori di test apparissero correttamente nell'elenco degli errori di Visual Studios (quando eseguito come parte di una build), cliccabile per andare al file e alla riga del test fallito.
(La capacità di fare questo genere di mezzi cosa che si può essere fatto per adattarsi al vostro processo di TDD / CI, piuttosto che costringere a inserire nella sua.)
Ecco un esempio di test (dallo stack dei comandi dal mio editor):
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);
}
(Nel codice sopra, cs
e od
sono dispositivi per modulo, ed TestCommand
è un oggetto finto.)