定義
我認爲在進行此討論之前定義您的術語很重要。
單元測試單獨測試一個單元。對我來說,這是一堂課。單元測試將創建一個對象,調用一個方法並檢查結果。它回答了這個問題:「我的代碼是否按照我的意圖去做?」
集成測試測試系統中兩個組件的組合。它側重於組件之間的關係,而不是組件本身。它回答了「這些組件是否按預期一起工作」的問題。
系統測試測試整個軟件系統。它回答了這個問題:「這個軟件是否按照預期工作?」
驗收測試是一個自動化的方式,讓客戶回答「我想這個軟件是我想要的嗎?」這個問題。這是一種系統測試。
請注意,這些測試都不能回答「這個軟件有用嗎?」這樣的問題。或者「這個軟件容易使用?」。
所有的自動化測試都受限於公理「端到端比你想象的要進一步」「 - 人類最終必須坐在電腦前,看看你的用戶界面。
比較
單元測試是更快,更容易編寫,運行更快,更容易診斷。它們不依賴於像文件系統或數據庫這樣的「外部」元素,因此它們更簡單/更快/更可靠。大多數單元測試在重構時繼續工作(並且良好的單元測試是安全重構的唯一方法)。他們絕對要求你的代碼是decoupled,這很難,除非你先寫測試。這些因素的結合使得TDD的紅/綠/重構序列工作得很好。
系統測試很難寫,因爲他們必須經過這麼多的設置才能達到想要測試的特定情況。它們很脆弱,因爲之前軟件行爲的任何變化都會影響到您想要測試的情況,即使這種行爲與測試無關。出於類似的原因,它們比單元測試慢得多。故障診斷可能非常困難,因爲故障可能需要很長時間才能完成,而且故障涉及的軟件太多。在某些軟件中,系統測試非常難以自動化。集成測試處於兩者之間:它們比系統測試更易於編寫,運行和診斷,但覆蓋範圍比單元測試更廣。
推薦
使用測試策略的組合來平衡每個的成本和值。
如果「經驗告訴單元測試有助於確保功能並在開發週期的早期發現錯誤」。爲什麼你要「傾倒單元測試並進行集成測試」? – 2009-02-17 15:43:07
「只是爲了表達一點」。舊時間練習一直是爲了完成測試工作。經驗表明,如果您早期進行測試(並且迭代地),則有一些優勢,例如儘早發現錯誤。現在,如果我傾銷單元測試進行集成測試,那麼我會失去這種優勢,但我的項目仍然存在。 – Sesh 2009-02-17 15:59:54