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 了

[AS] 我自己的 unit test 的類別修正

為了要和 JenKins 整合!

也為了在測試中寫上 setTimeout 去等待一些動畫 或是 操作的部分

所以我必須修改我的 unit test 類別!

修改內容如下

1. unit test 的 test case 啟動不是自動啟動, 而是必須手動呼叫

2. 斷言 會丟出測試結束事件. ( 一個 test case 只能有一個斷言 )

3. 多一個取的 不是 測試成功的個數的API

4. 全部 test case 測試完畢, 會丟出結束事件.

改動的東西 都不是 test case class 中需要動到程式碼的

但是卻是 外部啟動函式  要作一些修改

也是為了 JenKins 可以控制,

畢竟整合 自動編譯 測試 通知 才是我自己的主要目的!

能不能 簡單的相容於  flex unit 是次要的選項!

另外一點就是 flex 貌似無法使用 setTimeout 作一些流程的控管!

所以我才決定作出對我的 BasicUnitTestCase 作大幅度的修正!

不然 很多部分 我只要將 air 的那之出報表的程式作修正即可 !

//
補上我的 基本類別
https://github.com/tenchiwang/MyLibs/blob/master/src/com/tenchiwang/unitTest/BasicUnitTestCase.as


[AS] JenKins 整合我自己的 unit test 類別

本來以為在 FB 中的 ANT 可以正常運行 正常結束 就好了

如圖 :

結果在 JenKins 中確無法有效停止!

所以選擇用 ADL
首先遇到的問題是
原因是 adl 的版本和編譯的版本不同!

像我的 adl 是 3.1
但是我 IDE 產生的確是

所以會有問題 !

只要更新 adl  的版本 或是 修改 app.xml 就可以解決!

同 fdb 我也怕會有跑不停的問題!

所以我也加了 離開的函式!

那就只要讓 這個 air 程式去讀取編譯出來的 swf 然後接收

是否有錯, 有錯就寫報告 沒錯就不寫報告!

當然在 IDE 介面下都是沒有問題的!

但是在 JenKins 的環境下跑 確是會出事!

問題是出在匿名使用者


最後調整 將檔案存在 使用者目錄 (File.userDirectory)

如果有錯誤才輸出檔案 沒錯誤就不輸出檔案!

成功的情況如下
失敗情況如下




將我的 unit test 整合到 JenKins 上 並且自動發信的部分

已經全部結束 !!

其中我遇到的問題大部分都在上面陳述了

下面是我查詢的資料
ADL
http://labs.mstudio.com/?p=226
http://stackoverflow.com/questions/15428278/adl-error-while-loading-initial-content-adobe-air

如果想一勞永逸解決問題 就去更新ADL 相關的更新如下
http://helpx.adobe.com/x-productkb/multi/how-overlay-air-sdk-flex-sdk.html
http://helpx.adobe.com/flash-builder/kb/overlay-air-sdk-flash-builder.htmlhttp://helpx.adobe.com/flash-builder/kb/overlay-air-sdk-flash-builder.html

ANT 判斷
http://ant.apache.org/manual/index.html
http://www.ogshoppingmall.com/list.asp?id=49546
http://ant.apache.org/manual/Tasks/fail.html

as 相關資料
http://help.adobe.com/zh_TW/FlashPlatform/reference/actionscript/3/flash/filesystem/File.html
http://help.adobe.com/zh_TW/air/build/WS5b3ccc516d4fbf351e63e3d118666ade46-7fd9.html
http://help.adobe.com/zh_TW/air/build/WS5b3ccc516d4fbf351e63e3d118666ade46-7fd7.html