2011-09-23 35 views
6

可能重複:
Is Unit Testing worth the effort?聽起來很愚蠢,但是單元測試對真實有用嗎?

好吧,我知道什麼是單元測試的目的一般來說,但是我發現有些事情困擾着我。

1) 測試的目的是早期發現錯誤。因此,在後面的一些迭代中,如果我在代碼中做了一些更改,自動化測試必須警告我並告訴我,我已經搞砸了一些早已被遺忘的軟件。

但是,說我有A類和說,與其他一些類的實例進行交互,稱之爲B類

當一個A類編寫單元測試,他嘲笑B類 所以,在未來的某些時候,如果在B類中做了一些改變,並且導致了一些錯誤,那麼它們只會反映在B類的單元測試中,而不是A中的(因爲A的測試不使用真正的B類,而是模擬具有固定的輸入和輸出)。 所以,我看不到單元測試怎麼能儘早通知一個人不知道的bug?我意識到我正在改變的課程中可能存在的錯誤,我不需要進行單元測試,我需要測試來警告我所做的更改的後果,從而導致某些「被遺忘」類中的錯誤,而這不是單元測試是可能的。或者我錯了?

2) 在編寫模擬和正確的調用方法,期望調用方法,輸入和返回值時,必須知道待測類將如何實現。 我認爲這與測試驅動開發相矛盾。在TDD中,首先寫測試,然後在他們的驅動下寫一個代碼。 但是我不能寫出正確的期望值(一般的測試),除非我編寫需要測試的代碼。這與TDD相矛盾,對吧?

如果我使用真實物體而不是模擬物,這兩個問題都可以解決。但那不是單元測試,對吧?在單元測試中,待測類必須與系統的其他部分隔離開來,而不是使用真正的類,而是使用mock。

我確定我錯了某處,但我找不到在哪裏。我一直在閱讀和閱讀,而我無法找到我理解錯誤的地方。

+1

相關:http://stackoverflow.com/questions/286587/are-you-really-using-unit-tests – Thilo

回答

4

嚴格地說,你花更多的時間編寫單元測試,而不是專注於實際的代碼。

您無法實現100%的代碼覆蓋率。我單元測試我的應用程序,但我覺得它不值得。但並非所有人都同意這一點。

如果您更改了一段代碼,您的單元測試失敗並找出其失敗的原因,但對我來說它不值得。

我是單元測試的不是大風扇......你嘲笑一切,但嘲諷的是艱鉅的任務..........

但現在是一個天公司正試圖爲TDD方式。

+0

是的,「如果你改變了一段代碼,你的單元測試失敗並找出它失敗的原因「,但如果你嘲笑一切,當我改變某種方法時,只有該方法的測試可能會失敗,沒有別的。 我說的是單元測試,而不是一般測試。 如果我嘲笑一切,然後在一個類的變化不會有其他類測試的結果。據我所知,如果我不嘲笑一切,那麼這不是單元測試。 – SadClown

+0

@sadClown這不是模擬對象,afaik的想法。模擬對象用於表示例如http請求。您不測試模擬對象,它們在您的測試中使用並傳遞給您正在測試的代碼。 – NimChimpsky

3

簡單的回答:是的,它們對真實有用。

TDD很好,理論上都很好,但我幾乎沒見過在實踐中看到過它。不過,單元測試並不侷限於TDD。您可以隨時編寫代碼的單元測試,以確保它在更改後仍能正常工作。單元測試的這種用法爲我節省了無數個小時的錯誤修復,因爲測試立即指出哪裏出了問題。

我傾向於避免嘲笑。在大多數情況下,我認爲它們不值得。不使用模擬可能會使我的單元測試更多地集成測試,但它可以完成工作。爲了確保你的課程按照設計工作。

+0

你在代碼中使用什麼方法來模擬對象?有沒有簡單的嘲諷魔法可以嘲弄對象?或者你根本沒有在你的代碼中使用對象? –

4

我剛剛首次實現了TDD和單元測試。我認爲它很棒,而且我從未在連續的集成環境中使用它,我認爲它更有價值。

我的過程:

  1. 創建類,其中商業邏輯會去的骨架(無論是 serivce層,或域對象等)。
  2. 編寫測試,並定義 方法名稱和測試所需functionaility - 然後提示我 IDE編寫的骨架方法(小,但不錯的加)
  3. 然後編寫正在測試的實際類的方法。
  4. 運行測試,調試。

我現在不用編寫代碼就可以不先編寫測試,它確實有助於開發。您可以立即發現錯誤,它確實可以幫助您以結構簡單的方式在思維上訂購代碼和開發。當然,任何破壞現有功能的代碼都會被直接捕獲。我不需要使用模擬對象(使用spring,我可以直接調用服務層和控制器方法)。

1

0)不,它沒有。聽起來很愚蠢,我的意思是。這是一個完全有效的問題。

令人遺憾的是,我們的產業充斥着銀子彈和蛇油,如果某件事情沒有意義,那麼你是正確的。任何技術,對任何工程部分的任何方法都只適用於某些情況。通常情況下,這些通常很少被記錄下來,所以這一切都傾向於變成毫無意義的我的方法 - 比你的論點更好。

我已經在單元測試中取得了成功和失敗,並且根據我的經驗,如果正確應用,它確實非常有用。

當你從事大規模的從頭開發工作時,這不是一個好技術,因爲一切都在變化得太快,單元測試不能跟上。在維護階段,這是一種很好的技術,因爲你正在改變一個更大整體的一小部分,這仍然需要按照預期的方式工作。

對我來說,單元測試不是關於測試驅動開發,而是逐個設計:單元測試檢查接口是否被違反。由此可以很容易地看出,同一個人不應該編寫單元和相應的單元測試,因此對於非常小規模的東西,比如我自己的寵物項目,我從不使用它。在大型項目中,我提倡它 - 但只有在採用合同設計的情況下,項目才能將接口規範視爲重要的人工製品。

作爲技術的單元測試對單元尺寸也很敏感。不一定是一個班級可以自行測試,並且根據我的經驗,班級通常對於單元測試來說太小了。你不想測試一個類本身,你想測試一個功能單元。單獨部署(可安裝)的二進制文件,例如JAR或DLL,在我的書中成爲更好的候選者,如果你使用Java風格的語言則成爲包。

1

單元測試本身並不傻,這取決於你的項目。

我覺得單元測試是好的,不僅在TDD的發展,而且在任何類型的項目。對我來說真正的專業人士是,如果你用單元測試把重要的代碼包裝到你的項目中,有一種方法可以知道你的意思是否還在工作。

對我來說,真正的問題是,如果有人是搞亂你的代碼,應該有他的方式/她知道如果測試仍然succedding,但不是讓他們手動運行。例如,讓我們以Eclipse + Java + Maven爲例。如果您在Maven Java項目上使用單元測試,每次構建它時,測試都會自動運行。所以,如果有人弄糟了你的代碼,下一次他構建它時,他會得到一個「BUILD FAILED」控制檯錯誤,指出一些單元測試失敗。

所以我的觀點是:單元測試很好,但是人們應該知道他們在每次更改代碼時都沒有運行測試就搞砸了。

相關問題