À l'époque où je travaillais en C ++ (avertissement: c'était vers 2005), j'ai utilisé une version légèrement modifiée de TUT (Template Unit Test Framework) . Je l'ai aimé parce qu'il était si léger, ce qui le rendait facile à modifier et signifiait qu'il y avait très peu de «colle» requise lors de l'écriture des tests.
Voici une modification très simple que j'ai apportée, qui rend encore plus facile / plus simple d'écrire des tests:
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__)
L'autre modification que j'ai apportée concerne son format de sortie, de sorte que les échecs de test apparaissent correctement dans la liste d'erreurs de Visual Studios (lorsqu'ils sont exécutés dans le cadre d'une build), cliquable pour accéder au fichier et à la ligne du test ayant échoué.
(La possibilité de faire ce genre de chose signifie qu'elle peut être faite pour s'intégrer dans votre processus TDD / CI, plutôt que de vous forcer à vous y intégrer.)
Voici un exemple de test (de la pile de commandes de mon éditeur):
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);
}
(Dans le code ci-dessus, cs
et od
sont des luminaires par module, et TestCommand
est un objet factice.)