通常單元測試的單元,是程式中不可再分割的單元,通常是函數或類別的方法。最基本的進行方式是傳參數給函數/方法,然後檢查他的反應是否正確。傳入的參數除了正常的狀況,還要包括邊際條件。例如變數型別、長度等等問題有沒有處理等等。要用單元測試來保證程式可靠的話,另外要注意的是測試覆蓋率的問題。你的程式中有邏輯分支的地方,例如 if/then/else 或 switch/case 的話,你的測試條件至少要把所有的程式碼都執行到,最好是所有的路徑組合也能測試到。但是這只是理想,因為看程式的複雜度,路徑組合可能會太多,全部覆蓋的成本太高了。從另外一方面來看,其實一個單元內的邏輯分支太多,也會造成維護的困難,所以如果因為邏輯分支太多而難以覆蓋時,其實應該考慮把一些功能分出去,減少這個方法/函數的負擔。

如果要做 XP 的 TDD,會碰到另外一個問題,就是測試先行。在測試先行的時候,跟你的方法/函數互動的其他類別方法或函數可能也都還沒些出來,但是不用這些你也寫不出測試。這時候會先用一個假的來代替,叫做 stub。所以其實在設計階段,應該就確定有哪些協作的單元跟他的介面。你的 stub 類別/方法/函數會先模擬預設的行為,讓你可以做測試,等到這些協作的類別/方法/函數開發好後,再用真的來代替。不過這一部分比較屬於整合測試的範圍,但是同樣可以用 xUnit 的自動化單元測試來做。

另一個新的單元測試策略是使用 mock object。mock object 讓你可以透過它來模擬協作的類別,並且在過程中記錄狀態。用它可以減少一些做 stub 的功夫。目前 java上常用的 mock object 可以支援 reflection,所以可以傳 interface 給他就產生要用的 mock,蠻方便的。




一個單元(Unit)是指一個可獨立進行的工作,獨立進行指的是這個工作不受前一次或接下來的工作的結果影響,簡單的說,就是不與上下文(Context)發生關係。如果是在Java程式中,具體來說一個單元可以是指一個方法(Method),這個方法不依賴於前一次運行的結果,也不牽涉到後一次的運行結果。




創作者介紹

邱小新の工作筆記

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()