亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

JUnit實戰篇 (一)

2019-11-18 14:06:40
字體:
來源:轉載
供稿:網友

  JUnit實戰篇 (一)

修訂者:黃 凱

E_mail:hk_sz@163.com

前言

由于現在公司進行Unit Test Case的整理階段,所以抽空對Junit進行了一下了解,以下是集合了眾家所長之精華(考慮的是按我的思路總結的,也許不能完全表達作者的思路,所以在附錄中有所有我參考的文章地址,大家不妨去看看原文)。



一、測試的概念

長期以來,我所接觸的軟件開發人員很少有人能在開發的過程中進行測試工作。大部分的項目都是在最終驗收的時候編寫測試文檔,有些項目甚至沒有測試文檔?,F在情況有了改變。我們一直提倡UML、RUP、軟件工程、CMM,目的只有一個,提高軟件編寫的質量。舉一個極端的例子:假如你是一個超級程序設計師,一個傳奇般的人物(你可以一邊喝咖啡,一邊聽著音樂,同時編寫這操作系統中關于進程調度的模塊,而且兩天時間內就完成了?。?。我真得承認,有這樣的人(那個編寫UNIX中的vi編輯器的家伙就是這種人)。然而非常遺憾的是這些神仙們并沒有留下任何關于如何修成正果的README,所以我們這些凡人--在同一時間只能將注重力集中到若干點(據科學統計,我并不太相信,一般的人只能同時考慮最多7個左右的問題,高手可以達到12個左右),而不能既縱覽全局又了解細節--只能期望于其他的方式來保證我們所編寫的軟件質量。

為了說明我們這些凡人是如何的笨。有一個聰明人提出了軟件熵(software entropy)的概念:一個程序從設計很好的狀態開始,隨著新的功能不斷地加入,程序逐漸地失去了原有的結構,最終變成了一團亂麻。你可能會爭辯,在這個例子中,設計很好的狀態實際上并不好,假如好的話,就不會發生你所說的情況。是的,看來你變聰明了,可惜你還應該注重到兩個問題:1)我們不能指望在恐龍紀元(大概是十年前)設計的結構到了現在也能適用吧;2)擁有簽字權的客戶代表可不理會加入一個新功能是否會對軟件的結構有什么影響,即便有影響也是程序設計人員需要考慮的問題。假如你拒絕加入這個你認為致命的新功能,那么你很可能就失去了你的住房貸款和面包(對中國工程師來說也許是米飯或面條,要看你是南方人還是北方人)。

另外,需要說明的是我看過的一些講解測試的書都沒有我寫的這么有人情味(不好意思...)。我希望看到這篇文章的兄弟姐妹能很輕易地接受測試的概念,并付諸實施。所以有些地方寫的有些夸張,歡迎對測試有深入理解的兄弟姐妹能體察民情,并不吝賜教。

好了,我們現在言歸正傳。要測試,就要明白測試的目的。我認為測試的目的很簡單也極具吸引力:寫出高質量的軟件并解決軟件熵這一問題。想象一下,假如你寫的軟件和Richard Stallman(GNU、FSF的頭兒)寫的一樣有水準的話,是不是很有成就感?假如你一直保持這種高水準,我保證你的薪水也會有所變動。

測試也分類,白箱測試、黑箱測試、單元測試、集成測試、功能測試...。我們先不管有多少分類,如何分類。先看那些對我們有用的分類,關于其他的測試,有愛好的人可參閱其他資料。白箱測試是指在知道被測試的軟件如何(How)完成功能和完成什么樣(What)的功能的條件下所作的測試。一般是由開發人員完成。因為開發人員最了解自己編寫的軟件。本文也是以白箱測試為主。黑箱測試則是指在知道被測試的軟件完成什么樣(What)的功能的條件下所作的測試。一般是由測試人員完成。黑箱測試不是我們的重點。本文主要集中在單元測試上,單元測試是一種白箱測試。目的是驗證一個或若干個類是否按所設計的那樣正常工作。集成測試則是驗證所有的類是否能互相配合,協同完成特定的任務,目前我們暫不關心它。下面我所提到的測試,除非非凡說明,一般都是指單元測試。

