Java程式的單元測試__Java

來源:互聯網
上載者:User
1.         單元測試的目的
一個單元測試從整個系統中單獨檢驗產品程式碼的『一個單元』並檢查其得到的結果是否是預期的。要測試的『一個單元』其大小是依據一組連貫的功能的大小及介於一個類別及一個包 (package) 之間實際上的變化 (varies) 。其目的是在整合程式碼到系統的其餘部分之前先測試以便找出程式碼中的臭蟲( bugs )。 Junit 等支援在 Java 程式碼中撰寫單元測試。
在整合之前於系統其它部分隔離起來抓蟲的理由是因為那是比較容易的找到臭蟲(亦即比較快且便宜)及比較容易修正問題(並顯示其解決方式是可行的)。
單元測試對於在初始整合一小部分程式碼以及整合其餘的改變之前提供了一些利益。如果有人需要變動現有的程式碼,事實上單元測試仍然可以讓他對於其最後的程式碼更有信心;即他的改變不會破壞任何東西。愈好的單元測試讓人愈有信心 -- 理想上測試必須在加入的新功能前也隨之更新。
2.         誰來撰寫單元測試及何時撰寫單元測試
程式碼測試可能是非常乏味的,尤其是測試別人的程式,而當你是一個程式設計師的時候尤甚。但程式設計師喜歡撰寫程式,因此為什麼不讓程式設計師撰寫一些程式可以作為測試之用呢。
當單元測試正確的實作可以協助程式設計師變的更有生產力,而同時提升開發程式碼的品質。有一點你必須瞭解的是單元測試應該是開發程式的一部份是很重要的;而且程式碼的設計必須是可以測試的。目前的趨勢是在撰寫程式碼之前要先撰寫單元測試,並且把焦點放在 Java 類別的介面及行為上。
先寫測試,再寫代碼的好處:
從技術上強制設計師先考慮一個類的功能,也就是這個類提供給外部的介面,而不至於太早陷入它的細節。這是物件導向提倡的一種設計原則。
好的測試其實就是一個好的文檔,這個類使用者往往可以通過查看這個類的測試代碼瞭解它的功能。特別的,如果你拿到別人的一個程式,對他寫測試是最好的瞭解這個程式的功能的方法。 xp 的原則是 make it simple ,不是很推薦另外寫文檔,因為項目在開發過程中往往處於變動中,如果在早期寫文檔,以後代碼變動後還得同步文檔,多了一個工作,而且由於項目時間緊往往文檔寫的不全或與代碼不一致,與其這樣,不如不寫。而如果在項目結束後再寫文檔,開發人員往往已經忘記當時寫代碼時的種種考慮,況且有下一個項目的壓力,管理員也不願意再為舊的項目寫文檔。導致以後維護的問題
沒有人能保證需求不變動,以往項目往往對需求的變動大為頭疼,害怕這個改動會帶來其它地方的錯誤。為此,除了設計好的結構以分割項目外(松耦合),但如果有了測試,並已經建立了一個好的測試架構,對於需求的變動,修改完代碼後,只要重新運行測試代碼,如果測試通過,也就保證了修改的成功,如果測試中出現錯誤,也會馬上發現錯在哪裡。修改相應的部分,再運行測試,直至測試完全通過。
軟體公司裡往往存在開發部門和測試部門之間的矛盾:由於開發與測試分為兩個部門,多了一層溝通的成本和時間,溝通往往會產生錯誤的發生。而且極易形成一個怪圈:開發人員為了趕任務,寫了爛爛的代碼,就把它扔給測試人員,然後寫其它的任務,測試當然是失敗的,又把代碼拿回去重寫,測試就成了一個很頭疼的問題。這種怪圈的根源是責任不清,根據 xp 中的規定:寫這個代碼的人必須為自己的代碼寫測試,而且只有測試通過,才算完成這個任務(這裡的測試包括所有的測試,如果測試時發現由於你的程式導致別的組的測試失敗,你有責任通知相關人員修改直至整合測試通過),這樣就可以避免這類問題的發生。
簡而言之,如果程式設計師要寫一段代碼:
先用 junit 寫測試,然後再寫代碼 ;
寫完代碼,運行測試,如果測試失敗,
修改代碼,運行測試,直到測試成功。
如果以後對程式進行修改,最佳化 ( refactoring ) ,只要再運行測試代碼。如果所有的測試都成功,則代碼修改完成。
3.         單元測試與 Java Team 開發的結合
Java 下的 team 開發,一般採用 cvs( 版本控制 ) + ant( 專案管理 ) + junit( 單元測試、整合測試 ) 的模式:
每天早上上班,每個開發人員從 cvs server 擷取一個整個項目的工作拷貝。
拿到自己的任務,先用 junit 寫今天的任務的測試代碼。
然後寫今天任務的代碼,運行測試(單元測試),直到測試通過。
任務完成在下班前一兩個小時,各個開發人員把任務提交到 cvs server 。
然後由主管對整個項目運行自動化的測試(整合測試),哪個測試出錯,就找相關人員修改,直到所有測試通過。下班。。。
4.         測試控制工具中要有甚麼。
無論誰來撰寫單元測試或何時撰寫單元測試,我們的焦點應該放在檢驗程式碼;主要是在於產生錯誤的風險。如果設計檔案包含被測試對象的使用情節;便可成為好的測試來源。不管如何,這些情節寫得不是很明確;因為這些情節實際上是以設計觀點所寫的 -- 因此適當的測試應該有對等的情節,換句話說,也就是測試設計應該儘可能的包含使用者實際使用程式時可能產生的動作或者過程。
另一個測試案例好的來源是在整合後從產品程式碼當中找到的問題,維修問題的處理方式往往值得封裝成為測試案例。
5.         為什麼要使用 Junit 等工具呢。
前面的論述說明為什麼我們需要測試控制工具,但為什麼我們使用 Junit 這些工具呢 ?
首先,它們是完全 Free 的啦。。
第二點,使用方便。
         在你提升程式碼的品質時 JUnit 測試仍允許你更快速的撰寫程式 l
