March 17 09:45~10:36
你修改了待測程式,但你認為此次修改不會影響測試案例的執行結果,可是測試案例卻無法編譯或是執行失敗。如果發生這種狀況,你的測試案例就有了Fragile Test(脆弱的測試)這個壞味道。
這又是一個令人頭大的壞味道。明明修改的程式碼應該不會影響到已經存在的測試案例,為什麼原本可以執行的測試案例居然會執行失敗,甚至無法編譯?!
***
《xUnit Test Patterns: Refactoring Test Code》書中提到導致這個壞味道的情況有好幾個:
- Interface Sensitivity
- Behavior Sensitivity
- Data Sensitivity
- Context Sensitivity
以上四點請參考〈脆弱的測試案例〉這一篇的說明。
- Overspecified Software:過度規範的軟體是Behavior Sensitivity的一個特例,通常肇因於使用mock object技術來指定待測軟體要如何做某件事(how to do),而不是指定該做什麼(what to do)。因為測試案例透過mock object技術規範待測程式內部的互動關係(實作方式),所以一但待測程式的實做修改,即使它的外部行為沒有改變,這個測試案例也可能因此而執行失敗。
- Sensitive Equality:將物件轉成字串來比對,一但物件內部資料改變,雖然行為沒有改變但原本的比對結果就會失敗。
- Fragile Fixture:好幾個測試案例共用一個fixture,當新的測試案例加入之後,你修改這個共用的fixture來滿足新的測試案例,但是原本可執行的測試案例卻因此無法正常執行。這種情況算是Data Sensitivity或是Context Sensitivity的特例。
***
脆弱的測試會讓開發人員很煩躁,並且開始懷疑到底是production code寫錯,還是test code寫錯?!最終降低撰寫測試案例的意願。這是一個很常見的測試壞味道,如果沒有加以留意,早晚會破壞你希苦建立起來的測試安全網。
***
友藏內心獨白:後台不夠硬就麻煩啦。
沒有留言:
張貼留言