需要強調的是:測試是一個持續的過程。也就是說測試貫穿與開發的整個過程中,單元測試尤其適合于迭代增量式(iterative and incremental)的開發過程。Martin Fowler(有點兒像引用孔夫子的話)甚至認為:“在你不知道如何測試代碼之前,就不應該編寫程序。而一旦你完成了程序,測試代碼也應該完成。除非測試成功,你不能認為你編寫出了可以工作的程序。”我并不指望所有的開發人員都能有如此高的覺悟,這種層次也不是一蹴而就的。但我們一旦了解測試的目的和好處,自然會堅持在開發過程中引入測試。因為我們是測試新手,我們也不理會那些復雜的測試原理,先說一說最簡單的:測試就是比較預期的結果是否與實際執行的結果一致。假如一致則通過,否則失敗??聪旅娴睦樱?

//將要被測試的類

public class Car

{

public int getWheels()

{

return 4;

}

}



//執行測試的類

public class testCar

{

public static void main(String[] args)

{

testCar myTest = new testCar();

myTest.testGetWheels();

}



public void testGetWheels ()

{

int eXPectedWheels = 5;

Car myCar =new Car();

if (expectedWheels==myCar.getWheels())

System.out.
else

System.out.println("test [Car]: getWheels DOESN´T work!");

}

}

假如你立即動手寫了上面的代碼,你會發現兩個問題:

第一,假如你要執行測試的類testCar,你必須必須手工敲入如下命令:

[Windows] D:>
java testCar

[Unix] % java testCar

即便測試如例示的那樣簡單,你也有可能不愿在每次測試的時候都敲入上面的命令,而希望在某個集成環境中(IDE)點擊一下鼠標就能執行測試。后面的章節會介紹到這些問題。

第二,假如沒有一定的規范,測試類的編寫將會成為另一個需要定義的標準。沒有人希望查看別人是如何設計測試類的。假如每個人都有不同的設計測試類的方法,光維護被測試的類就夠煩了,誰還顧得上維護測試類?另外有一點我不想提,但是這個問題太明顯了,測試類的代碼多于被測試的類!這是否意味這雙倍的工作?不!

1) 不論被測試類-Car 的 getWheels 方法如何復雜,測試類-testCar 的testGetWheels 方法只會保持一樣的代碼量。

2)提高軟件的質量并解決軟件熵這一問題并不是沒有代價的。testCar就是代價。

我們目前所能做的就是盡量降低所付出的代價:我們編寫的測試代碼要能被維護人員輕易的讀取,我們編寫測試代碼要有一定的規范。最好IDE工具可以支持這些規范。好了,你所需要的就是JUnit。一個Open Source的項目。用其主頁上的話來說就是:“ JUnit是由 Erich Gamma 和 Kent Beck 編寫的一個回歸測試框架(regression testing framework)。用于Java開發人員編寫單元測試之用。”所謂框架就是Erich Gamma 和 Kent Beck 定下了一些條條框框,你編寫的測試代碼必須遵循這個條條框框:繼續某個類,實現某個接口。其實也就是我們前面所說的規范。好在JUnit目前得到了大多數軟件工程師的認可。遵循JUnit我們會得到很多的支持?;貧w測試就是你不斷地對所編寫的代碼進行測試:編寫一些,測試一些,調試一些,然后循環這一過程,你會不斷地重復先前的測試,哪怕你正編寫其他的類,由于軟件熵的存在,你可能在編寫第五個類的時候發現,第五個類的某個操作會導致第二個類的測試失敗。通過回歸測試我們抓住了這條大Bug。



二、JUnit簡介及為什么要使用JUint

JUnit就是對程序代碼進行單元測試的一種Java框架。通過每次修改程序之后測試代碼,程序員就可以保證代碼的的少量變動不會破壞整個系統。要不是有Junit這樣的自動化測試工具,代碼的的反復測試簡直會把人累死而且還可能不準確?,F在好了,測試過程可以頻繁進行而且還是自動的,所以你可以令程序錯誤降低到最少。它寫的是單元測試(Unit Test):軟件工程里的白盒測試,就是測試某個類的某個方法的功能。XP 中推崇的 test first design 就是基于以上的技術。



假如你要寫一段代碼:

1. 先用 junit 寫測試,然后再寫代碼

2. 寫完代碼,運行測試,測試失敗

3. 修改代碼,運行測試,直到測試成功

假如以后對程序進行修改,優化 ( refactoring ),只要再運行測試代碼,假如所有的測試都成功,則代碼修改完成。



Java 下的 team 開發,一般采用 cvs(版本控制) + ant(項目治理) + junit(集成測試) 的模式:

1. 天天早上上班,每個開發人員從 cvs server 獲取一個整個項目的工作拷貝;

