Geri döndüğümde C ++ 'da (feragatname: yaklaşık 2005'ti), biraz değiştirilmiş bir TUT (Template Unit Test Framework) sürümü kullandım . Bunu sevdim çünkü değiştirmeyi kolaylaştıran hafifti ve testler yazarken çok az "tutkal" gerekliydi.
İşte yaptığım çok basit bir değişiklik, bu da testleri yazmayı daha da istekli / temiz hale getiriyor:
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__)
Yaptığım diğer değişiklik çıktı biçiminde yapıldı, böylece test hataları Visual Studio'nun hata listesinde (bir yapının parçası olarak çalıştırıldığında) doğru bir şekilde görünecekti, başarısız testin dosyasına ve satırına gitmek için tıklanabilirdi.
(Yetenek o şey araçlarının bu tür yapmak o daha ziyade onun içine sığacak şekilde zorlamadan daha TDD / CI sürecine uyum yapılabilir.)
İşte bir örnek test (editörümden komut yığınından):
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);
}
(Yukarıdaki kodda cs
ve od
modül başına fikstür ve TestCommand
sahte bir nesnedir.)