引言:
舉一個(gè)可能會(huì)發(fā)生在你身邊的事件將更能貼近實(shí)際,幸好我們現(xiàn)在有一件在程序員看來非常普通的任務(wù):
你第上班,你的項(xiàng)目經(jīng)理拿給你一疊不算厚的文檔,告訴你的任務(wù)是按照文檔中的要求編寫一個(gè).Net類,可能因?yàn)槿蝿?wù)并不復(fù)雜,所以他看上去非常的隨意。
能否很好的完成任務(wù)對(duì)你來說非常特殊,你拿過來后快速略過了前面大段的項(xiàng)目介紹,因?yàn)槟阒滥切⿲?duì)你并不重要,印象中好象是一個(gè)關(guān)于售票系統(tǒng)的工程。很快,你找了你需要關(guān)注的重點(diǎn):類的需求說明文檔。你詳細(xì)的看了一遍,感覺并不復(fù)雜,類名Ticket,有一個(gè)只讀的int型公共的屬性,名稱是Amount,還有兩個(gè)方法,一個(gè)是名稱是Sell,功能是將Amount減去一,表示賣掉了一張票,當(dāng)然,票可不能為負(fù)數(shù),如果是的話,拋出一個(gè)異常說明原因。另一個(gè)是Add,它有一個(gè)int型的參數(shù),功能是將這個(gè)參數(shù)的值加到Amount中去,可能是表示進(jìn)票之類的事情吧,你不太關(guān)心,反正這個(gè)程序很簡單,你掩飾住內(nèi)心的狂喜,打開電腦,調(diào)出編輯器,開始準(zhǔn)備寫程序了。
"喂,等等",項(xiàng)目經(jīng)理不知道什么時(shí)候又轉(zhuǎn)回來了,"我想知道你打算怎么進(jìn)行單元測試,我關(guān)心的是這個(gè)"。
"什么是單元測試?"你轉(zhuǎn)過頭一臉沮喪的看著失望的項(xiàng)目經(jīng)理。
什么是單元測試:
在程序設(shè)計(jì)過程中會(huì)有許多種測試,單元只是其中的一種,單元測試并不能保證程序是完美無缺的,但是在所有的測試中,單元測試是第一個(gè)環(huán)節(jié),也是重要的一個(gè)環(huán)節(jié)。單元測試是一種由程序員自行測試的工作。簡單點(diǎn)說,單元測試是測試代碼撰寫者依據(jù)其所設(shè)想的方式執(zhí)行是否產(chǎn)生了預(yù)期的結(jié)果。關(guān)于單元測試的重要性已經(jīng)有許多文章做了很多深入的分析,這里不再贅述。
NUnit是一個(gè)為Net準(zhǔn)備的自動(dòng)化單元測試框架,它的作用是幫助你方便的完成單元測試工作,同鼎鼎有名的JUnit一樣,都是xUnit家族的成員。它的下載地址是:http://www.nunit.org。
測試先行:
"什么?先寫測試?"你一定非常驚訝,對(duì)!是先來編寫測試代碼,按照極限編程(XP)的理論,寫測試是對(duì)軟件進(jìn)行設(shè)計(jì)的過程,它的重要性甚至超過了實(shí)際完成功能的代碼。先將測試寫完,然后再來完成代碼,這樣,所有的測試通過之日也是程序完成之時(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ī)定必須要添加的,這樣,測試框架可以知道哪些類或者方法需要進(jìn)行測試。
我們在Add方法中定義了一個(gè)ticket對(duì)象,并給他加了100張票,然后可以使用:
Assertion.AssertEquals(100, ticket.Amount);
來測試ticket的Amount屬性是否確實(shí)為100。
接下來,我們再向TicketTest中添加一個(gè)測試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è)方法的測試已經(jīng)做完了,我們來看一下測試的結(jié)果,根據(jù)要求,我們寫了如下代碼:
public class Ticket
{
private int amount;
public int Amount
{
get
{
return amount;
}
}
public void Add(int num)
{
}
public void Sell()
{
}
}