กลับมาเมื่อผมได้ทำงานใน C ++ (คำเตือน: นี่คือประมาณ 2005) ผมใช้แก้ไขเล็กน้อยรุ่นของTUT (แม่แบบทดสอบหน่วยกรอบ) ฉันชอบมันเพราะมันมีน้ำหนักเบามากซึ่งทำให้ง่ายต่อการปรับเปลี่ยนและหมายความว่าต้องใช้ "กาว" น้อยมากเมื่อเขียนข้อสอบ
นี่คือการดัดแปลงแบบง่าย ๆ อย่างหนึ่งที่ฉันทำซึ่งทำให้ผู้เขียน / ผู้ทำความสะอาดสามารถเขียนแบบทดสอบได้:
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 ของคุณแทนที่จะบังคับให้คุณเพื่อให้พอดีกับมัน.)
นี่คือตัวอย่างทดสอบ (จาก command-stack จากโปรแกรมแก้ไขของฉัน):
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
เป็นวัตถุจำลอง)