.net中的TDD

TDD(Test-Driven Development) 測試驅動開發,就是以測試用例來帶動開發,也就是先作測試用例,而後根據測試用例作開發。TDD 的好外使是開發人員能夠針對性的作開發,目標就是經過測試用例,固然,TDD 更適合作邏輯的程序員,不適合更多的與UI 開發相關的程序員。
無論是TDD 也好,傳統的開發也好,確定要先作設計,設計展開後若是採用普通方法作開發,那就是開始寫代碼,而後單元測試,集成測試等工做。若是用TDD ,那就要先從設計中把測試列表(其實就是要實現的功能,人機交互的條目羅列出來,造成一個列表)整理出來。而後就開始開發,在TDD 中,「紅- - 重構」的過程不少說明TDD 的文章都要說到,本篇也不例外。
有了測試列後,先拿出一個條目,進行測試的開發,開發完成運行,由於被測的程序尚未編寫確定是失敗的,而後實現程序,再測,可能還失敗,改爲,測試成功,而後重構來優化代碼,再進入下一個測試條目的循環。
 
.net 平臺下,怎麼去實現呢?
本例中用VS2010 行進說明,設計部分,能夠用vs2010 的新功能Modeling ,在Modeling 裏,能夠畫類圖,還能夠添加其中的成員,包括返回值類型,參數個數和類型,有了這些方法的簽名,對咱們先構建測試就提供了依據,對測試程序來講,不關心實現的細節,只用知道參數是什麼,返回是什麼,拿上這個方法的返回值與給定的返回值做對比,從而來肯定方法實現的功能是否正確。在Visual Studio 中,能夠很方便的來自動建立單元測試,這些方便要歸功於「反射」這個技術。固然,通常而然,測試不是隻有一個數據,可能要一系列數據,或者更多的數據,在.net 平臺下,也提供了相應的功能。
下面來作個DEMO 說明一下。
先看一個類圖,也能夠把類中的主要功能,當成一個個條目添加到測試列表中。
 
咱們選一個條目—— GetRecord ,參數是一個 ID 的整型,返回值是一個邏輯類型,本方法用來實如今一個庫中查詢輸入的 ID ,看是否存在。
根據類圖,能夠在類庫項目中生成一個類,以下
 
 
1  public   class  DataOperate
2      {
3           public   bool  GetRecord( int  id)
4          {
5               throw   new  Exception( " 沒有實Ì現? " );
6          }
7      }
8 
 
 
接下來,能夠繼於這個方法,來自動建立一個單元測試,右鍵方法,建立測試。
一個測試的項目就會自動建立進來,在生成的CS 文件中,重點看以下代碼(關於單元測試的其餘知識可參照http://msdn.microsoft.com/zh-cn/library/ms182515(VS.80).aspx
 
 1  [TestMethod()]
 2           public   void  GetRecordTest()
 3          {
 4              DataOperate target  =   new  DataOperate(); 
 5               int  id  =   0
 6               bool  expected  =   false
 7               bool  actual;
 8              actual  =  target.GetRecord(id);
 9              Assert.AreEqual(expected, actual);         
10          }
11 
 
 
在這裏,測試的用例只有一個id=0 ,返回值爲false ,如今測試,確定通不過,由於被測的方法尚未實現。此時叫作「紅」。
接下來就要實現GetRecord 方法。
新建一個類庫項目,而後添加一個LINQ To SQL 的子項,把下表拖放進LINQ To SQL 面板。
數據表結構
 
數據表中數據
 
而後在類庫的 CS 文件中,添加入下代碼:
 
 1  public   bool  GetRecord( int  id)
 2          {
 3              DataClasses1DataContext DCDC  =   new  DataClasses1DataContext( " server=.;database=mytestdb;uid=sa;pwd=sa; " );         
 4               if  (DCDC.GetTable < Pic_Table > ().Where(record => record.ID  == id).Count()  == 1 )
 5              {
 6                   return   true ;
 7              }
 8               else
 9              {
10                   return   false ;
11              }
12          }
13 
 
固然測試是不關心咱們用什麼技術實現方法的,它只關係輸入和輸出。
這時咱們再運行測試,會發現測試經過了,這時咱們叫作「綠」。
可能有的人發現,在這個測試中,只能測一個數據,沒有表明性,若是要測多個數據,還得一個一個換id 值和expected 值。是的,這是一個頭痛的事,得想們辦法來解決。
正好,微軟有提供數據驅動的單元測試,什麼意思呢?就是能夠把id expected 的值保存在數據源中,而後批量測試。若是全經過說明這個方法實現的沒問題,若是有錯,也能夠針對性的能找出什麼數據使GetRecord 方法報錯的。這個東西很不錯。
首先來構建一個數據源, XML 是個不錯的選擇,新建一個 RecordExistTestCase.xml 文檔,內容以下
 
 1  <? xml version="1.0" encoding="utf-8"  ?>
 2  < DataSourses >
 3     < pic >
 4       < id > 0 </ id >
 5       < value > false </ value >
 6     </ pic >
 7     < pic >
 8       < id > -1 </ id >
 9       < value > false </ value >
10     </ pic >
11     < pic >
12       < id > 1 </ id >
13       < value > true </ value >
14     </ pic >
15  </ DataSourses >
16 
 
 
固然你還能夠添加你覺得好的測試用例。
再改造一下測試方法
 
1  [DataSource( " Microsoft.VisualStudio.TestTools.DataSource.XML " " |DataDirectory|\\RecordExistTestCase.xml " " pic " , DataAccessMethod.Sequential)]
2          [ DeploymentItem( " TestDataOperate\\RecordExistTestCase.xml " )]
3          [ TestMethod()]
4           public   void  GetRecordTest()
5          {  
6  ……
7 
8 
 
 
OK ,如今就要以用上面xml 裏的數據來批量測試了。
測試經過來,接下來就要程序員來整理一下自寫的代碼了,好比書寫規範問題,方法是否冗餘重複,註釋是否完善等。也就是所說的重構了。
到此,一個TDD cycle 就完成了,現實的cycle 可能更復雜,這裏只是對單個測試條目單個方法進行說明的。
TDD 更適合在敏捷的開發中去用,好比 XP ,雖然 scrum 是側重管理和組織,也能很好的溶入 TDD
相關文章
相關標籤/搜索