TDD介紹
TDD是一種開發方法,全稱是Test-Driven development,中文是測試驅動開發。作者是Kent Beck。首先讓我介紹一下三種常見的開發方式:
第一種:先Coding,然後Bug Fix。
第二種:先Coding,然後Unit Test,最後Bug Fix。很顯然用了單元測試的比第一種開發方式要好不少。
第三種:就是本文要說的TDD,它的方式和第二種恰恰相反。TDD先設計單元測試,然後再Coding,最後修複Bug。看:
TDD開發過程可以看成:給制自己制定一個目標,然後努力去完成這個目標。下面是這個比喻對應關係。斜杠前面的是TDD,斜杠後面的是完成目標:
1、寫一個測試 / 制定一個目標
2、編譯 / 瞭解完成目標的標準
3、運行測試,結果失敗 / 目標沒有達成
4、修改代碼 / 為了完成目標,不停奮鬥
5、再次運行測試,結果通過 / 目標達成。
這個說明應該比較形象啦。
下面我們看下真正的TDD迴圈,如所示:
TDD迴圈:
第一步:寫測試類別,然後拿去編譯。
第二步:將編譯產生好的dll之類的拿去測試,測試失敗。
第三步:失敗之後,就去修改測試的代碼,直到測試通過。
第四步:測試成功之後,去重構你的代碼,增加代碼的可讀性,但不能改變程式的任何功能。重構代碼之後還需要測試,必須測試成功為止。
這四個步驟之後,在從寫測試類別重新開始其他的功能。
ASP.NET MVC中進行TDD開發
下面用一個在asp.net mvc2 中進行一次簡單的TDD開發實戰。單元測試我使用NUnit。
建立一個你類庫項目命名為Test.Unit。再建一個asp.net mvc2的項目。項目結構如:
首先進行第一步,寫測試確定要實現什麼:我們實現一個資料列表的顯示。
在類庫項目中添加一個nunit.framework引用,然後再設計一個TodoControllerTest類用於測試控制器。
usingNUnit.Framework;
namespaceTest.Unit
{
[TestFixture]
public classTodoControllerTest
{
[Test]
public voidShould_Display_A_List_Of_Todo_Items()
{
}
}
}
這個測試類別用於測試Todo控制器,它需要資料實體。所以我們要在asp.net mvc 項目中添加Model。在Model添加下面實體:
public class Todo{ public static List<Todo> ThingsToBeDone = new List<Todo> { new Todo {Title = "Get Milk", Completed = false}, new Todo {Title = "Bring Home Bacon", Completed = false} }; public bool Completed { get; set; } public string Title { get; set; }}
我們修改TodoCpmtroller,代碼如下:
[TestFixture]public class TodoControllerTest{ [Test] public void Should_Display_A_List_Of_Todo_Items() { var viewResult = (ViewResult)new TodoController().Index(); Assert.AreEqual(Todo.ThingsToBeDone, viewResult.ViewData.Model); }}
測試TodoCpmtroller中的Index方法返回的資料是否與Todo的ThingsToBeDone相同,而此時我們還沒有在MVC項目中添加TodoController類和Index方法。
故我們需要在MVC項目中添加TodoController類,代碼如下:
public class TodoController : Controller{ // // GET: /Todo/ public ActionResult Index() { return View(); }}
我們編譯項目發現沒有錯誤。
使用Nunit進行測試,發現測試不通過,這對應TDD迴圈的的第二步。
因為Index中沒有返回任何的資料,所有才會測試失敗。修改Index方法,代碼如下。
public class TodoController : Controller{ // // GET: /Todo/ public ActionResult Index() { ViewData.Model = Todo.ThingsToBeDone; return View(); }}
編譯繼續測試,發現測試通過。對應上文的第三步。
這個例子非常簡單,也就用不著去重構代碼,所以TDD迴圈的第四步可以省去。然後接著下一輪的迴圈。
總結:本文首先簡單的介紹了一下TDD,隨後在asp.net mvc中進行了實戰。
參考:Test-Drive ASP.NET MVC