一、軟體安裝
首先通過appstore下載安裝Xcode開發工具,當前編寫文檔時最新版本為4.5.1
二、通過Xcode工具編寫運行測試指令碼
說明:如果是在IOS模擬器上運行測試案例,需要有被測試應用的原始碼才有許可權把應用安裝到模擬器中,當前樣本中使用了自己編寫的一個簡單Iphone應用,大家也可以直接在網上搜尋一個開源的應用即可。
1、當你有了一個應用的原始碼之後,在Xcode工具中,首先選中被測應用,然後點擊功能表列中的“Product-Profile”,則會彈出Instruments工具,在彈出的工具中選擇IOS Simulator-》Automation,然後點擊Profile
2、在彈出的Automation工具中選擇需要測試的項目,同時在Add-》Create 添加測試指令碼,點擊Create後,在中間地區會出現編寫測試指令碼的地區,在中間添加以下指令碼
//擷取當前window對象
var target = UIATarget.localTarget();
var app = target.frontMostApp();
var window = app.mainWindow();
//列印除當前介面的控制項數資訊
target.logElementTree();
具體的API參考官方文檔
http://developer.apple.com/library/ios/#documentation/DeveloperTools/Reference/UIAutomationRef/_index.html
3、點擊左上方的Record按鈕則開始運行測試案例,運行完成後在工具的中間位置,原來編寫代碼的地方會出現運行結果的log日誌,我們在剛才的代碼中編寫了target.logElementTree(),這句API會列印出當前頁面的控制項資訊,可以在日誌中看到樹形結構的控制項,點擊可以查看控制項的一些屬性,這個API在編寫代碼的過程中也會比較有用。
另外如果想切換到編寫代碼的頁面,可以點擊圖中紅框處的進行切換。
注意:通過點擊Record來運行測試案例時,代碼執行完成後不會自動停止,所以需要手工的點擊一下左上方的Stop按鈕來停止運行。
4、錄製回放功能
如果你是第一次編寫自動化的測試指令碼,可能很多API都不知道,這時候你可以先使用一下UIAutomation的錄製回訪功能,參考一下大概是怎麼來編寫測試案例的,當然你也會發現通過錄製回訪會有很多重複的代碼,當你熟悉之後就可以不用錄製回訪來編寫指令碼了。
首先你切換到編寫指令碼的介面,這時候會看到中間的下方會有一個紅色按鈕,你點擊一下就開始錄製了,這時候會自動幫你在模擬器中啟動起來被測應用,然後你在模擬器上繼續點擊操作的步驟都會被記錄下來。
中間紅色地區就是自動產生的程式碼,你可以點擊代碼中的箭頭能看到不同的API,因為尋找到一個元素可以使用不同的路徑,對你屬性瞭解API會有些協助。
錄製完成後點擊紅色按鈕旁邊的方塊形停止按鈕,錄製就停止了,
想要啟動並執行話還是點擊左上方的Record按鈕就再次運行錄製結果了。
三、編寫測試案例進階篇
通過上面你應該瞭解了大概怎麼來使用UIAutomation工具以及編寫簡單的測試指令碼,當時編寫的也不算是一個測試案例,最起碼的斷言操作都沒有,那麼這一篇我們來將一下如何來編寫一個真正的測試案例。
1、元素識別
如果要編寫測試案例,我們首先想到要操作的控制項元素應該如何去識別找到它呢,第二節我們簡單說了一下通過指令碼輸出控制項Log是一種方式可以識別到控制項,還有另外一種方式是使用裝置內建的Accessibility Inspector功能
在模擬器上,你還可以啟用Accessibility 的檢測器。啟動模擬器,找到“Settings > General > Accessibility > Accessibility Inspector”,然後將它設為“開啟”狀態。
此時在模擬器上會出現一個覆層,你進入需要測試的應用,滑鼠點擊相應的控制項,如所示會看到一些資訊,Label就是這個控制項的id屬性,Traits就是這個控制項的類型,Frame就是這個控制項的位置以及大小{{36,295},{43,21}},其中第一個位置{36,295}是該控制項的左上方的座標,{43,21}則是這個控制項的寬度和高度,通過這兩個參數可以算出控制項的具體座標位置。
2、編寫測試用例
var testName = "FirstTest";
UIALogger.logStart(testName);
var target = UIATarget.localTarget();
var app = target.frontMostApp();
var window = app.mainWindow();
app.logElementTree();
window.tableViews()[0].cells()[0].tap();
target.delay(3);
var date = window.elements()["date"];
UIALogger.logMessage( date );
if (date){
UIALogger.logPass( testName );
}
else{
UIALogger.logFail( testName );
}
上面是使用了UIAutomation內建的一些API完成了一個自動化的測試用例的編寫,包括了元素尋找以及斷言操作,但是如果你編寫多個測試案例的話會發現一些問題,比如一些代碼會有重複,用例組織不是很好,斷言操作不方便。
3、tuneup介紹
下面為大家介紹一個開源的基於UIAutomation擴充的JS庫tuneup,這個js擴充庫是方便大家來編寫測試案例。
Tuneup開源地址 https://github.com/alexvollmer/tuneup_js
如何來使用,首先你可以在電腦上建立一個測試案例目錄,比如檔案夾名稱就叫Demo,下面可以建立一個lib子檔案夾,存放需要用到的一個擴充庫,你下載的tuneup目錄內容可以都放到lib目錄下,在demo檔案夾下建立一個測試案例的js檔案,測試代碼中只需要把tuneup使用import引用進來就可以使用了,通過tuneup編寫的測試案例如下。
#import "lib/tuneup/tuneup.js"
var target = UIATarget.localTarget();
var app = target.frontMostApp();
/* Second是測試案例的注釋,可以填寫用例的用途,以及編寫人等資訊 */
test("Second", function(target, app) {
var window = app.mainWindow();
app.logElementTree();
window.tableViews()[0].cells()[0].tap();
var date = window.elements()["date"];
assertNotNull(date,"進入日期詳情頁面,date屬性沒找到!"); });
四、通過命令列運行測試案例
為了能夠實現自動定時運行測試指令碼,編寫完成的測試案例我們希望是能夠通過命令列的方式來啟動啟動並執行,那麼下面我們介紹一下如何通過命令列來啟動運行我們編寫好的測試案例。
instruments -t /Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/ AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate "/Users/ios/Library /Application Support/iPhone Simulator/6.0/Applications/D02EF837-94F7-457A-989A-A654FC034803 / DemoSBTableViewTest.app" -e UIASCRIPT /AutoTest/workspace/IosDemo/test.js -e UIARESULTSPATH /AutoTest/workspace/IosDemo/lib/
上面是通過命令列來運行測試案例的指令碼,
-t 後面的參數為Automation.tracetemplate的路徑,不用修改,Xcode4.5以後的版本路徑都是這個,如果是Xcode4.5以前的路徑會不一樣
“/User***.app” 這個參數為被測程式的絕對路徑,模擬器中安裝的應用都可以在本地硬碟中找到
-e UIASCRIPT 指定執行的js指令碼
-e UIARESULTSPATH 指定輸出結果存放的路徑
五、後續基於UIAutomation擴充需要的改進點
1、輸出的用例運行結果存在給定的xml檔案中, 後續需要解析xml檔案,解析成testng的格式,方便後續和Jenkins等持續整合平台整合
2、尋找定位元素,只能按照控制項層級,一級一級往下找,使用起來有些不方便,需要再次封裝一下
3、需要加入外圍的一些控制,使整個自動化測試回合完全自動化,另外還需要加入一些失敗重跑機制,UI的自動化一般都會存在一些不穩定的因素