2014年5月5日 星期一

[AS][推廣文] 含 UI 的 Unit Test


偷偷的推廣一下 單元測試 ( 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 了

沒有留言 :