BlogJava 聯(lián)系 聚合 管理  

          Blog Stats

          隨筆分類(196)

          隨筆檔案(209)

          文章檔案(4)

          相冊

          CRM&ERP

          Google

          SOA


          BlackStone SOA Group

          Driven By Test…

          程啟健(Kelvin)

          前兩天Eric說搞個讀書協(xié)會,那就讓我來寫第一篇吧。第一篇是關(guān)于Test-Driven Development的。

          TDD(Test-Driven Development)顧名思義就是測試驅(qū)動的開發(fā)。以測試驅(qū)動并不是代表以測試人員為中心進行開發(fā),而是把要測試的內(nèi)容作為軟件開發(fā)的目標(biāo)來開發(fā)。測試的Case就是我們要達(dá)到的目標(biāo)。其原則如下:

          • ?絕對沒有未進行過測試的代碼。
          • 沒有進行關(guān)聯(lián)測試的代碼不會進入產(chǎn)品中。
          • 你必須寫測試代碼先。
          • 測試決定了你要寫的代碼。

          TDD和Refactoring成為XP中最重要的實踐。兩者相輔相成,重構(gòu)就是不改變程序內(nèi)在功能的前提下更改代碼的結(jié)構(gòu)。測試才能驗證你的重構(gòu)沒有改變其功能。

          TDD的具體流程是怎樣的呢?為何測試可以在編碼先呢?

          以下是簡單的TDD的Sample(摘自TDD a practical guide by David Astels):

          本Sample假設(shè)你已了解JUnit等測試軟件。

          GOAL:做個電影的平均評分的函數(shù)。給個例子,假如觀眾甲給3分,觀眾乙給5分,平均分為4分。

          1.把目標(biāo)做成測試用例。

          public void testRating() {

          assertEquals("Bad average rating.",4,starWars.getAverageRating());

          }

          Make it Simple。就讓平均評分為4分先吧。

          2.但是總不能都是4分,而且評分的人可是觀眾阿。加個添加評分的函數(shù)。

          public void testRating() {

          starWars.addRating(3);

          starWars.addRating(5);

          assertEquals("Bad average rating.",4,starWars.getAverageRating());

          }

          3.什么電影呢?是星球大戰(zhàn)!

          public void testRating() {

          Movie starWars = new Movie("Star Wars");

          starWars.addRating(3);

          starWars.addRating(5);

          assertEquals("Bad average rating.",4,starWars.getAverageRating());

          }

          4.編譯這些代碼的時候發(fā)現(xiàn)addRating(int)和getAverageRating()沒有定義。趕緊在Movie類中寫這些函數(shù)。

          public void addRating(int newRating) {

          }

          public int getAverageRating() {

          return 0;

          }

          測試失敗?Bad average rating. expected:<4> but was:<0>

          5.應(yīng)該返回4而不是0!那就返回4吧。

          public int getAverageRating() {

          return 4;

          }

          重新編譯,綠條出現(xiàn)。Yeah。下面我們進入重構(gòu)階段了。

          6.評分是由3分+5分的和后除以2才得的。直接返回4不符合要求阿。改。

          public int getAverageRating() {

          return (3 + 5) / 2;

          }

          7.編譯成功。又出綠條。但是算法上應(yīng)該是總分除以個數(shù)才可以阿。繼續(xù)該吧。

          private int totalRating = 0;

          private int numberOfRatings = 0;

          public void addRating(int newRating) {

          totalRating += newRating;

          numberOfRatings++;

          }

          public int getAverageRating() {

          return totalRating / numberOfRatings;

          }

          8.編譯運行。綠色的.yeah.成功。寫多些用例測試下。大家來評評《哥斯拉》這部電影。

          public void testLotsOfRatings()

          {

          Moviegodzilla = new Movie("Godzilla");

          godzilla.addRating(1);

          godzilla.addRating(5);

          godzilla.addRating(1);

          godzilla.addRating(2);

          assertEquals("Bad average rating.",2,godzilla.getAverageRating());

          }

          TDD就是這樣一個編寫測試、編寫代碼、再測試、重構(gòu)、再測試的過程。實現(xiàn)盡量少的功能,不斷地對代碼進行重構(gòu)。利用TDD開發(fā)出來的代碼將會更干凈、更安全、更易于重構(gòu)的。


          posted on 2006-06-28 15:09 BlackStone SOA 閱讀(270) 評論(0)  編輯  收藏 所屬分類: Book Club

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 日照市| 五指山市| 白银市| 荆门市| 瑞昌市| 灵寿县| 类乌齐县| 信丰县| 临漳县| 湘乡市| 兰西县| 五河县| 通海县| 康保县| 明溪县| 梁山县| 祥云县| 梅州市| 那曲县| 威宁| 房山区| 紫云| 贵南县| 乌什县| 扶风县| 饶平县| 南陵县| 青铜峡市| 白水县| 和平县| 诸暨市| 张家口市| 英超| 禹州市| 赞皇县| 平湖市| 裕民县| 盘锦市| 东兰县| 旬邑县| 彭水|