您的位置:軟件測(cè)試 > 開(kāi)源軟件測(cè)試 > 開(kāi)源單元測(cè)試工具 > Nunit
NUnit在.Net編程中如何進(jìn)行單元測(cè)試
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2012/12/21 14:56:41 ] 推薦標(biāo)簽:

引言:

舉一個(gè)可能會(huì)發(fā)生在你身邊的事件將更能貼近實(shí)際,幸好我們現(xiàn)在有一件在程序員看來(lái)非常普通的任務(wù):

你第上班,你的項(xiàng)目經(jīng)理拿給你一疊不算厚的文檔,告訴你的任務(wù)是按照文檔中的要求編寫(xiě)一個(gè).Net類,可能因?yàn)槿蝿?wù)并不復(fù)雜,所以他看上去非常的隨意。

能否很好的完成任務(wù)對(duì)你來(lái)說(shuō)非常特殊,你拿過(guò)來(lái)后快速略過(guò)了前面大段的項(xiàng)目介紹,因?yàn)槟阒滥切⿲?duì)你并不重要,印象中好象是一個(gè)關(guān)于售票系統(tǒng)的工程。很快,你找了你需要關(guān)注的重點(diǎn):類的需求說(shuō)明文檔。你詳細(xì)的看了一遍,感覺(jué)并不復(fù)雜,類名Ticket,有一個(gè)只讀的int型公共的屬性,名稱是Amount,還有兩個(gè)方法,一個(gè)是名稱是Sell,功能是將Amount減去一,表示賣掉了一張票,當(dāng)然,票可不能為負(fù)數(shù),如果是的話,拋出一個(gè)異常說(shuō)明原因。另一個(gè)是Add,它有一個(gè)int型的參數(shù),功能是將這個(gè)參數(shù)的值加到Amount中去,可能是表示進(jìn)票之類的事情吧,你不太關(guān)心,反正這個(gè)程序很簡(jiǎn)單,你掩飾住內(nèi)心的狂喜,打開(kāi)電腦,調(diào)出編輯器,開(kāi)始準(zhǔn)備寫(xiě)程序了。

"喂,等等",項(xiàng)目經(jīng)理不知道什么時(shí)候又轉(zhuǎn)回來(lái)了,"我想知道你打算怎么進(jìn)行javascript:;" onClick="javascript:tagshow(event, '%B5%A5%D4%AA%B2%E2%CA%D4');" target="_self">單元測(cè)試,我關(guān)心的是這個(gè)"。

"什么是單元測(cè)試?"你轉(zhuǎn)過(guò)頭一臉沮喪的看著失望的項(xiàng)目經(jīng)理。

什么是單元測(cè)試:

在程序設(shè)計(jì)過(guò)程中會(huì)有許多種測(cè)試,單元只是其中的一種,單元測(cè)試并不能保證程序是完美無(wú)缺的,但是在所有的測(cè)試中,單元測(cè)試是第一個(gè)環(huán)節(jié),也是重要的一個(gè)環(huán)節(jié)。單元測(cè)試是一種由程序員自行測(cè)試的工作。簡(jiǎn)單點(diǎn)說(shuō),單元測(cè)試是測(cè)試代碼撰寫(xiě)者依據(jù)其所設(shè)想的方式執(zhí)行是否產(chǎn)生了預(yù)期的結(jié)果。關(guān)于單元測(cè)試的重要性已經(jīng)有許多文章做了很多深入的分析,這里不再贅述。

NUnit是一個(gè)為Net準(zhǔn)備的自動(dòng)化單元測(cè)試框架,它的作用是幫助你方便的完成單元測(cè)試工作,同鼎鼎有名的JUnit一樣,都是xUnit家族的成員。它的下載地址是:http://www.nunit.org。

測(cè)試先行:

"什么?先寫(xiě)測(cè)試?"你一定非常驚訝,對(duì)!是先來(lái)編寫(xiě)測(cè)試代碼,按照極限編程(XP)的理論,寫(xiě)測(cè)試是對(duì)軟件進(jìn)行設(shè)計(jì)的過(guò)程,它的重要性甚至超過(guò)了實(shí)際完成功能的代碼。先將測(cè)試寫(xiě)完,然后再來(lái)完成代碼,這樣,所有的測(cè)試通過(guò)之日也是程序完成之時(shí)。

首先,我們將NUnit提供的要nunit.framework.dll文件引入到工程中,并創(chuàng)建一個(gè)名為TicketTest的類:
[TestFixture]public class TicketTest{[Test]public void Add(){Ticket ticket = new Ticket();ticket.Add(100);Assertion.AssertEquals(100, ticket.Amount);}}

注意,其中的[TestFixture]和[Test]兩個(gè)Attribute為NUnit所規(guī)定必須要添加的,這樣,測(cè)試框架可以知道哪些類或者方法需要進(jìn)行測(cè)試。

我們?cè)贏dd方法中定義了一個(gè)ticket對(duì)象,并給他加了100張票,然后可以使用:

