偷偷的推廣一下 單元測試 ( Unit Test)
先看一個範例
簡單的 Panel 的 Unit Test 範例
其中 我有故意讓一項出錯 !
來證實 unit test 是有用的~~
單元測試 對我來說 就是用 程式來說話 !
利用 "測試程式" 來告訴下一位 維護者 使用者 測試者 繼承者 !
這個程式
有什麼限制 ?
正常狀況會是怎樣 ?
異常狀況會是怎樣 ?
邊界情況會是怎樣 ?
簡單的講 看完了 "測試程式" 就知道這個 該怎樣使用!
或是有甚麼不能用的 ! 錯誤時會拋出哪種錯誤 ! 有哪些特別的地方!
或是更簡單一點的!
某人 修改這個 程式 之後 ! 是不是會造成一些問題 ?
那只要跑一次測試程式 ! 就可以看到 是不是和預期一樣 !
如果發生了以前沒發的問題 !
可以先寫測試程式 保證問題的重現 !
然後 在修正程式 跑測試程式 看會不會 出現問題 !
不管是舊的測試也好 新的測試也好 ! 都可以一次驗證!
如今我將 UI 方面的測試也整合進 JenKins 中了~~(下圖就是跑最上面的範例的喔!)
證明了就算 setTimeout 等等 對 UI 的模擬測試 !
也是可以在 JenKins 中跑的 !
下面是我對上面的範例的一些說明!
簡單的講這個面板分成兩個部分!
一個是 面板的控制 (Mediator)
一個是 面板 UI 的動作 (MyPanel)
為了 UI 可以抽換 控制效果不會改變 ! (按下按鈕後 是否鎖定不能連按....等等的部分)
所以我將 UI 的部分 完整隔離在 Mediator 的外部!
也為了可以分開測試 !
一開始初始化面板的部分如下
所以測試的函式也分成兩個!
一個測試 控制 邏輯
一個測試面板的動作控制
下面就是 控制邏輯 的測試類別~
啟動和清除
在測試程式中 啟動時 可以灌入專門 的 虛擬面板,
用來測試 監聽 邏輯控制有沒有按照我希望的運行
測試結束後 把面板 虛擬面板 一些相關的測試函數 通通清除
這邊可以看到部分的 操作控制! 因為 testPanel 是我自己做出來測試 控制邏輯的
所以我很清楚 也開出API 可以取的裡面的物件 等等等的東西
好用來做監聽 測試 !
下面是對 虛擬面板 連續發送滑鼠事件 來測試 是否可以連續點擊
另外一個 ReDo 的部分 就是測試是否 可以隔一段時間後 再作 點擊動作!
但是在期間內 卻 無法作 "點擊動作" 的測試 !
那這是測試 500 毫秒邊界的測試 !
這個 500 毫秒也就是特殊商業邏輯 特殊控制 等等等的部分!
那只要看了這個 邊界測試 就知道 500 毫秒內 這個控制邏輯 是不接受 任何點擊動作的
一定要等 500 毫秒後 才接受控制! (雖然這個可以在 UI 層面作掉, 但是我還是整合進去測試)
下面來看 UI 面板的測試!
因為是 被控制的面板 ! 所以不需要依賴 控制邏輯
也不必知道 或是 了解是否有控制單元的存在
所以不用 制作出 虛擬控制單元 來進行測試 !
這一點 和 剛剛的 控制邏輯的是不一樣的
因為控制邏輯 依賴有一個 被控制的面板 才能運行~
下面是用來測試是否可以鎖住面板的測試
因為 MyPanel 是這樣寫的 所以會有問題 (我故意留下 讓測試會出錯的部分!)
因為就算是 按鈕 enabled 被關閉了 但是監聽還在的話 對這個按鈕直接丟事件!
還是會被聽到的, 但是實際上 Button 這個 元件 再 enabled 是 false 的情況下
手動去按是不會丟出"點擊"等相關事件的 ( 這個也是測試 和實務上的不同 ! )
但是! 我在 邏輯控制的時候 的虛擬面板 確是可以運行請看下面的 虛擬面板 類別
控制邏輯 的測試程式 使用的 虛擬面板 的部分
確是有完整的 移除監聽 所以在邏輯測試時 虛擬面板 不會出錯 !
下面是 面板的 文字容納量的測試!
這個讓我們知道 這個 UI 在文字是 12345678912 得時候,
文字框的寬度 就不夠了 會產生切字的問題 !
textCaseUILimitLess 是測試多少個字 是可以顯示不會被切字的最上限
這兩個對我來說 就是 文字框 顯示的 邊界測試 !
這樣就算將 UI 的一些 可視 手動操作的 等等的部分都和 unit test 串起來了 !
最後 是將兩個測試 串起來 !
並且透過 sharedEvents 將相關的東西傳遞出去 讓 air 程式出報表
就可以整合進 JenKins 了

沒有留言 :
張貼留言