您的位置:軟件測(cè)試 > 開(kāi)源軟件測(cè)試 > 開(kāi)源單元測(cè)試工具 > junit
JUnit實(shí)施集合
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2013/1/17 14:14:29 ] 推薦標(biāo)簽:

1.測(cè)試的概念

長(zhǎng)期以來(lái),我所接觸的軟件開(kāi)發(fā)人員很少有人能在開(kāi)發(fā)的過(guò)程中進(jìn)行測(cè)試工作。大部分的項(xiàng)目都是在終驗(yàn)收的時(shí)候編寫(xiě)測(cè)試文檔。有些項(xiàng)目甚至沒(méi)有測(cè)試文檔,F(xiàn)在情況有了改變。我們一直提倡UML、RUP、軟件工程、CMM,目的只有一個(gè),提高軟件編寫(xiě)的質(zhì)量。舉一個(gè)極端的例子:如果你是一個(gè)超級(jí)程序設(shè)計(jì)師,一個(gè)傳奇般的人物。(你可以一邊喝咖啡,一邊聽(tīng)著音樂(lè),同時(shí)編寫(xiě)這操作系統(tǒng)中關(guān)于進(jìn)程調(diào)度的模塊,而且兩天時(shí)間內(nèi)完成了。┪艺娴贸姓J(rèn),有這樣的人。(那個(gè)編寫(xiě)UNIX中的vi編輯器的家伙是這種人。)然而非常遺憾的是這些神仙們并沒(méi)有留下如何修成正果的README。所以我們這些凡人--在同一時(shí)間只能將注意力集中到若干點(diǎn)(據(jù)科學(xué)統(tǒng)計(jì),我并不太相信,一般的人只能同時(shí)考慮多7個(gè)左右的問(wèn)題,高手可以達(dá)到12個(gè)左右),而不能既縱覽全局又了解細(xì)節(jié)--只能期望于其他的方式來(lái)保證我們所編寫(xiě)的軟件質(zhì)量。

為了說(shuō)明我們這些凡人是如何的笨。有一個(gè)聰明人提出了軟件熵(software entropy)的概念:一個(gè)程序從設(shè)計(jì)很好的狀態(tài)開(kāi)始,隨著新的功能不斷地加入,程序逐漸地失去了原有的結(jié)構(gòu),終變成了一團(tuán)亂麻。你可能會(huì)爭(zhēng)辯,在這個(gè)例子中,設(shè)計(jì)很好的狀態(tài)實(shí)際上并不好,如果好的話(huà),不會(huì)發(fā)生你所說(shuō)的情況。是的,看來(lái)你變聰明了,可惜你還應(yīng)該注意到兩個(gè)問(wèn)題:1)我們不能指望在恐龍紀(jì)元(大概是十年前)設(shè)計(jì)的結(jié)構(gòu)到了現(xiàn)在也能適用吧。2)擁有簽字權(quán)的客戶(hù)代表可不理會(huì)加入一個(gè)新功能是否會(huì)對(duì)軟件的結(jié)構(gòu)有什么影響,即便有影響也是程序設(shè)計(jì)人員需要考慮的問(wèn)題。如果你拒絕加入這個(gè)你認(rèn)為致命的新功能,那么你很可能失去了你的住房貸款和面包(對(duì)中國(guó)工程師來(lái)說(shuō)也許是米飯或面條,要看你是南方人還是北方人)。

另外,需要說(shuō)明的是我看過(guò)的一些講解測(cè)試的書(shū)都沒(méi)有我寫(xiě)的這么有人情味(不好意思...)。我希望看到這片文章的兄弟姐妹能很容易地接受測(cè)試的概念,并付諸實(shí)施。所以有些地方寫(xiě)的有些夸張,歡迎對(duì)測(cè)試有深入理解的兄弟姐妹能體察民情,并不吝賜教()。

好了,我們現(xiàn)在言歸正傳。要測(cè)試,要明白測(cè)試的目的。我認(rèn)為測(cè)試的目的很簡(jiǎn)單也極具吸引力:寫(xiě)出高質(zhì)量的軟件并解決軟件熵這一問(wèn)題。想象一下,如果你寫(xiě)的軟件和Richard Stallman(GNU、FSF的頭兒)寫(xiě)的一樣有水準(zhǔn)的話(huà),是不是很有成感?如果你一致保持這種高水準(zhǔn),我保證你的薪水也會(huì)有所變動(dòng)。

測(cè)試也分類(lèi),白箱測(cè)試、黑箱測(cè)試、單元測(cè)試、集成測(cè)試、功能測(cè)試...。我們先不管有多少分類(lèi),如何分類(lèi)。先看那些對(duì)我們有用的分類(lèi),關(guān)于其他的測(cè)試,有興趣的人可參閱其他。白箱測(cè)試是指在知道被測(cè)試的軟件如何(How)完成功能和完成什么樣(What)的功能的條件下所作的測(cè)試。一般是由開(kāi)發(fā)人員完成。因?yàn)殚_(kāi)發(fā)人員了解自己編寫(xiě)的軟件。本文也是以白箱測(cè)試為主。黑箱測(cè)試則是指在知道被測(cè)試的軟件完成什么樣(What)的功能的條件下所作的測(cè)試。一般是由測(cè)試人員完成。黑箱測(cè)試不是我們的重點(diǎn)。本文主要集中在單元測(cè)試上,單元測(cè)試是一種白箱測(cè)試。目的是驗(yàn)證一個(gè)或若干個(gè)類(lèi)是否按所設(shè)計(jì)的那樣正常工作。集成測(cè)試則是驗(yàn)證所有的類(lèi)是否能互相配合,協(xié)同完成特定的任務(wù),目前我們暫不關(guān)心它。下面我所提到的測(cè)試,除非特別說(shuō)明,一般都是指單元測(cè)試。

