TDD與VTDD系列(四):簡單實例演示TDD過程

    假如要編寫一個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,測試也能夠經過,沒必要修改產品代碼。當全部的功能點都已經編寫了測試代碼,並測試成功後,表示代碼的功能已經完整實現,這時應該閱讀和完善代碼,例如,改進代碼結構、修改不合適的變量名、增長必要的註釋、改進性能低下的計算過程、刪除多餘的代碼行,完成重構後,再次執行測試。

相關文章
相關標籤/搜索