Kiedy pracowałem w C ++ (zastrzeżenie: było to około 2005 r.), Użyłem nieco zmodyfikowanej wersji TUT (Framework Unit Test Framework) . Podobało mi się to, ponieważ był tak lekki, że ułatwiał modyfikację i oznaczał, że podczas pisania testów wymagane było niewiele kleju.
Oto jedna bardzo prosta modyfikacja, którą wprowadziłem, dzięki czemu pisanie testów jest jeszcze łatwiejsze / łatwiejsze:
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__)
Inną zmianą, jaką wprowadziłem, był format wyjściowy, tak aby niepowodzenia testów były poprawnie wyświetlane na liście błędów programu Visual Studios (uruchamianej jako część kompilacji), którą można kliknąć, aby przejść do pliku i wiersza nieudanego testu.
(Zdolność do robienia tego rodzaju rzeczy oznacza, że można go dopasować do procesu TDD / CI, a nie zmuszać do dopasowania się do niego.)
Oto przykładowy test (ze stosu poleceń mojego edytora):
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);
}
(Na powyższym kodu cs
i od
odnoszą modułami osprzętu oraz TestCommand
jest atrapa obiektu).