需要強(qiáng)調(diào)的是:測(cè)試是一個(gè)持續(xù)的過(guò)程。也是說(shuō)測(cè)試貫穿與開(kāi)發(fā)的整個(gè)過(guò)程中,單元測(cè)試尤其適合于迭代增量式(iterative and incremental)的開(kāi)發(fā)過(guò)程。Martin Fowler(有點(diǎn)兒像引用孔夫子的話(huà))甚至認(rèn)為:“在你不知道如何測(cè)試代碼之前,不應(yīng)該編寫(xiě)程序。而一旦你完成了程序,測(cè)試代碼也應(yīng)該完成。除非測(cè)試成功,你不能認(rèn)為你編寫(xiě)出了可以工作的程序。”我并不指望所有的開(kāi)發(fā)人員都能有如此高的覺(jué)悟,這種層次也不是一蹴而的。但我們一旦了解測(cè)試的目的和好處,自然會(huì)堅(jiān)持在開(kāi)發(fā)過(guò)程中引入測(cè)試。

因?yàn)槲覀兪菧y(cè)試新手,我們也不理會(huì)那些復(fù)雜的測(cè)試原理,先說(shuō)一說(shuō)簡(jiǎn)單的:測(cè)試是比較預(yù)期的結(jié)果是否與實(shí)際執(zhí)行的結(jié)果一致。如果一致則通過(guò),否則失敗。看下面的例子:

    //將要被測(cè)試的類(lèi)    public class Car {        public int getWheels() {            return 4;        }    }        //執(zhí)行測(cè)試的類(lèi)    public class testCar {        public static void main(String[] args) {            testCar myTest = new testCar();            myTest.testGetWheels();        }                public testGetWheels() {            int expectedWheels = 4;            Car myCar = Car();            if (expectedWheels==myCar.getWheels())                 System.out.println("test [Car]: getWheels works perfected!");            else                System.out.println("test [Car]: getWheels DOESN@#T work!");            }    }    如果你立即動(dòng)手寫(xiě)了上面的代碼,你會(huì)發(fā)現(xiàn)兩個(gè)問(wèn)題,第一,如果你要執(zhí)行測(cè)試的類(lèi)testCar,你必須必須手工敲入如下命令:
    [Windows] d:>java testCar        [Unix] % java testCar    即便測(cè)試如例示的那樣簡(jiǎn)單,你也有可能不愿在每次測(cè)試的時(shí)候都敲入上面的命令,而希望在某個(gè)集成環(huán)境中(IDE)點(diǎn)擊一下鼠標(biāo)能執(zhí)行測(cè)試。后面的章節(jié)會(huì)介紹到這些問(wèn)題。第二,如果沒(méi)有一定的規(guī)范,測(cè)試類(lèi)的編寫(xiě)將會(huì)成為另一個(gè)需要定義的標(biāo)準(zhǔn)。沒(méi)有人希望查看別人是如何設(shè)計(jì)測(cè)試類(lèi)的。如果每個(gè)人都有不同的設(shè)計(jì)測(cè)試類(lèi)的方法,光維護(hù)被測(cè)試的類(lèi)夠煩了,誰(shuí)還顧得上維護(hù)測(cè)試類(lèi)?另外有一點(diǎn)我不想提,但是這個(gè)問(wèn)題太明顯了,測(cè)試類(lèi)的代碼多于被測(cè)試的類(lèi)!這是否意味這雙倍的工作?不!1)不論被測(cè)試類(lèi)-Car 的 getWheels 方法如何復(fù)雜,測(cè)試類(lèi)-testCar 的testGetWheels 方法只會(huì)保持一樣的代碼量。2)提高軟件的質(zhì)量并解決軟件熵這一問(wèn)題并不是沒(méi)有代價(jià)的。testCar是代價(jià)。

我們目前所能做的是盡量降低所付出的代價(jià):我們編寫(xiě)的測(cè)試代碼要能被維護(hù)人員容易的讀取,我們編寫(xiě)測(cè)試代碼要有一定的規(guī)范。好IDE工具可以支持這些規(guī)范。 好了,你所需要的是。一個(gè)Open Source的項(xiàng)目。用其主頁(yè)上的話(huà)來(lái)說(shuō)是:“JUnit是由 Erich Gamma 和 Kent Beck 編寫(xiě)的一個(gè)回歸測(cè)試框架(regression testing framework)。用于Java開(kāi)發(fā)人員編寫(xiě)單元測(cè)試之用。”所謂框架是 Erich Gamma 和 Kent Beck 定下了一些條條框框,你編寫(xiě)的測(cè)試代碼必須遵循這個(gè)條條框框:繼承某個(gè)類(lèi),實(shí)現(xiàn)某個(gè)接口。其實(shí)也是我們前面所說(shuō)的規(guī)范。好在JUnit目前得到了大多數(shù)軟件工程師的認(rèn)可。遵循JUnit我們會(huì)得到很多的支持;貧w測(cè)試是你不斷地對(duì)所編寫(xiě)的代碼進(jìn)行測(cè)試:編寫(xiě)一些,測(cè)試一些,調(diào)試一些,然后循環(huán)這一過(guò)程,你會(huì)不斷地重復(fù)先前的測(cè)試,哪怕你正編寫(xiě)其他的類(lèi),由于軟件熵的存在,你可能在編寫(xiě)第五個(gè)類(lèi)的時(shí)候發(fā)現(xiàn),第五個(gè)類(lèi)的某個(gè)操作會(huì)導(dǎo)致第二個(gè)類(lèi)的測(cè)試失敗。通過(guò)回歸測(cè)試我們抓住了這條大Bug。

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