這才叫 TDD!VS2010實際演練TDD流程

  • 33385
  • 0

這才叫 TDD!VS2010實際演練TDD流程

Test Driven Development 測試導向開發,這個在 Agile 方法論裡用得很多的技術,許多老師在台上講得頭頭是道,可是遇到下面問題就破功了,頓時臉上出現三條線:

同學:被測試標的程式都沒寫好怎麼樣可以先寫測試程式呢?VS 裡會產生一堆語法錯誤。

老師:你可以先寫大概的程式,然後再寫測試,最後再回頭寫完程式。

同學:可是老師你不是說 TDD 要先寫測試嗎?

說真的,沒看過老師可以在台上能夠做得出來很順的流程:先寫測試,再寫程式;大多數(包括我在內)是講講,然後用剪貼的。

今天我看到了 InfoWorld preview 報導 TDD 功能以後才實際去試了一下 VS2010,真的!這才叫 TDD!

第一步:建立兩個專案 TddCodeProject, TddTestProject

用看圖說故事的方式比較快,這裡建立了兩個專案:

  • TddCodeProject 是 Class Library Projet,這是我們要測試的標的
  • TddTestProject 是 Test Project,這是測試專案

tdd1

最後打開 UnitTest1.cs 的時候把所有程式清除掉,證明我沒有做弊,有時候在 VS 裡面產生一大堆程式反而讓人不知所措,清空了從頭開始觀念會比較清楚。

第二步:建立 Test Case 跟 Test Method

Test Case 是一個 Class,Test Method 是 Class 裡面的 Method,如果你不知道的話打 test 四個字,Code Editor 自動提供了兩個 Code snippet:

tdd2

按 testc+Tab –> 建立 Test Case

進入 test case 的主體內再按  testm+Tab –> 建立 Test Method

第三步:測試客戶物件

tdd3

圖中你可以發現我把 Test Case 的名稱改成 CustomerTest,Test Method名稱改為 CreateNewCustomerTest。

然後我直接打程式,問題來了,Customer 這個類別我還沒寫呢,怎麼辦?

第四步:自動產生客戶類別

眼尖的你可能已經發現 Customer 字下面的紅色波浪線了吧?把游標移到 Customer 中間然後按下 Ctrl+.

tdd4

這時你會看到 Smart Tag 的功能表,如果你要直接在測試程式裡產生你的類別可以選第一項,不過我希望大家養成好習慣把程式跟測試分開,所以選第二項。

tdd5

在跳出視窗裡選 TddCodeProject,新的類別程式碼 Customer.cs 就會被加到那個專案裡去了。

第五步:用 Smart Tag 修復引用列

這是 VS2010 裡我最喜歡的功能之一,以前寫程式寫到一半有引用新的類別的時候都要找半天,第一不曉得要加那個一個 using,第二從正在寫的程式跳到最前頭再跳回來常常會迷路。現在用 Ctrl+. 就可以修復了。

tdd6

第六步:利用新建構元語法來完成客戶類別

我試到這裡發現如果用新的語法來寫建立新客戶物件的話,按三下Ctrl+. 就輕輕鬆鬆的產生了 Name(客戶名稱), IsMember (是否為會員), Level (會員等級) 這三個 properties,而且連測試程式也寫好了。

image

第七步:加新功能

接著我要加入新的功能,當客戶加入會員時會呼叫 JoinMember() 方法,加入會員後 IsMember 應該會傳回 true。

同樣的你只要先考慮如何測試就好了!

tdd7

沒寫的程式用 Ctrl+. 去產生,這樣流程才會順。

第八步:跑測試

Ctrl+R,T 來執行所有的測試程式,你有沒有發現我都用鍵盤的指令?各位,在寫程式的時候請花點時間記住這些按鍵,因為不止寫起來會很順,也省去很多在功能表上找東西的時間。

tdd8

執行的結果,你會看到失敗了,當然!因為程式還沒開始寫啊!

第九步:修改程式,再跑測試

這時你只要在失敗的測試上按兩下就可以直接跳到程式碼的地方直接修改程式,在 JoinMember() 裡,要加入程式,實際的情況可能要更新資料庫裡的記錄等等,我們在此示範用所以加上 this.IsMember = true; 就好了。

再按 Ctrl+R,T 來執行所有的測試程式一次:

tdd9

 

 

 

 

 

 

 

 

 

哈哈,大功告成了!

TDD來了,下一步呢?

在測試過 TDD 的功能之後發現 VS2010 裡面確實為了 TDD 下了一番功夫,整體的流暢度比以前改善很多,不過導入 TDD 與否並不是單靠一個程式設計師就可以決定的,要成功的導入一項技術或工具必須在團隊上先進行溝通,SA SD PG 都彼此了解各自的立場,我相信有了良性的互動,PG 想把程式品質提高應該沒有人會反對吧?

 

Bda