天天看點

測試驅動開發(tdd) 學習筆記(1)基本思想原則和術語

    這幾天學習了一下測試驅動開發(tdd) 實用指南,感覺相見恨晚,收獲很大。以前也聽别人說過測試驅動開發,也用過dunit,但是當時不知道具體的含義,也沒有仔細研究一下,真是遺憾。

   Test-Driven Development  A Practical Guide 測試驅動開發,實用指南,作者David Astels

        測試驅動開發的主要思想是 測試先行,在寫一個類的具體實作之前,先寫類的測試代碼,類的測試代碼通過調用各種public 的方法,對類進行測試。在寫測試代碼的過程中,思考類的調用方法,也就是類的外在表現形式。

      我覺得這種做法的很大一個好處是:因為設計一個類是從它的外部形态開始的,是以設計類的時候就會自然的考慮類的封裝。

        測試驅動開發采用的主要方法之一是重構(refactoring)。重構兩個字的字面意思,并不能涵括它的具體涵義,在tdd中重構具體指什麼,下面通過一個簡單的例子來說明:

        我們想編寫一個math 類,來實作簡單的加(sum)、減(minus)運算,首先我們編寫math 類的初步測試方法。

public class testMath extends TestCase{

     public void testSum(){

          math math1 = new math ;

          assertEquals("3加2應該等于5",5,math1.sum(3,2));

     }

然後我們編寫具體的math 類

public class math {

     public int sum(int a,int b){

          return 5;

     }

}

運作測試,測試通過。但是很明顯,sum方法的算法是不對的,這是因為測試不夠全面。我們重新修改測試

public class testMath extends TestCase{

     public void testSum(){

          math math1 = new math ;

          assertEquals("3加2應該等于5",5,math1.sum(3,2));

          assertEquals("0加0應該等于0",0,math1.sum(0,0));

          assertEquals("1加1應該等于2",2,math1.sum(1,1));

     }

然後我們對math類的sum方法進行重構

public int sum(int a,int b){

          return a+b;

}

        以上是一個簡單的例子,如果是在實際的開發中的話,至少還要加上對臨界值的測試,比如兩個最大的int值相加等。在上面的例子中,重構是為了讓測試通過,或者說是為了保證代碼功能上的正确性;有了這些test 作保證,我們還能為了提高代碼的品質而重構。

          我個人的了解,測試驅動開發的一個原則就是,編寫可以信任的測試,隻要測試全部通過,那麼說明類的方法全部正确,如果你對代碼沒有信心,那說明測試代碼的測試覆寫面不夠,需要進一步完善。

         關于重構的方法,書上歸納的有 extract class ,extract interface,extract method,replace type code with subclasses,replace conditional with polymorphism,form template method,introduce Explaining variable,replace constructor with factory method,replace inheritance with delegation,replace magic number with symbolic constant ,replace nested conditional with guard clauses,,refaction to patterns. 這些方法有很多的目的是提高代碼品質。