2. 拿到自己的任務,先用 junit 寫今天的任務的測試代碼;

3. 然后寫今天任務的代碼,運行測試,直到測試通過,任務完成;

4. 在下班前一兩個小時,各個開發人員把任務提交到 cvs server;

5. 然后由主管對整個項目運行自動測試,哪個測試出錯,就找相關人員修改,直到所有測試通過。下班...



先寫測試,再寫代碼的好處:

從技術上強制你先考慮一個類的功能,也就是這個類提供給外部的接口,而不至于太早陷入它的細節。這是面向對象提倡的一種設計原則。好的測試其實就是一個好的文檔,這個類使用者往往可以通過查看這個類的測試代碼了解它的功能。非凡的,假如你拿到別人的一個程序,對他寫測試是最好的了解這個程序的功能的方法。 xp的原則是 make it simple,不是很推薦另外寫文檔,因為項目在開發過程中往往處于變動中,假如在早期寫文檔,以后代碼變動后還得同步文檔,多了一個工作,而且由于項目時間緊往往文檔寫的不全或與代碼不一致,與其這樣,不如不寫。而假如在項目結束后再寫文檔,開發人員往往已經忘記當時寫代碼時的種種考慮,況且有下一個項目的壓力,治理人員也不愿意再為舊的項目寫文檔,導致以后維護的問題。沒有人能保證需求不變動,以往項目往往對需求的變動大為頭疼,害怕這個改動會帶來其他地方的錯誤。為此,除了設計好的結構以分割項目外(松耦合),但假如有了測試,并已經建立了一個好的測試框架,對于需求的變動,修改完代碼后,只要重新運行測試代碼,假如測試通過,也就保證了修改的成功,假如測試中出現錯誤,也會馬上發現錯在哪里,修改相應的部分,再運行測試,直至測試完全通過。



軟件公司里往往存在開發部門和測試部門之間的矛盾:由于開發和測試分為兩個部門,多了一層溝通的成本和時間,溝通往往會產生錯誤的發生。而且極易形成一個怪圈:開發人員為了趕任務,寫了爛爛的代碼,就把它扔給測試人員,然后寫其他的任務,測試當然是失敗的,又把代碼拿回去重寫,而且在國內往往一個軟件公司技術最差的部門就是測試部門(好的人都跑去寫代碼了),測試就成了一個很頭疼的問題。這種怪圈的根源是責任不清,根據 xp 中的規定:寫這個代碼的人必須為自己的代碼寫測試,而且只有測試通過,才算完成這個任務(這里的測試包括所有的測試,假如測試時發現由于你的程序導致別的模塊的測試失敗,你有責任通知相關人員修改直至集成測試通過),這樣就可以避免這類問題的發生。



參考

JUnit實施

作者:eric 原址:http://www.neweasier.com/article/2002-08-07/1028723459.Html

怎樣使用Junit Framework進行單元測試的編寫

作者:cinc 原址:http://www.chinaunix.net/bbsjh/14/546.html

主要是引用了cinc的評論,至于申文波先生的《怎樣使用Junit Framework進行單元測試的編寫》原文我建議大家有時間看一下,寫得很好,我這里沒有整合進來。

創建Junit測試案例

