測試味道(Test Smell)
Matin Fowler 在 refactoring 一書中, 提到若是你要進行 refactoring 時, 你需要先知道哪裡需要 refactoring. 要如何找出這些地方呢? 這時候你需要知道壞程式的味道(smell)是甚麼, 因此他列出了一堆 smell 讓大家知道.
同樣地, 測試程式也有類似的行為, 也會有匯壞味道. 在 xUnit Test Patterns一書中, 他列出了三種壞味道:
1. Code Smell
- Fowler 認為大部分的 smell 都是 code smell
- Code smell 會影響維護的成本, 並且他也是 behavior smell 的早期徵兆
- 在閱讀測試的程式碼時, 最常見的 smell 是 obscure test, 也就是很難說出測試要做甚麼, 不知道他的意向. 增加了維護時的困難.
- 另一個是 conditional test logic, 測試應該要很簡單, 應該要只是循序執行. 若是很多種執行路徑, 需要花更多心思來讓他運作成功
- Hard-to-Test Code也是個大問題, 因為寫測試程式的人無法很容易開發測試, 他需要花更多心力才能測是他所想要的流程
2. Behavior Semll
- Behavior test 是指在執行時, 會影響測試的結果
- 常見的 behavior test 是 fragile test, 也就是之前通過的測試, 因為某種原因失敗了. 常見的原因如下
* Inteface Sensitivity: 因 API 介面或是 GUI 介面改變, 導致測試程式失敗
* Hehavior Sensitivity: 因為受測程式改變運作行為, 導致測試程式失敗
* Data Sensitivity: 因為受測程式改變所使用的資料, 導致測試程式失敗
* Context Sensitivity: 因為受測程式在不同環境而有不同的行為, 導致測試程式失敗
- 另一種是 Assertion Roulete, 也就是沒有足夠的資訊來指出哪一個 assertion 失敗了, 所以要花很多時間才知道測試為什麼不成功.
- 還有一種是測試失拜時沒有明顯的原因. 因為測試程式或是受測程式也沒有修改, 可是測試還是失敗. 如果你試圖在執行一次, 可能會失敗, 也可能又成功. 可能原因如下:
* Interacting Test: 當測試程式之間有 shared fixture. 若是一個有錯, 可能會影響另一個的執行
* Test Run Wars: 有多個測試程式, 會同時使用shared fixrure. 會導致相互衝突
* Unrepeatable Tests: 每次執行結果可能不相同
- Frequent Debugging也是不好的現象. Unit test 應該不用 debugger 就能找出錯誤在哪裡, 若是常常需要 debugger 來幫忙就是有問題.
- Slow Test也是常見的現象, 當測試時間超過30 second, 會導致測試或是開發人員, 漸漸失去耐性去使用它
3. Project Smell
- Project smell 是指專案出現狀況時的徵兆
- 像是defect比預期多時, 經理會詢問為何automated test都沒有抓到. 或者build 編譯失敗的次數, 或是CI 失敗的次數變高, 這些都是出事前的徵兆
- Buggy tests也是另一個狀況, 當需要頻繁修改測試程式, 或是修改測試的時間很長, 這些會導致經理決定要停止自動化測試, 改用手動測試.
留言列表