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