測試驅動開發允許你在更好的瞭解問題之前不做出任何決定;在具備足夠的關於產品將如何被開發的知識
之前,你不需要提出一個完美的架構;
一個最簡單的測試:
所謂實踐出真知,現在來做一個做簡單的例子;我們不使用任何特殊的工具;
一個計算矩形面積和周長的程式:
public class Quad
{
public int Area(int length, int width)
{
return 0;
}
}
static void Main(string[] args)
{
Quad q = new Quad();
System.Diagnostics.Debug.Assert(q.Area(3,2) == 6);
}
執行程式,發生“宣告失敗”的錯誤,很明顯,因為q.Area(3,2)!=6;
接下來寫入程式碼,使q.Area(3,2)==6;
public class Quad
{
public int Area(int length, int width)
{
return 0;
}
}
再次運行,沒有任何問題,一切正常;
接下來,重構測試程式:
public class Quad
{
private int m_length;
private int m_width;
public Quad( int length, int width)//初始化值
{
m_length = length;
m_width = width;
}
public int Area()//計算面積
{
return m_length * m_width;
}
public int Perimeter()
{
return m_length*2+m_width*2;
}
}
static void Main(string[] args)
{
Quad q = new Quad(3,2);
System.Diagnostics.Debug.Assert(q.Area() == 6);
System.Diagnostics.Debug.Assert(q.Perimeter()==10);
}
是的,沒有發生任何異常;於是我們就用最簡單的形式完成了一次示範TDD(測試驅動開發)的練習;接下
來是對於相關的每一步的摘要:
1.寫下一個失敗的測試:我們選擇了一個看起來最容易實現的測試進行編碼;接下來我們寫了一個計算矩
形面積的最簡單的實現以便編譯它,儘管當我們執行程式的時候它發生了中斷因為面積並不等於6;
2.修改代碼通過測試:修改代碼的過程中,我們用寫入程式碼傳回值6的方法完成了一個最簡單的任務,目標僅
僅是讓程式通過測試,接下來,我們使用了不同的參數強迫我們實現一個適當的演算法來通過測試;
3.接下來我們重構了代碼,使得程式更具有柔韌性,並且更易於理解;
關於TDD,注意到以下幾點:
1.測試證明了代碼,我們可以通過測試很清晰的看到Quad這個類究竟做了些什麼;
2.我們可以通過測試來度量進度;每一個功能都被測試所證明;
3.測試能使每個人都對改變的代碼充滿自信,即使你是一個使用專家編寫的類的C#菜鳥,執行所有測試能
保證你沒有搞糟任何事情;
4.失誤,正如傳遞長度與寬度資料給Area 和 Perimeter方法而不是建構函式一樣,將在重構中被逐步糾
正;
5.當你在現實世界中使用TDD的時候,你會產生大量的測試,所以你需要使用像NUnit這樣的工具組織你的
測試;
使用Nunit進行你的自動化測試:
在成百上千個測試的海洋中,小組成員將頻繁經曆“編寫測試,修改代碼,重構”這樣的周期;本質就是
你可以很有效率的編寫和運行測試;Nunit這樣的架構就是設計來協助你做這些事情的