我正在使用TDD進行練習,並且我已經完成了可以滿足測試的最簡單的實現。現在經過第二次和第三次測試後,我發現我可以將我的邏輯片斷提取爲依賴項。我應該如何處理現有的測試?我應該離開它們,並間接測試這種依賴性嗎?或者,我應該「重寫」我的測試,並在原始情況下使用存根/嘲split將它們分成幾塊?當我將代碼提取到依賴關係時,我應該重新組織我的測試嗎?
回答
如果可以的話,我會離開您的原始測試,因爲它們的運行方式爲迴歸測試。即測試仍然有效,現在您已經重新編寫了原始代碼。
然後,您可以針對提取的功能編寫其他測試。在這一點上編寫更復雜的測試可能是有意義的,以便直接測試提取的功能,而不是通過您已識別/重構的集成層。
所以我會提取類的一部分間接行使,另一部分直接測試,因爲我寫這些更復雜的測試,對吧?還是應該在這個新創建的測試課程中再次重複這些測試? – grafthez 2012-08-10 10:54:08
我可能會將測試集中在提取的組件上,也許只是將其集成到更大的組件中。這種集成的複雜性將推動您的測試平衡 – 2012-08-10 12:55:01
這裏的關鍵是「平衡」。現有的測試充當迴歸,並且作爲一個例子來說明如何使用具有實際依賴性的主題。但是,如果您發現現有測試會詳細說明依賴關係的實現細節,那麼測試變得太脆弱的可能性 - 儘可能多地刪除重複或尋找存根來緩解這種擔憂。 – bryanbcook 2012-08-10 19:40:23
在refactor
階段Test Driven Development
,它可能是業務代碼或相應測試的重構。所以當你重構代碼時,你應該採取措施來重構測試用例,以使它們通過。
我不認爲這是一個銀彈回答有。僅僅根據你的描述我會傾向於:
- 保留現有的測試,因爲他們現在
- 專門添加新的測試對所提取的依賴
如果你恰好終止複製測試代碼,您可能想要減輕,但重要的是要繼續測試「完全集成的功能」是否按預期工作。
提取到依賴關係可能是重構,因爲整體行爲保持不變,只能傳播給更多的類。重構是TDD循環中的第三步也是最後一步,並且在您的測試爲綠色之後發生,無需添加新測試。所以這是我會做的:
- 從所有測試都是綠色的狀態開始。
- 將行爲B從Class1提取到Class2。
- 檢查破損的測試。如果沒有,那麼要麼你忘了測試B,要麼你的重構工具有超級大國。
- 更正測試行爲B的單元測試,以便它在Class2而不是Class1上運行。
- (可選)創建協作測試,驗證Class1是否正確對話到Class2,反之亦然。你可能想使用模擬和/或存根。
我真的沒有在這裏得到第三個項目符號。如果我使用自動重構提取行爲,我只是更改內部,所以我的測試仍然應該通過,對嗎?經過這樣的提取後,我的測試變成了這種「協作測試」,因爲他們測試了與Class1和Class2的交互。如果仍然間接測試,我還應該爲行爲B編寫測試嗎? – grafthez 2012-08-13 07:57:58
正如我所看到的,將B從Class1移動到Class2可能意味着對Class1中但Class2中不再可以找到的變量進行斷言。您的測試可能會中斷,或者在「最好的情況」下,自動重構將修改Class1中這些變量的獲取者,以便它們指向class2中的獲取者,這會使測試保持綠色,但很難看。此外,重構工具不會重命名您的單元測試,以反映Class2現在持有的行爲,這對您的測試的可讀性至關重要... – guillaume31 2012-08-13 11:59:22
...通過「協作測試」我的意思是*單元測試*驗證被測試的類是否與其相關性正確對話。 * *單元測試*的有效性取決於只有一個代碼單元的正確性(在我們的例子中只有Class1),所以你不能針對你的依賴關係的實際執行測試,你必須存根或模擬依賴(等級2)。請參閱http://xunitpatterns.com/Test%20Stub.html和http://xunitpatterns.com/Mock%20Object.html – guillaume31 2012-08-13 12:04:05
- 1. 單元測試時,我應該嘲笑所有的依賴嗎?
- 2. 我把代碼依賴關係
- 3. 我應該把我的依賴關係(JAR庫),而使用源代碼控制
- 4. 組織依賴關係
- 5. UML依賴關係 - 我應該在這裏使用它嗎?
- 6. 我應該如何組織我的Android uiautomator測試用例?
- 7. Unbungling我的依賴關係
- 8. 我有.NET依賴關係嗎?
- 9. 我可以獲取RequireJS依賴關係映射到的URL嗎?
- 10. 我應該評論我的測試嗎?
- 11. 代碼重新分解 - 我應該將代碼移到不同的方法嗎?
- 12. 我應該如何組織我的TCL代碼?
- 13. 我應該有多個AFHTTPClient來組織我的代碼
- 14. 我應該在哪裏將我的測試代碼與正在測試的代碼相關聯?
- 15. 我應該依賴會話嗎?
- 16. 我應該依賴注入嗎?我該怎麼做?
- 17. 我應該重構這段代碼嗎?
- 18. 我該如何測試嚴重依賴於GTest的MFC方法
- 19. 僅使用依賴關係重新測試重新編譯的測試?
- 20. PHPUnit測試依賴關係
- 21. Gradle測試依賴關係
- 22. 我如何找到Java依賴關係?
- 23. 我應該如何管理AngularJS中的依賴關係?
- 24. 我應該單元測試生成的Java代碼嗎?
- 25. C#組織我的代碼
- 26. 當我的應用程序需要助手類時,我該如何保持我的代碼組織?
- 27. 我應該向我的客戶注入「孩子」依賴嗎?
- 28. 我該如何「取消」繼承Maven依賴關係?
- 29. 組織項目依賴關係
- 30. 在eclipse中組織Maven依賴關係
該主題的[一本書](http://www.amazon.com/xUnit-Test-Patterns-Refactoring-Code/dp/0131495054?tag=duckduckgo-canonical-20)。 – 2012-08-10 10:41:23