e代劍客——溫柔一刀

          生活就像海洋,只有意志堅(jiān)強(qiáng)的人,才能到達(dá)彼岸

             :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            76 隨筆 :: 7 文章 :: 215 評(píng)論 :: 0 Trackbacks

          這兩天翻了下 Kent? Beck 的 Test-Driven Development By Example 感覺(jué)還不錯(cuò),第一部分的例子講的挺好,本來(lái)想歸納一下,貌似太長(zhǎng)了,等有時(shí)間了再歸納下,最后看到了附錄里面的一個(gè)Fibonacci數(shù)列的例子感覺(jué)也有那么點(diǎn)TDD的味道在里面,總結(jié)分享一下:

          讓我們從最簡(jiǎn)單的fibonacci(0)=0開(kāi)始吧,先寫測(cè)試如下:

          import ?junit.framework.TestCase;????????
          ???????
          public ? class ?TestFibonacci? extends ?TestCase? {????????
          ????
          public ? void ?testFibonacci() {????????
          ????????assertEquals(
          0 ,fibonacci( 0 ));????????
          ????}
          ????????????
          }
          ?????

          添加fibonacci方法的簡(jiǎn)單實(shí)現(xiàn)即可:

          private ? int ?fibonacci( int ?i)? {??????????????
          ????????
          return ? 0 ;????????
          ????}
          ??

          很顯然順利通過(guò)了測(cè)試;

          再加一個(gè)測(cè)試實(shí)現(xiàn)fibonacci(1)=1;如下:

          import ?junit.framework.TestCase;????????
          ???????
          public ? class ?TestFibonacci? extends ?TestCase? {????????
          ????
          public ? void ?testFibonacci() {????????
          ????????assertEquals(
          0 ,fibonacci( 0 ));????????
          ????????assertEquals(
          1 ,fibonacci( 1 ));????????
          ????}
          ????????????
          }
          ???????

          為了順利通過(guò)測(cè)試,只需簡(jiǎn)單的改動(dòng)下fibonacci方法實(shí)現(xiàn)即可;

          private ? int ?fibonacci( int ?i)? {??????????????
          ????????
          if (i == 0 )? return ? 0 ;????????
          ????????
          else ? return ? 1 ;????????
          ????}
          ???

          在添加第三個(gè)測(cè)試條件fibonacci(2)=1時(shí)候發(fā)現(xiàn),隨著測(cè)試條件的增多無(wú)疑帶來(lái)了大量的斷言重復(fù)代碼,通過(guò)分析我們可以將testFibonacci方法改寫如下:

          public ? void ?testFibonacci() {????
          ????????
          int ?cases[][] = { { 0 , 0 } , { 1 , 1 } } ;????
          ????????
          for ( int ?i = 0 ;i?
          ????????????assertEquals(cases[i][
          1 ],fibonacci(cases[i][ 0 ]));???????
          ????}
          ???

          這樣我們就可以很容易的添加測(cè)試條件:fibonacci(2)=1;

          import ?junit.framework.TestCase;????
          ???
          public ? class ?TestFibonacci? extends ?TestCase? {????
          ????
          public ? void ?testFibonacci() {????
          ????????
          int ?cases[][] = { { 0 , 0 } , { 1 , 1 } , { 2 , 1 } } ;????
          ????????
          for ( int ?i = 0 ;i?
          ????????????assertEquals(cases[i][
          1 ],fibonacci(cases[i][ 0 ]));???????
          ????}
          ????
          ???
          ????
          private ? int ?fibonacci( int ?i)? {??????????
          ????????
          if (i == 0 )? return ? 0 ;????
          ????????
          else ? return ? 1 ;????
          ????}
          ????
          }
          ???

          嘿嘿,很順利,狀態(tài)條依然出現(xiàn)的是綠色,那我們就不管代碼到底合不合理了,出現(xiàn)綠色就是王道,繼續(xù)添加下一個(gè)測(cè)試條件:fibonacci(3)=2;

          import ?junit.framework.TestCase;????
          ???
          public ? class ?TestFibonacci? extends ?TestCase? {????
          ????
          public ? void ?testFibonacci() {????
          ????????
          int ?cases[][] = { { 0 , 0 } , { 1 , 1 } , { 2 , 1 } , { 3 , 2 } } ;????
          ????????
          for ( int ?i = 0 ;i?
          ????????????assertEquals(cases[i][
          1 ],fibonacci(cases[i][ 0 ]));???????
          ????}
          ????
          ???
          ????
          private ? int ?fibonacci( int ?i)? {??????????
          ????????
          if (i == 0 )? return ? 0 ;????
          ????????
          else ? return ? 1 ;????
          ????}
          ????
          }
          ???

          終于又出現(xiàn)紅色了,it fails .說(shuō)明我們又將快有新進(jìn)展了.為了滿足fibonacci(3)=2,也很簡(jiǎn)單,簡(jiǎn)單的修改下fibonacci方法即可,如下:
          private?int?fibonacci(int?i)?{??????????
          ????????
          if(i==0)?return?0;????
          ????????
          if(i<=2)?return?1;????
          ????????
          else?return?2;????
          ????}
          ??

          又出現(xiàn)綠色了吧! 這里返回的2可以表示為1+1;

          我們可以寫成:

          private?int?fibonacci(int?i)?{??????????
          ????????
          if(i==0)?return?0;????
          ????????
          if(i<=2)?return?1;????
          ????????
          else?return?1+1;????
          ????}
          ?

          很明顯,這里的第一個(gè)1可以寫成fibonacci(i-1):
          private?int?fibonacci(int?i)?{??????????
          ????????
          if(i==0)?return?0;????
          ????????
          if(i<=2)?return?1;????
          ????????
          else?return?fibonacci(i-1)+1;????
          ????}
          ???

          第二個(gè)1可以寫成fibonacci(i-2):
          private?int?fibonacci(int?i)?{??????????
          ????????
          if(i==0)?return?0;????
          ????????
          if(i<=2)?return?1;????
          ????????
          else?return?fibonacci(i-1)+fibonacci(i-2);????
          ????}
          ???
          最終的程序:
          import?junit.framework.TestCase;????
          ???
          public?class?TestFibonacci?extends?TestCase?{????
          ????
          public?void?testFibonacci(){????
          ????????
          int?cases[][]={{0,0},{1,1},{2,1},{3,2}};????
          ????????
          for(int?i=0;i?
          ????????????assertEquals(cases[i][
          1],fibonacci(cases[i][0]));???????
          ????}
          ????
          ???
          ????
          private?int?fibonacci(int?i)?{??????????
          ????????
          if(i==0)?return?0;????
          ????????
          if(i==1)?return?1;????
          ????????
          else?return?fibonacci(i-1)+fibonacci(i-2);????
          ????}
          ????
          }
          ???

          再添加測(cè)試條件:fibonacci(4)=3;fibonacci(5)=5:

          import?junit.framework.TestCase;????
          ???
          public?class?TestFibonacci?extends?TestCase?{????
          ????
          public?void?testFibonacci(){????
          ????????
          int?cases[][]={{0,0},{1,1},{2,1},{3,2},{4,3},{5,5}};????
          ????????
          for(int?i=0;i?
          ????????????assertEquals(cases[i][
          1],fibonacci(cases[i][0]));???????
          ????}
          ????
          ???
          ????
          private?int?fibonacci(int?i)?{??????????
          ????????
          if(i==0)?return?0;????
          ????????
          if(i==1)?return?1;????
          ????????
          else?return?fibonacci(i-1)+fibonacci(i-2);????
          ????}
          ????
          }
          ?

          依然是綠色,呵呵,我們得到了正確的Fibonacci數(shù)列,驅(qū)動(dòng)源于測(cè)試.

          附:

          Fibonacci數(shù)列簡(jiǎn)介:Fibonacci數(shù)列從第0項(xiàng)開(kāi)始依次為0,1,1,2,3,5,8……的數(shù)列,它存在如下特點(diǎn):第0,1個(gè)數(shù)為0,1。從第2個(gè)數(shù)開(kāi)始,該數(shù)是前面兩個(gè)數(shù)之和。即該數(shù)列第n項(xiàng)的值滿足如下公式:

          http://www.aygfsteel.com/images/blogjava_net/ctguzhupan/14050/o_fib.gif

          posted on 2006-12-14 22:02 溫柔一刀 閱讀(1395) 評(píng)論(1)  編輯  收藏 所屬分類: Agile

          評(píng)論

          # re: (TDD)測(cè)試驅(qū)動(dòng)開(kāi)發(fā)小例------Fibonacci數(shù)列 2006-12-16 12:02 溫柔一刀
          最近對(duì)TDD產(chǎn)生了興趣  回復(fù)  更多評(píng)論
            

          聯(lián)系偶 zhupanjava@gmail.com 溫柔一刀
          主站蜘蛛池模板: 南汇区| 木兰县| 玉林市| 赤壁市| 射阳县| 玉环县| 萝北县| 北辰区| 息烽县| 潼南县| 宾阳县| 万安县| 天镇县| 南岸区| 翁源县| 桐乡市| 美姑县| 徐汇区| 台山市| 桓仁| 沂源县| 榆中县| 桦南县| 象州县| 思茅市| 沭阳县| 海盐县| 湖南省| 冷水江市| 武隆县| 德江县| 达孜县| 璧山县| 仁化县| 新郑市| 安远县| 迁安市| 南岸区| 汤阴县| 扬州市| 鹤庆县|