Ще коли я працював на C ++ (відмова від відповідальності: це було близько 2005 року), я використав трохи змінену версію TUT (Template Unit Test Framework) . Мені це сподобалось, оскільки він був таким легким, що дозволяв легко змінювати, і означав, що для написання тестів потрібно дуже небагато «клею».
Ось одна дуже проста модифікація, яку я зробив, що робить ще легше / чистіше писати тести:
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__)
Інша зміна, яку я внесла, полягала в його вихідному форматі, щоб помилки тесту відображалися правильно у списку помилок Visual Studios (при запуску у складі збірки), на який можна натиснути, щоб перейти до файлу та рядка невдалого тесту.
(Можливість робити подібну річ означає, що її можна зробити так, щоб вона вписувалася у ваш процес TDD / CI, а не змушувала вас прилаштовуватися до неї.)
Ось приклад тесту (з командного стека мого редактора):
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);
}
(У наведеному вище коді cs
і od
є модульні світильники, і TestCommand
це макетний об'єкт.)