Nunit各種不同的Setup和TearDown標記來協助我們頻繁的建立一致的測試環境,這種功能能協助您確保一
個測試案例不會對其他任何一個測試案例產生作用(測試案例隔離-Test case isolation),而證明測試
用例隔離的最好例子就是以任何順序執行您的測試
Nunit的Test Fixture是用來被一個或更多測試案例共用的用來初始化對象或是提供一些相關資源的裝置
;按照Nunit的規定,一個Test Fixture就是一個標記了[TestFixture]屬性的類,他的方法提供:
[Test]標記一個測試案例,這個測試案例將作為一個原子操作而不依賴於其他的測試;
[SetUp]和[TearDown]用來在測試案例間重設測試環境,在每個測試的開始和結束的時候,擁有這兩個
標記的方法將被執行
[TestFixtureSetup]和[TestFixtureTearDown]提供測試案例間需要共用的某些對象;標記了這兩個屬
性的方法將在每個test fixture開始和結束的時候被執行;
任何一個在運行時你需要的對象都可以被作為一個[TestFixture]類的執行個體變數(被所有測試案例共用)或
是一個方法的本地變數(對於個別的測試案例可見),這就是為什麼它被描述為test fixture的原因;也可
以認為Nunit的[TestFixture]是將一組測試表現為一個類的形式的一種方法;
現實世界中的TDD
兩個問題:
1.在產品開發中貫穿的測試需要在發布時很容易的去掉測試模組部分
2.對於一個滑鼠鍵盤驅動的GUI應用,你如何編寫一個測試來類比使用者的操作?
問題的解決辦法在於適當的將代碼拆分為可以被分開編譯,測試,和部署的獨立模組;一個例子就是將
Quad類編譯為一個分離的庫檔案.dll的方案優於將它編譯為一個和執行代碼混合的可執行檔程式,因為這
將是我們可以獨立的同時開發測試程式和域程式(domain program)作為分離的可執行檔使用共用的包含
Quad的類庫.dll
TDD的一個規則是,無須測試第三方代碼,所以我們沒有必要去測試gui架構的類,雖然有時候測試ui是有
用的;意思就是說,你可以捕捉使用者時間並由你正在開發的類來處理它;
接下來看看使用TDD開發一個combobox list的簡單的winform程式:
編譯以下代碼為庫CountryLib.dll
public class CountryList
{
public String GetCountry(int No)
{
return null;
}
}
編寫測試案例:
[TestFixture]
public class CountryBoxTest
{
[Test]
public void CheckContent()
{
CountryLib.CountryList list = new
CountryLib.CountryList();
Assert.AreEqual("UK", list.GetCountry(1));
Assert.AreEqual("US", list.GetCountry(2));
Assert.AreEqual("CH", list.GetCountry(3));
Assert.AreEqual(null, list.GetCountry(4));
}
}
很明顯,測試將會失敗,因為CountryList.GetCountry()返回null;
接下來重構代碼,為GetCountry方法填充正確邏輯,如下:
public class CountryList
{
string one = "UK";
string two = "US";
string three = "CH";
public string GetCountry(int No)
{
if ( No == 1 )
return one;
if ( No == 2 )
return two;
if ( No == 3 )
return three;
else
return null;
}
}
測試通過,一切正常;可能你想把代碼改的更好看一點,例如使用ArrayList儲存字串,但在這裡,這
並不是重點;
接下來建立一個winform項目,在表單上放置一個combobox,並在初始化中寫下如下代碼:
private void InitializeComponent()
{
...
CountryLib.CountryList list = new CountryLib.CountryList();
String country;
int index = 1;
while ((country = list.GetCountry(index++)) != null)
this.comboBox1.Items.Add(country);
...
}
從這裡我們可以看到,我們應該思考,CountryList類怎樣參與使用者介面的互動操作,對應編寫我們的測
試用例;簡而言之就是將表現層代碼和邏輯代碼充分剝離!這也是眾多設計方法所提倡的;