Cuando trabajaba en C ++ (descargo de responsabilidad: esto fue alrededor de 2005), usé una versión ligeramente modificada de TUT (Template Unit Test Framework) . Me gustó porque era muy liviano, lo que facilitaba la modificación y significaba que se requería muy poco "pegamento" al escribir pruebas.
Aquí hay una modificación muy simple que hice, que hace que sea aún más fácil / limpio escribir pruebas:
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__)
El otro cambio que hice fue a su formato de salida, para que las fallas de prueba aparecieran correctamente en la lista de errores de Visual Studios (cuando se ejecuta como parte de una compilación), haga clic para ir al archivo y la línea de la prueba fallida.
(La capacidad de hacer este tipo de cosas significa que se puede hacer que se ajuste a su proceso TDD / CI, en lugar de obligarlo a adaptarse a él).
Aquí hay un ejemplo de prueba (de la pila de comandos de mi 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);
}
(En el código anterior, cs
y od
son accesorios por módulo, y TestCommand
es un objeto simulado).