在之前的範例中,我們使用了stub和mock,但是在unit test中不能無限的使用,這樣會造成無法輕易的了解測試的內容,以及發生的原因。
書本的作者建議:一個測試中最好只有一個mock,而stub可以多個。
為什麼要這樣配置呢?
如果在一個測試中有多個mock,表示我們在這個測試中要測試多個不同的事情,這樣會導致該測試功能變得很複雜,當發生測試失敗的時候,我們無法輕易的鎖定錯誤是在哪個部分,如果太大的話,那跟使用try...catch
包住一大片程式碼,是一樣的。Unit test有個目的,是讓程式開發者可以快速的開發並且測試自己的程式碼,當我們無法快速的unit test的結果鎖定原因,還要去猜測那是要測試什麼,哪邊發生問題,那跟沒有引入unit test沒有什麼差別。說不定還花很多時間在寫程式呢!畢竟unit test的撰寫,也要花些精神。所以就單純點,一個mock,其他都是stub的虛擬對象。注意不要對stub進行assert,專注在自己要測試的對象,而不是其他項目,如果每個stub都做assert,這樣就沒有測試的意義。
還要當心的是,當斷言(assert)太多的時候,沒有操作適當,會只跑出第一個錯誤,後面的就不會執行,所以要注意此現象。
當然當測試程式沒有必要的參數不用使用stub,避免造成過度指定(overspecification),會增加程式的複雜度以及難以閱讀。
所以使用stub和mock注意assert太多時,要檢查測試項目是否都完成,並且避免使用不必要的stub,之後最重要的是「一個測試中只有一個mock」!
這邊順道說明:目前都是使用土法煉鋼的模式,自行撰寫unit test,那有沒有更好用的工具呢?這是有的,之後的文章就會探討這一塊。畢竟現實面的程式,可能會參數很多,方法、屬性也一堆,這樣編寫stub和mock的話可能會寫到看見明天的太陽;或是會要撰寫很多assert;有很多interface需要去實現等等。這些作業都是必要的,但是卻很繁瑣,所以就有人開發unit test的framework。這個部分之後就會討論。