廢話不多說,繼續介紹剩下幾個屬於Control and Observer System State這個分類的提升可測試性方法。
Localize State Storage
要測試待測程式就必須要先啟動它(廢話)並且將它設定在某個已知的狀態中。如果待測程式的狀態都儲存在一個集中的地方,那麼測試起來就方便許多。例如,假設鄉民們要測試一個如下圖所示的保全監控系統Server模組,確認當遠端監控裝置發生問題的時候,Server可以正確地回報這個問題。要執行這個測試,當啟動Server的時候,需要預先載入多個受監控裝置。如果這些受監控裝置可以存放在一個設定檔案或是資料庫中,一次由Server載入,便可以簡化測試。反之,如果這些受監控裝置設定資料分散存放在多個遠端電腦,那麼要測試Server的手續就變得複雜很多。
***
Abstract Data Sources如果待測程式所需要的資料可以被抽象化,則可提高可測試性。例如,如果待測程式需要存取資料庫,透過JDBC介面來存取資料庫,(理論上)便可在不改變待測程式的情況下,在測試的時候切換成不同的資料庫以簡化或加速測試(例如用HSQL這種in-memory database來加速測試)。
***
Sandbox如果系統可以被放在一個與真實世界隔離的地方進行測試,則可以提高可測試性。在執行測試的時候測試結果通常不具備永久性,也就是說測試執行完畢之後要把測試環境還原,以便下次可以繼續使用。
虛擬化資源是一種常見的建構沙箱形式,例如,如果在虛擬機器中執行測試,則可以很簡單恢復測試環境的狀態。其他像是stub、mock、fake、dependency injection的方法,也都可以視為是某種形式的虛擬化。
***
Executable Assertion在程式中撰寫assertion也可以提升可測試性。這裡所說的executable assertion就是Design By Contract所說的contract(在程式語言中以assertion的形式存在),包含pre-condition、post-condition、class invariant。Java語言雖然沒有支援Design By Contract,但在JDK 1.5之後,多了一個assert關鍵字,也算是一種executable assertion。另外,有用過VC++的鄉民們,也可以在微軟的MFC類別庫中看到很多assert的函數呼叫敘述。
關於Design By Contract的簡單說明可參考《敏捷式例外處理設計 (8):這是你的問題,不是我的問題》與《過勞死之軟工無用論》。要了解完整的Design By Contract請讀《Object-Oriented Software Construction, 2nd》這本書。如果鄉民們覺得自己實在是太強了,可進一步閱讀下面這兩篇論文:《ezContract: Using Marker Library and Bytecode Instrumentation to Support Design by Contract in Java》與《Contract Specification in Java: Classification, Characterization, and a New Marker Method》。
***
友藏內心獨白:Stub與mock object也是一種虛擬化啊。
沒有留言:
張貼留言