<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    e代劍客——溫柔一刀

    生活就像海洋,只有意志堅強的人,才能到達彼岸

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

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

    讓我們從最簡單的fibonacci(0)=0開始吧,先寫測試如下:

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

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

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

    很顯然順利通過了測試;

    再加一個測試實現(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 ));????????
    ????}
    ????????????
    }
    ???????

    為了順利通過測試,只需簡單的改動下fibonacci方法實現(xiàn)即可;

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

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

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

    這樣我們就可以很容易的添加測試條件: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ù)添加下一個測試條件: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 .說明我們又將快有新進展了.為了滿足fibonacci(3)=2,也很簡單,簡單的修改下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;????
    ????}
    ?

    很明顯,這里的第一個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;????
    ????}
    ???

    第二個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);????
    ????}
    ????
    }
    ???

    再添加測試條件: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ū)動源于測試.

    附:

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

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

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

    評論

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

    聯(lián)系偶 zhupanjava@gmail.com 溫柔一刀
    主站蜘蛛池模板: 亚洲AV成人精品网站在线播放 | 亚洲国产成人久久综合| 91热久久免费精品99| 久久精品国产精品亚洲艾| 日韩精品无码免费专区午夜 | 男人的天堂亚洲一区二区三区 | 国产亚洲欧美在线观看| 两性刺激生活片免费视频| 亚洲无人区视频大全| 国产福利在线免费| 久久夜色精品国产噜噜亚洲a| 18禁超污无遮挡无码免费网站国产 | 中文亚洲AV片不卡在线观看| 国产午夜无码片免费| 亚洲福利视频导航| 噼里啪啦免费观看高清动漫4 | 亚洲国产另类久久久精品黑人 | 亚洲精品V天堂中文字幕| 免费一看一级毛片全播放| 特级做a爰片毛片免费看| 亚洲日本va在线视频观看| 免费无码又爽又刺激高潮视频| 亚洲一级毛片免费看| 永久在线毛片免费观看| 一级毛片免费播放男男| 亚洲AV午夜成人影院老师机影院| 色播精品免费小视频| 男人的天堂av亚洲一区2区| 国产AⅤ无码专区亚洲AV| 在线观看www日本免费网站| 国产亚洲视频在线观看网址| 亚洲人JIZZ日本人| 曰批全过程免费视频在线观看 | 狼色精品人妻在线视频免费| 亚洲精品~无码抽插| 成年女人毛片免费播放视频m| 日韩精品无码免费视频| 亚洲春黄在线观看| 亚洲?V乱码久久精品蜜桃 | 久久国产色AV免费观看| 日韩成人精品日本亚洲|