假如要編寫一個CMath類,其中有一個方法abs(),原形以下:編程
class CMath
{
public:
int abs(int a);
};框架
通常的編程習慣是直接寫代碼,而後調試,至於測試,則之後再說。TDD要求,在未編寫測試代碼前不能寫任何產品代碼。
這裏使用的測試框架是CppUnit,用例代碼使用本系列的一和二介紹的格式,爲了減小篇幅,只列出關鍵代碼,CppUnit的使用及輔助代碼的編寫方法請參閱本系列的一和二。ide
首先編寫恰好會致使錯誤(包括編譯錯誤)的測試代碼,定義一個測試類:函數
class TestMath : public CppUnit::TestCase
{
public:
void testabs();
private:
CMath* pObj;
};性能
因爲類CMath不存在,產生編譯錯誤。編寫CMath類定義,使編譯經過:測試
class CMath
{
};spa
編寫函數abs()的測試函數,只創建一個用例:調試
void TestMath::testabs()
{
//第一個用例
CASE_BEGIN("");
int arg = 1;
int result = pObj->abs(arg);
CPPUNIT_ASSERT_EQUAL(result,1);
CASE_END();
}產品
因爲CMath::abs()不存在,產生編譯錯誤。編寫CMath::abs(),這時能夠先寫一個空函數,有返回值的隨便寫一個返回值,使編譯經過就好了:it
int CMath::abs(int arg)
{
return 0;
}
執行測試,固然測試是失敗的。編寫函數代碼,使測試經過:
int CMath::abs(int arg)
{
if(arg >= 0 )
return arg;
return 0;
}
測試經過,爲測試函數增長一個用例:
void TestMath::testabs()
{
//第一個用例
CASE_BEGIN("");
int arg = 1;
int result = pObj->abs(arg);
CPPUNIT_ASSERT_EQUAL(result,1);
CASE_END();
//第二個用例
CASE_BEGIN("");
int arg = -1;
int result = pObj->abs(arg);
CPPUNIT_ASSERT_EQUAL(result,1);
CASE_END();
}
測試失敗,繼續編寫CMath::abs()的代碼:
int CMath::abs(int arg)
{
if(arg >= 0 )
return arg;
return arg;
}
測試經過。再增長一個用例,參數爲0,測試也能夠經過,沒必要修改產品代碼。當全部的功能點都已經編寫了測試代碼,並測試成功後,表示代碼的功能已經完整實現,這時應該閱讀和完善代碼,例如,改進代碼結構、修改不合適的變量名、增長必要的註釋、改進性能低下的計算過程、刪除多餘的代碼行,完成重構後,再次執行測試。