在ASP.NET MVC中進行TDD開發
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類用于測試控制器。
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