2012-08-10 25 views
1

我正在使用TDD進行練習,並且我已經完成了可以滿足測試的最簡單的實現。現在經過第二次和第三次測試後,我發現我可以將我的邏輯片斷提取爲依賴項。我應該如何處理現有的測試?我應該離開它們,並間接測試這種依賴性嗎?或者,我應該「重寫」我的測試,並在原始情況下使用存根/嘲split將它們分成幾塊?當我將代碼提取到依賴關係時,我應該重新組織我的測試嗎?

+0

該主題的[一本書](http://www.amazon.com/xUnit-Test-Patterns-Refactoring-Code/dp/0131495054?tag=duckduckgo-canonical-20)。 – 2012-08-10 10:41:23

回答

3

如果可以的話,我會離開您的原始測試,因爲它們的運行方式爲迴歸測試。即測試仍然有效,現在您已經重新編寫了原始代碼。

然後,您可以針對提取的功能編寫其他測試。在這一點上編寫更復雜的測試可能是有意義的,以便直接測試提取的功能,而不是通過您已識別/重構的集成層。

+0

所以我會提取類的一部分間接行使,另一部分直接測試,因爲我寫這些更復雜的測試,對吧?還是應該在這個新創建的測試課程中再次重複這些測試? – grafthez 2012-08-10 10:54:08

+0

我可能會將測試集中在提取的組件上,也許只是將其集成到更大的組件中。這種集成的複雜性將推動您的測試平衡 – 2012-08-10 12:55:01

+0

這裏的關鍵是「平衡」。現有的測試充當迴歸,並且作爲一個例子來說明如何使用具有實際依賴性的主題。但是,如果您發現現有測試會詳細說明依賴關係的實現細節,那麼測試變得太脆弱的可能性 - 儘可能多地刪除重複或尋找存根來緩解這種擔憂。 – bryanbcook 2012-08-10 19:40:23

1

我不認爲這是一個銀彈回答有。僅僅根據你的描述我會傾向於:

  1. 保留現有的測試,因爲他們現在
  2. 專門添加新的測試對所提取的依賴

如果你恰好終止複製測試代碼,您可能想要減輕,但重要的是要繼續測試「完全集成的功能」是否按預期工作。

0

提取到依賴關係可能是重構,因爲整體行爲保持不變,只能傳播給更多的類。重構是TDD循環中的第三步也是最後一步,並且在您的測試爲綠色之後發生,無需添加新測試。所以這是我會做的:

  • 從所有測試都是綠色的狀態開始。
  • 將行爲B從Class1提取到Class2。
  • 檢查破損的測試。如果沒有,那麼要麼你忘了測試B,要麼你的重構工具有超級大國。
  • 更正測試行爲B的單元測試,以便它在Class2而不是Class1上運行。
  • (可選)創建協作測試,驗證Class1是否正確對話到Class2,反之亦然。你可能想使用模擬和/或存根。
+0

我真的沒有在這裏得到第三個項目符號。如果我使用自動重構提取行爲,我只是更改內部,所以我的測試仍然應該通過,對嗎?經過這樣的提取後,我的測試變成了這種「協作測試」,因爲他們測試了與Class1和Class2的交互。如果仍然間接測試,我還應該爲行爲B編寫測試嗎? – grafthez 2012-08-13 07:57:58

+0

正如我所看到的,將B從Class1移動到Class2可能意味着對Class1中但Class2中不再可以找到的變量進行斷言。您的測試可能會中斷,或者在「最好的情況」下,自動重構將修改Class1中這些變量的獲取者,以便它們指向class2中的獲取者,這會使測試保持綠色,但很難看。此外,重構工具不會重命名您的單元測試,以反映Class2現在持有的行爲,這對您的測試的可讀性至關重要... – guillaume31 2012-08-13 11:59:22

+0

...通過「協作測試」我的意思是*單元測試*驗證被測試的類是否與其相關性正確對話。 * *單元測試*的有效性取決於只有一個代碼單元的正確性(在我們的例子中只有Class1),所以你不能針對你的依賴關係的實際執行測試,你必須存根或模擬依賴(等級2)。請參閱http://xunitpatterns.com/Test%20Stub.html和http://xunitpatterns.com/Mock%20Object.html – guillaume31 2012-08-13 12:04:05

相關問題