2014-04-25 144 views
8

假設我正在使用TDD創建一些類A.完成並有一個「綠色」欄後,我決定只用靜態方法從類A中提取某些類B使用一些重構工具。我現在有A類和B類都完全單元測試,但只能通過類A的測試類。我現在是否應該創建一個特定於B類功能的測試類,即使這會重複測試?通過其他測試類的單元測試類

+1

重複爲:http://stackoverflow.com/questions/21482602/should-i-write-tests-for-class-a-if-its-covered-from-class-b/21482748#21482748 – Mik378

+0

尼斯找到,謝謝 – jordan

回答

12

一如往常,這取決於你的背景。你在乎什麼?

整體行爲

如果你正在構建一個系統內部使用,甚至是公共的(網絡)服務,在那裏你運送軟件是整個系統,您不必太關心一個班級。 如果您正在構建系統,則測試系統。

只要它包含在測試中,就知道您的系統運行正常。但是,您可能會遇到幾個月後意識到您不再需要原始A類的情況,因此您需要刪除它並進行相應的單元測試。這可能會導致B的測試覆蓋率下降,因此,密切關注代碼覆蓋率趨勢可能是個好主意。

單位行爲

如果你正在構建一個(類)庫,或框架,你出貨的每個公共類作爲產品的一部分。如果您的圖書館有多個用戶,則需要開始考慮如何避免發生重大變化。

避免重大更改的最有效方法之一是通過單元測試覆蓋每個類。只要你don't change the tests,你知道,如果所有的測試都是綠色的,那麼重大更改是不太可能的。但是,這要求您測試所有公開課程和成員。

因此,如果您將B提取到公共類中,現在它已成爲其他消費者可能依賴的類,並且如果您更改了它,那將是一次重大更改。因此,你應該用新的測試來覆蓋它。 如果您正在構建一個單元,然後測試該單元。

+0

我除了Marks的答案我想補充說創建這樣一個類作爲B是一種代碼味道給我。這當然不一定是這樣,但有可能它的目的不明確,可能違反了固體原則。如果你發現自己在命名課程時遇到了問題,那很可能是這種情況。 – spacedoom

+0

@spacedoom這是不是有點苛刻?從另一個類中提取一個類可能是一個完全有效的重構。在這種情況下它是靜態的可能是一種代碼異味,但由於我知道你是F#粉絲,所以靜態類可能只是一個等待實現的功能模塊。然而,SOLID它不是,我同意:) –

+1

我當然不打算苛刻,只是給一個oop標記的問題提供和麪向對象的評論。我沒有選擇一般的提取類,只是像B這樣的類。我非常確定它的名字將會是lika AHelper,我們不想那樣做,是嗎? 無論如何,你是該死的吧,如果它被寫成F#中的功能模塊會更好! :) – spacedoom

0

從你所描述的答案是創建另一個新的測試。如果你(或其他不熟悉「共享測試」的人)更改了其他類,則不再進行測試。

如果這似乎浪費,把公共測試代碼中第三類......