Когда я работал в 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
является фиктивным объектом.)