Quando eu trabalhava em C ++ (aviso de isenção de responsabilidade: isso era por volta de 2005), usei uma versão ligeiramente modificada do TUT (Template Unit Test Framework) . Gostei porque era muito leve, o que facilitou a modificação e significava que havia muito pouca "cola" necessária ao escrever testes.
Aqui está uma modificação muito simples que eu fiz, que torna ainda mais ávido / limpo escrever testes:
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__)
A outra alteração que fiz foi no formato de saída, para que as falhas de teste fossem exibidas corretamente na lista de erros do Visual Studios (quando executadas como parte de uma compilação), clicáveis para ir para o arquivo e a linha do teste que falhou.
(A capacidade de fazer esse tipo de coisa significa que ela pode ser ajustada ao seu processo TDD / CI, em vez de forçá-lo a se encaixar nele .)
Aqui está um exemplo de teste (da pilha de comandos do meu 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);
}
(No código acima, cs
e od
são por módulo de acessórios, e TestCommand
é um objecto simulado).