那聽起來似乎不是很直覺,但那是事實。當你使用 JUnit 撰寫測試,你將花更少的時間除蟲,同時對你程式碼的改變更 俱有信心。這個信心讓你更積極重整程式碼並增加新的功能。沒有測試,對於重整及增加新功能你會變得沒有信心;因為你不知道有甚麼東西會破壞產出的結果。採用一個綜合的測試系列,你可以在改變程式碼之後快速的執行多個測試並對於你的變動並未破壞任何東西感到有信心。在執行測試時如果發現臭蟲,原始碼仍然清楚的在你腦中,因此很容易找到臭蟲。在 JUnit 中撰寫的測試協助你以一種極 大 (extreme) 的步伐撰寫程式及快速的找出缺點。
        JUnit 非常簡單 l
撰寫測試應該很簡單 -- 這是重點。如果撰寫測試太複雜或太耗時間,便無法要求程式設計師撰寫測試。使用 JUnit 你可以快速的撰寫測試並檢測你的程式碼並逐 步隨著程式碼的成長增加測試。只要你寫了一些測試,你想要快速並頻繁的執行測試而不至於中斷建立設計及開發程式。使用 JUnit 執行測試就像編譯你的程式碼那麼容易。事實上,你應該執行編譯時間也執行測試。編譯是檢測程式碼的文法而測試是檢查程式碼的完整性 (integrity) 。
        JUnit 測試檢驗其結果並提供立即的回饋。 l
如果你是以人工比對測試的期望與實際結果那麼測試是很不好玩的,而且讓你的速度慢下來。 JUnit 測試可以自動執行並且檢查他們自己的結果。當你執行測試,你獲得簡單且立即的回饋; 比如測試是通過或失敗。而不再需要人工檢查測試結果的報告。
        JUnit 測試可以合成一個測試系列的層級架構。 l
JUnit 可以把測試組織成測試系列;這個測試系列可以包含其它的測試或測試系列。 JUnit 測試的合成行為允許你組合多個測試並自動的迴歸 (regression) 從頭到尾測試整個測試系列。你也可以執行測試系列層級架構中任何一層的測試。
         撰寫 JUnit 測試所費不多。 l
使用 Junit 測試架構,你可以很便宜的撰寫測試並享受由測試架構所提供的信心。撰寫一個測試就像寫一個方法一樣簡單;測試是檢驗要測試的程式碼並定義期望的結果。這個測試架構提供自動執行測試的背景;這個背景並成為其它測試集合的一部份。在測試少量的投資將持續讓你從時間及品質中獲得回收。
        JUnit 測試提升軟體的穩定性。 l
你寫的測試愈少;你的程式碼變的愈不穩定。測試使得軟體穩定並逐步累積信心;因為任何變動不會造成漣漪效應而漫及整個軟體。測試可以形成軟體的完整結構的膠結。
        JUnit 測試是開發人員測試。 l
JUnit 測試是高度地區性 (localized) 測試;用以改善開發人員的生產力及程式碼品質。不像功能測試 (function test) 視系統為一個黑箱以確認軟體整體的工作性為主,單元測試是由內而外測試系統基礎的建構區塊。開發人員撰寫並擁有 JUnit 測試。每當一個開發反覆 (iteration) 完成,這個測試便包裹成為交付軟體的一部份 提供一種溝通的方式,「這是我交付的軟體並且是通過測試的。」
        JUnit 測試是以 Java 寫成的。 l
使用 Java 測試 Java 軟體形成一個介於測試及程式碼間的無縫 (seamless) 邊界。在測試的控制下測試變成整個軟體的擴充同時程式碼可以被重整。 Java 編譯器的單元測試靜態語法檢查可已協助測試程式並且確認遵守軟體介面的約定。
一段測試的程式碼無法單獨的執行,它需要是執行環境的一部份。同時,它需要自動執行的單元測試 -- 譬如在系統中周期性的執行所有的測試以證明沒有任何東西被破壞。由於單元測試需要符合特定的準則:一個成功的測試不應該是人工檢查的(那可要到天荒地老了啊),一個未通過測試的失敗應可以產出檔案以供診斷修改。而 Junit 可以提供給我們這些便利 . 。這樣所有測試開發人員所需撰寫的只是測試碼本身了。跟 optimizeit 、 Jtest 那些昂貴而又超級麻煩的 tool 比較起來,其利昭然可見。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.