Assertion.AssertEquals(100, ticket.Amount);

來(lái)測(cè)試ticket的Amount屬性是否確實(shí)為100。

接下來(lái),我們?cè)傧騎icketTest中添加一個(gè)測(cè)試Sell的方法:

[Test]public void Sell(){Ticket ticket = new Ticket();ticket.Add(100);ticket.Sell();ticket.Sell();ticket.Sell();Assertion.AssertEquals(97, ticket.Amount);}

這里,我們先加了100張票之后一口氣賣掉了3張,然后看看我們是否還剩下97張票。

好了,這兩個(gè)方法的測(cè)試已經(jīng)做完了,我們來(lái)看一下測(cè)試的結(jié)果,根據(jù)要求,我們寫(xiě)了如下代碼:

public class Ticket{private int amount;public int Amount{get{return amount;}}public void Add(int num){}public void Sell(){}}

注意這段代碼只是為了完成類的結(jié)構(gòu),方法的實(shí)現(xiàn)暫時(shí)先空著。然后將這段代碼編譯成一個(gè)dll動(dòng)態(tài)連接庫(kù)文件:UnitTest.dll。

我們運(yùn)行NUnit的圖形測(cè)試工具,打開(kāi)我們編譯好的dll文件,點(diǎn)"Run"按紐,可以看到:很醒目紅色,表示測(cè)試并沒(méi)有成功,不過(guò)這個(gè)是在我們的預(yù)料之中的。

接下來(lái),我們向剛才的Ticket類中完成我們的Add方法實(shí)現(xiàn)代碼:

public void Add(int num)

{

amount += num;

}

保存,重新編譯。

切換到NUnit,再點(diǎn)Run,可以看到:

Add方法已經(jīng)變成綠色了,再接著將Sell方法也完成:

public void Sell()

{

amount -= 1;

}

再來(lái)測(cè)試,結(jié)果變成:

啊,總算變成美麗的綠色了,大家現(xiàn)在體會(huì)到環(huán)保的重要性了吧。:)

那么可以交任務(wù)了嗎?等等,別急,還有個(gè)異常沒(méi)測(cè)試呢,如果我們的Amount小于0的話,會(huì)產(chǎn)生異常,那么,異常怎么測(cè)試呢?請(qǐng)接著看。

測(cè)試異常:

還是跟上面一樣,先寫(xiě)出測(cè)試代碼:

[Test][ExpectedException(typeof(Exception))]public void ExcpetionTesting(){Ticket ticket = new Ticket();ticket.Add(3);ticket.Sell();ticket.Sell();ticket.Sell();ticket.Sell();}

其中,[ExpectedException(typeof(Exception))]表示我們希望能捕獲到發(fā)生的異常,如果沒(méi)有捕獲到異常,則表示測(cè)試失敗。

后面的代碼很好理解,我們加了三張票,卻賣了四張出去,這可不是炒股,以后沒(méi)辦法平倉(cāng)的。:)

編譯運(yùn)行,我們看到以下的測(cè)試畫(huà)面:

在Ticket類中,我們修改一下Sell方法,讓它變成:

public void Sell()

{

if(amount - 1 < 0)

throw new Exception("Amount不能為0");

amount -= 1;

}

編譯,再測(cè)試,結(jié)果如下:

好了,到了這里算完成我們的單元測(cè)試之旅了,大家對(duì)如何在C#中進(jìn)行單元測(cè)試一定已經(jīng)有了一個(gè)基本的認(rèn)識(shí)。另外,NUnit并不是只針對(duì)C#,事實(shí)上,你可以在任何.Net語(yǔ)言中使用NUnit來(lái)測(cè)試你的單元,方法都一樣。

總結(jié):

單元測(cè)試看上去雖然有點(diǎn)麻煩,但是它為程序員提供了一個(gè)安全的觀點(diǎn),讓程序員對(duì)自己的程序更加有信心,在減少開(kāi)發(fā)后期進(jìn)行頻繁Debug所耗費(fèi)時(shí)間的同時(shí)也為應(yīng)用軟件提供了第一道安全防護(hù)網(wǎng),因此,單元測(cè)試是提高開(kāi)發(fā)效率和軟件品質(zhì)的一個(gè)重要的手段。

利用UNint,我們可以在.Net編程過(guò)程中非常方便的進(jìn)行單元測(cè)試,它圖形化的界面和簡(jiǎn)單而強(qiáng)大的測(cè)試框架為我們提供了一個(gè)非常舒適而有趣的測(cè)試環(huán)境,能夠讓程序員覺(jué)得進(jìn)行單元測(cè)試并不枯燥乏味,習(xí)慣后甚至還能成為一種樂(lè)趣。

看完本文,如果你是引言中那個(gè)可憐的程序員的話,你現(xiàn)在一定能輕松的面對(duì)你的項(xiàng)目經(jīng)理,交上一份令人放心的代碼答卷。

軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd