原著:NUnit v2.1
原文:NUnit文檔之QuickStart.doc
翻譯:lover_P
--------------------------------------------------------------------------------
[譯者序]
縱觀軟件的開發(fā),測試已經(jīng)日益成為軟件開發(fā)過程中的重要環(huán)節(jié),通常一個軟件的開發(fā)周期中測試要占到一半時間甚至更多。而在測試過程中,單元測試更是萬里長征第一步,單元測試進行得是否完善,直接影響到后期集成測試的效率。進行單元測試,有許多軟件可以自動完成,NUnit是其中之一。這是一款與JUnit齊名的,同屬于xUnit家族的單元測試軟件(在http://www.NUnit.org我們可以免費得到這款軟件)。
[正文]
讓我們從一個簡單的例子開始。假設我們正在編寫一個銀行應用程序,而我們有一個這一領域的基本類——Aclearcase/" target="_blank" >ccount。Account支持存款、取款和資金轉帳。這個Account類看起來會是這個樣子:
namespace bank {
public class Account {
private float balance;
public void Deposit(float amount) {
balance += amount;
}
public void Withdraw(float amount) {
balance -= amount;
}
public void TransferFunds(Account destination, float amount) {
}
public float Balance {
get {
return balance;
}
}
}
}
現(xiàn)在我們來為這個類寫一個測試——AccountTest。我們要測試的第一個類方法是TransferFunds。
namespace bank {
using NUnit.Framework;
[TestFixture]
public class AccountTest {
[Test]
public void TransferFunds() {
Account source = new Account();
source.Deposit(200.00F);
Account destination = new Account();
destination.Deposit(150.00F);
source.TransferFunds(destination, 100.00F);
Assert.AreEqual(250.00F, destination.Balance);
Assert.AreEqual(100.00F, source.Balance);
}
}
}
首先要注意的是這個類關聯(lián)了一個[TestFixture]特性(attribute)——這表示這個類包含了測試代碼(這個特性可以被繼承)。這個類必須是公有的,但他的父類并不受限制。這個類還必須有一個默認構造函數(shù)。
類中的一個方法——TransferFunds(),關聯(lián)了一個[Test]特性——這表示它是一個測試方法。測試方法的返回值必須為void并且不能帶有參數(shù)。在我們的測試方法中,我們對被測試的對象進行了一般的初始化,執(zhí)行了被測試的方法并檢查了對象的狀態(tài)。Assert類定義了一組方法用于檢查給定的條件,在我們的例子中我們使用了AreEqual()方法來確保交易過后兩個賬戶都有正確的余額(這個方法有很多重載,我們在這個例子中使用的版本帶有兩個參數(shù):第一個參數(shù)是我們的期望值,第二個參數(shù)是實際值)。
編譯并運行這個例子。假設你已經(jīng)將你的測試代碼編譯為bank.dll。打開NUint Gui(安裝程序會在你的桌面和“程序”菜單中建立一個快捷方式),打開GUI后,選擇File->Open菜單項,找到你的bank.dll并在“Open”對話框中選中它。bank.dll裝載后你會在左邊的面板中看到一個測試樹結構,還有右邊的一組狀態(tài)面板。單擊Run按鈕,狀態(tài)條和測試樹種的TransferFunds節(jié)點變成了紅色——我們的測試失敗了。“Errors and Failures”面板顯示如下消息——“TransferFunds: expected <250> but was <150>”,在它正下方的堆棧跟蹤面板報告了測試失敗的語句在代碼中的位置——“at bank.AccountTest.TransferFunds() in C: unitBankSampleTestsAccountTest.cs:line 17”
這正是預期的結果,因為我們還未實現(xiàn)TransferFunds()方法。現(xiàn)在我們來搞定它。不要關閉GUI,回到你的IDE并修改代碼,使你的TransferFunds()方法看起來像這樣:
public void TransferFunds(Account destination, float amount) {
destination.Deposit(amount);
Withdraw(amount);
}
現(xiàn)在重新編譯你的代碼并再次在GUI中點擊Run按鈕——狀態(tài)條和數(shù)節(jié)點變綠了。(注意GUI會自動地為你重新加載程序集;我們可以一直開著GUI而在IDE中繼續(xù)工作并寫更多的測試)。
讓我們來為我們的Account的代碼添加一些錯誤檢測。為賬戶添加一個小余額限制,通過你的小透支保護費來維持它的持續(xù)運作。首先我們來為Account類添加一個小余額保護屬性:
private float minimumBalance = 10.00F;
public float MinimumBalance {
get {
return minimumBalance;
}
}
我們使用一個異常來指出透支:
namespace bank {
using System;
public class InsufficientFundsException : ApplicationException {
}
}
向我們的AccountTest類添加一個新的方法:
[Test]
[ExpectedException(typeof(InsufficientFundsException))]
public void TransferWithInsufficientFunds() {
Account source = new Account();
source.Deposit(200.00F);
Account destination = new Account();
destination.Deposit(150.00F);
source.TransferFunds(destination, 300.00F);
}