March 09 16:32~17:45
睡著的時候最乖(只要不執行程式,就不怕有bug了啊 XD)。
有按時收看〈搞笑談軟工〉的鄉民們對於Erratic Test(不穩定的測試)這個壞味道應該不陌生,因為Teddy之前有好幾篇文章介紹過這個主題:
- 〈對付時好時壞的測試案例(1):還沒痊癒,就先隔離〉
- 〈對付時好時壞的測試案例(2):Lack of Isolation〉
- 〈對付時好時壞的測試案例(3):Asynchronous Behavior〉
- 〈對付時好時壞的測試案例(4):Remote Services〉
- 〈對付時好時壞的測試案例(5):Time〉
- 〈對付時好時壞的測試案例(6):Resource Leaks〉
這是一個非常討人厭且令人頭大的壞味道。在沒有對程式碼做任何修改的情況下,測試案例有時候正常可以正常執行,有時候又會執行失敗。為什麼會這樣勒?!
***
《xUnit Test Patterns: Refactoring Test Code》書中提到導致這個壞味道的情況有好幾個:
- Interacting Tests:測試案例依賴其他測試案例,因為所相依的測試案例失敗導致自己執行失敗。具體例子可參考〈對付時好時壞的測試案例(2):Lack of Isolation〉。
- Interacting Test Suites:這是Interacting Tests的一種特別案例,測試案例在自己的測試組(test suite)中可以正常執行,但是如果好幾個test suite放在一起直行則會時好時壞。
- Lonely Test:這也是Interacting Tests的一種特別案例。執行整個test suite,所有測試案例會通過。但是單獨執行test suite裡面的某個測試案例則會失敗。這種單獨執行會失敗的測試案例就叫做Lonely Test。
- Resource Leakage:資源洩漏也會造成測試案例時好時壞,具體例子可參考〈對付時好時壞的測試案例(6):Resource Leaks〉。
- Resource Optimism:測試案例所依賴的外部資源並不是很穩定,具體例子可參考〈對付時好時壞的測試案例(4):Remote Services〉。
- Unrepeatable Test:測試案例第一次的行為和之後的行為不一樣,所以跑了一次就不能跑了(只有第一次成功)。或是第一次會失敗,但之後的執行都會成功。這種情況通常是共用測試資料所引起的問題。
- Test Run War:好幾個人同時都在執行測試案例,這種情況很容易導致測試狀態錯誤,造成測試案例時好時壞。
- Nondeterministic Test:測試案例本身行為無法預期,嚴格講起來上述幾個原因都會造成測無法預期的測試案例。其他的情況包含每次執行測試案例的時候都會得到不同的回傳值,例如產生唯一的鍵值(unique key)。另外,在程式中使用條件判斷式也會造成這個問題。
***
不穩定的測試會導致開發人員對測試案例失去信心,最終可能造成根本沒人想寫測試案例。這是一個非常糟糕的測試壞味道,一旦發現勢必要立即排除。如果一時無法排除也要加以隔離(請參考〈對付時好時壞的測試案例(1):還沒痊癒,就先隔離〉),以免影響其他身體健康的測試案例。
***
友藏內心獨白:這個等級的壞味道應該算bug了吧!
沒有留言:
張貼留言