2014-09-03 49 views
2

TDDre-factor階段可以將多個現有測試分爲一次。例如,要更改類的構造函數並且必須修改使用該類的測試。TDD /單元測試 - 確定打破現有測試

測試聲明測試代碼的behaviour,但測試arrange/act的實現實際上是測試代碼本身。

我想避免多個測試打破單元測試應該儘可能幹,這意味着如果構造函數更改(如果可能)應該需要單個更新。

回答

4

理想情況下,您應該嘗試將測試的設置代碼保存在一個常見的位置,以便所有測試都可以請求某個類型的實例從「權威來源」進行測試。因此,第一步是重構測試以從共享助手方法獲取實例,而不是自行調用new

然後,您可以重構構造函數以獲取更多參數。現在,你有一個地方可以修復。

我經常打電話給這個幫手TestDataFactory。它知道一些關於對象模型的知識,所以你可以問它一個Foo的實例,它會在大多數字段中返回一個包含大量有用測試數據的實例。

+0

儘管我大多數人都同意@Aaron,但我不會一次打破多個測試。最重要的是你可以徹底地測試你的代碼。事實上,建議我也有一個地方來改變代碼中斷,但有時會增加不必要的複雜性。 – 2014-09-03 13:55:31

0

這種情況一直髮生在我身上,帶有構造函數或任何在多個地方被調用的東西。我不認爲這是一個大問題,我通常只是糾正任何意外失敗的測試,然後繼續進行我的測試。

有些人已經考慮過避免這種情況的技術,在不希望在非編譯狀態下花費數小時的情況下運行重構。例如,見Joshua Kerievsky創造的"Limited Red"的概念。

0

由於@Arron已經表明,第一步是重新提前重新分解代碼,並使用您將要測試的方法實例化對象以實例化工廠方法。

例如

var sut = CreateSUT(); 
var result = sut.MethodUderTest(); 
Assert.IsTrue(result); 

對於更復雜的對象,你可能要考慮使用類似的測試數據生成器模式的模式。這blog很好地描述了模式。

0

我對上面提到的大部分內容都讚不絕口,但我通常會做一些改變。我不喜歡打破我目前正在研究的範圍之外的測試。然而,我也不想限制基於一些不合理的「代碼行政恐懼」(我認爲像這樣的精神問題會產生更大的質量問題)來重構我的重構。

所以我通常做的是,我添加新的代碼與新的行爲,保持舊的一小段時間(不贊成它),只是足夠長的新功能穩定。然後,我在同一時間內全部處理所有其他測試,確保您只修復此問題。

在C#中(作爲例子)帶有默認值的可選參數可以真正幫助我,但除此之外,我只是重載或創建新的ctor/methods。

這樣做會讓我更專注於手頭的任務(測試),但更重要的是,它還使我在重構時保持無情。這種重構感覺更自然,破壞性更小。

我真的不適用於單元測試的一個主體是DRY。我不會推薦任何人將這種想法帶到測試世界。 DRY傾向於創建難以遵循的測試用例。我寧願在測試中使用很多代碼,但很容易遵循,而不是DRY。