作者: BUILDER.COM 原址:http://www.zdnet.com.cn/developer/code/story/0,2000081534,39033729,00.htm

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久亚洲福利精品午夜| 福利精品视频在线| 51精品在线观看| 亚洲人成在线免费观看| 91久久精品视频| 最近2019中文字幕mv免费看| 日韩男女性生活视频| 日韩av在线电影网| 91理论片午午论夜理片久久| 亚洲第一视频网站| 日本久久久久亚洲中字幕| 91免费精品视频| 日韩中文字在线| 4444欧美成人kkkk| 精品无人区太爽高潮在线播放| 国产精品夜间视频香蕉| 国产精品91在线| 2019中文字幕全在线观看| 欧美激情伊人电影| 欧美高跟鞋交xxxxxhd| 成人亚洲综合色就1024| 欧美老女人在线视频| 精品视频在线导航| 国产成人精品免费视频| 欧美激情视频在线免费观看 欧美视频免费一| 国产精选久久久久久| 精品国产区一区二区三区在线观看| 在线观看欧美成人| 欧美激情综合色综合啪啪五月| 97热精品视频官网| 亚洲欧美日韩一区二区在线| 欧美国产精品日韩| 亚洲国产欧美一区二区丝袜黑人| 91精品国产综合久久久久久久久| 欧美成年人在线观看| 欧美性受xxxx黑人猛交| 欧美俄罗斯性视频| 国产精品视频专区| 91po在线观看91精品国产性色| 久久久国产一区二区| 欧美国产高跟鞋裸体秀xxxhd| 欧美午夜精品伦理| 亚洲欧洲一区二区三区在线观看| 欧美激情视频一区二区| 高清欧美电影在线| 91九色蝌蚪国产| 日韩电影大全免费观看2023年上| 午夜剧场成人观在线视频免费观看| 欧美久久精品一级黑人c片| 亚洲日本aⅴ片在线观看香蕉| 亚洲国产精品久久| 国产精品高潮呻吟久久av野狼| 欧美成人激情在线| 久久韩国免费视频| 欧美在线精品免播放器视频| 91视频免费在线| 亚洲精品成人免费| 欧美性猛交xxxx乱大交3| 中文字幕精品—区二区| 久久久久久久影视| 欧美日本国产在线| 精品国产一区二区三区久久狼黑人| 欧美精品在线网站| 亚洲国产小视频在线观看| 国产精品白嫩初高中害羞小美女| 97在线观看免费| 欧美一区二区三区艳史| 欧美性在线观看| 韩国v欧美v日本v亚洲| 亚洲电影成人av99爱色| 亚洲跨种族黑人xxx| 成人午夜两性视频| 国内精品久久久久| 中文精品99久久国产香蕉| 国产精品视频网| 91香蕉亚洲精品| 国产欧美日韩高清| 国产精品男人爽免费视频1| 97在线视频国产| 国产精品丝袜白浆摸在线| 国产精品视频区1| 欧美国产极速在线| 久久久91精品国产一区不卡| 精品日韩美女的视频高清| 国产主播精品在线| 亚洲色图25p| 国产精品777| 国产精品流白浆视频| 77777少妇光屁股久久一区| 久久99亚洲精品| 久久久精品视频在线观看| 日韩电影大片中文字幕| 亚洲成人a级网| 91成人国产在线观看| 91精品久久久久久综合乱菊| 97精品视频在线播放| 亚洲男人第一av网站| 精品久久久久久久中文字幕| 国产一区二区三区直播精品电影| 欧美一级片免费在线| 日韩精品小视频| 久久国产精品电影| 日本高清久久天堂| 中文字幕久久精品| 久久久久久久国产| 蜜臀久久99精品久久久久久宅男| 欧美贵妇videos办公室| 亚洲自拍中文字幕| 国产一区二区三区免费视频| 久久视频国产精品免费视频在线| 91亚洲午夜在线| 亚洲电影中文字幕| 97香蕉久久超级碰碰高清版| 亚洲国产精品一区二区久| 国产精品嫩草影院一区二区| 国产91成人video| 这里只有精品视频在线| 97涩涩爰在线观看亚洲| 亚洲自拍欧美色图| 亚洲欧美在线x视频| 亚洲国产精品yw在线观看| 欧美高清性猛交| 欧美精品激情视频| 国产亚洲视频在线观看| 亚洲第一av在线| 久久精彩免费视频| 97视频人免费观看| 久久精品国产91精品亚洲| 日本久久91av| 久久天堂av综合合色| 一本色道久久88综合亚洲精品ⅰ| 日韩av影片在线观看| 性欧美亚洲xxxx乳在线观看| 91网站免费看| 97在线视频免费观看| 日韩电影大片中文字幕| 欧美电影免费看| 伊人久久久久久久久久| 国产精品91在线观看| 中文字幕亚洲二区| 中文字幕亚洲自拍| 亚洲美女免费精品视频在线观看| 成人精品一区二区三区电影免费| 国产va免费精品高清在线观看| 疯狂欧美牲乱大交777| 亚洲视频一区二区| 久久精品国产成人| 91精品久久久久久久久久久久久久| 青草成人免费视频| 国产视频欧美视频| 国产亚洲精品综合一区91| 欧美最猛性xxxxx(亚洲精品)| 国产美女精品视频免费观看| 日韩成人黄色av| 欧美日韩精品在线播放| 国产亚洲欧美日韩精品| 国产精品视频一区二区三区四| 91精品国产91久久久久久不卡| 欧美久久精品一级黑人c片| 日韩av在线免费观看一区| 国产综合视频在线观看| 精品视频在线播放色网色视频| 国产精品久久久久久av下载红粉| 人人爽久久涩噜噜噜网站|