自動化測試是非常有用的測試你的應用程序“睡覺”。它可以使你快速軌道回歸和性能問題,並開發新的功能而不打破你的應用令人擔憂。
由於iOS 4,蘋果發布了一個叫做uiautomation框架,可用於在真正的設備和在iPhone模擬器執行自動化測試。在uiautomation文件很小,沒有在網絡上有很多資源。本教程將告訴你如何將你的工作流程uiautomation。
最好的開始的指針是蘋果文檔uiautomation一個很好的快速教程,蘋果設備的文件而且,當然,幻燈片/視頻vcenter%2Fdownload.action%3Fpath%3D%2Fwwdc_2010%2Fwwdc_2010_video_assets__pdfs%2F306__automating_user_interface_testing_with_instruments.pdf&from=en&to=zh&token=&monLang=zh" target="_blank">2010屆WWDC 306?自動化用戶界面測試儀器。你需要一個免費的開發者帳戶訪問該資源。
另一個要提到的是OCUnit框架,其中包括在Xcode,可以用來添加單元測試你的應用程序。
你的第一uiautomation腳本 使用iOS模擬器使用iOS設備 處理uiaelement和可達性 uiaelement層次模擬用戶交互 提示來簡化你的生活uiautomation功能測試是用JavaScript寫的。uiautomation和可達性之間有著密切的關聯,所以你將使用的輔助標簽和數值模擬和檢查模擬界面相互作用的結果。
走吧,寫我們的第一個測試!
在腳本編輯窗口,點擊下面的代碼
VaR目標= uiatarget。localtarget();
VaR應用為目標。frontmostapp();
VAR窗口=程序。mainwindow();
;
重新啟動腳本?R(你不需要保存)。腳本運行,你可以阻止它在日志中出現。
就是這樣à!你寫你的第一uiautomation試驗!
你也可以用一個真實的設備進行測試,而不是模擬器。自動化測試僅在支持多任務的設備:iPhone 3GS,iPad運行iOS > 4。uiautomation是不可用的iPhone 3G,不管是操作系統版本。
在設備上運行測試:
你的iPhone連接到USB選擇方案>的iOS設備的自動測試檢查發布配置與開發者配置文件關聯(而不是一個特設的分布)。默認情況下,分析了在釋放(沒有理由簡介一個應用程序在調試!)簡介應用程序(?我)按照相同的步驟比以前的模擬器。可達性和uiautomation有很大的關系:如果一個控制可訪問性,你將能夠獲取/設置值上,產生的作用等控制,不是“可見”可不可以通過自動化。
你可以允許訪問/自動化控制是否使用界面生成器,或通過設置的屬性以編程方式isaccessibilityelement
。你要注意當設置訪問容器視圖(即一個視圖包含其它UIKit元素)。使訪問整個視圖可以“隱藏”從它的子視圖的訪問/自動化。例如,在項目中,控制器的視圖出口不可,否則子控件不可。如果你有任何問題,logelementtree
你的朋友:把當前所有可見的元素可以訪問。
每個UIKit控件可以訪問可以通過JavaScript對象表示,uiaelement。uiaelement有幾種特性,姓名
,價值
,元素
,父母
。你的主窗口包含了很多控件,它定義了一個框架體系。這uiaelement UIKit層次,對應一個層次。例如,通過調用logelementtree
在之前的測試中,我們有以下的樹:
矩形:{ { 20179 },{ 280,31 } }
| | | + uiastatictext:名稱:正文:價值:正文:矩形:{ { 20231 },{ 112,21 } }
| | | + uiastatictext:價值:矩形:{ { 145231 },{ } }
155,21 | | | + uiatabbar:矩形:{ { 0431 },{ 320,49 } }
| | | | + uiaimage:矩形:{ { 0431 },{ 320,49 } }
| | | | + uiabutton:名稱:第一價值:1矩形:{ { 2432 },{ 156,48 } }
| | | | + uiabutton:名稱:二矩形:{ { 162432 },{ 156,48 } }
訪問文本字段,你就可以寫:
VaR TextField = uiatarget。localtarget()。frontmostapp()。mainwindow() textfields() [ 0 ];
你可以選擇一個0或元素名稱索引訪問元素。例如,以前的文本字段可以也可以這樣:
VaR TextField = uiatarget。localtarget()。frontmostapp()。mainwindow()。textfields() [用戶文本”];
後來的版本更清晰,應首選。你可以設置一個uiaelement名字無論在界面生成器:
或programmaticaly:
mytextfield.accessibilityenabled =是的;
mytextfield.accessibilitylabel =“”用戶文本;
你可以看到現在的可訪問性特性所使用的uiautomation針對不同的控件。這是非常聰明的,因為1)只有一個框架的學習;2)寫出你的自動化測試,你也要確保你的應用程序是可訪問的!所以,每個uiaelement可以通過調用以下函數訪問它的孩子:buttons()
,images()
,scrollviews()
,textfields()
,webviews()
,segmentedcontrols()
,sliders()
,statictexts()
,switches()
,tabbar()
,tableviews()
,textviews()
,toolbar()
,toolbars()
等在標簽欄的第一個選項卡訪問,你可以寫:
VaR TabBar = uiatarget。localtarget()。frontmostapp()。tabbar();
VAR TabButton = TabBar buttons() [“第一”;
的uiaelement層次是非常重要的,你要不斷地處理它。記住,你可以把層次在你每次調用腳本logelementtree
在uiaapplication:
uiatarget。localtarget()。frontmostapp()。logelementtree();
在模擬器中,你也可以啟動輔助檢查。啟動模擬器,去“設置>一般>輔助功能>可督察並將其設置為'對'。
這個小彩虹盒子是可達性檢查。坍塌時,輔助功能是關閉的,當擴展的訪問是。激活/ desactivate通達,你只需要點擊箭頭按鈕。現在,去我們的測試應用程序,啟動它,並激活督察。
然後,點擊文本字段檢查姓名
和價值
相關的uiaelement性能(和NSObjectaccessibilitylabel
和accessibilityvalue
屬性)。檢驗員將幫助您調試和編寫腳本。
讓我們再進一步,模擬用戶交互。點擊一個按鈕,你只需調用tap()
這個元素:
VaR TabBar = uiatarget。localtarget()。frontmostapp()。tabbar();
VAR TabButton = TabBar。buttons() [第一];
/水龍頭! Import’ and select TestAutomation/TestUI/Test-1.js">點擊“添加”,選擇>導入自動化測試/ testui / test-1.js
點擊記錄(?R)看什麼會發生…
腳本:
=“第一”){
TabBar。buttons() [第一]。tap();
}
/ / --點擊文本文件
uialogger。logMessage(“點擊文本字段”);
VaR recipename長名稱=“特別配方”;
窗口。textfields() [ 0 ]。setValue(recipename);
目標。延遲(2);
/ / --點擊文本文件
uialogger。logMessage(“把鍵盤”);
APP。logelementtree();
APP。keyboard()。buttons() [“回報”]。tap();
VaR textvalue =窗口。statictexts() [“recipename”]。value();
如果(textvalue = = = recipename){
uialogger。logpass(testname);
這個腳本啟動的應用程序,如果不選擇選擇第一個選項卡,設置文本字段的值為“一方”特別長的名字和解散的鍵盤。新的功能的通知:延遲(數的時間間隔)
在uiatarget允許你將一些延遲之間的相互作用,logMessage(字符串)
在uialogger可用於測試輸出日志logpass(字符串)
在uialogger表明你的腳本已成功完成。
你還可以看到如何訪問不同的鍵盤上的按鈕,點擊它應用程序。keyboard()。buttons() [“回歸”tap() ];
現在,你已經基本知道你可以寫一些測試。你會發現很快在你的測試中有大量的冗余和膠水代碼,你通常會重寫代碼一樣:
VaR目標= uiatarget。localtarget();
VaR應用為目標。frontmostapp();
VaR應用程序窗口=;
這就是為什麼我們要使用一個小的JavaScript庫,簡化了寫作uiautomation試驗。去https://github.com/alexvollmer/tuneup_js,讓圖書館和復制調整文件夾一邊測試文件夾。現在,我們可以通過調整重寫test1.js
=“第一”){
TabBar。buttons() [第一]。tap();
}
/ / --點擊文本文件
uialogger。logMessage(“點擊文本字段”);
VAR異常長的名字,recipename =“食譜”;
textfields() [窗口。0 ]。setValue(recipename);
目標。延遲(2);
/ / --點擊文本文件
uialogger。logMessage(“把鍵盤”);
APP。logelementtree();
APP。keyboard()。buttons() [“回報”]。tap();
VaR textvalue =窗口“recipename。statictexts() [”];
調整避免你寫同樣的樣板代碼,加給你一些額外的喜歡各種說法:asserttrue(表達信息)
,assertmatch(正則表達式,表達式,消息)
,assertEquals(預期,收到的消息)
,assertfalse(表達信息)
,assertnull(東西、消息)
,assertnotnull(東西、消息)
…你可以延長圖書館很容易:例如,你可以添加一個logdevice
在uiautomation-ext.js添加此功能uiatarget對象的方法:
擴展(uiatarget.prototype,{
logdevice:function() {
uialogger。logMessage(“轉儲設備:”);
uialogger。logMessage(”模式:“+ uiatarget。localtarget()。model());
uialogger。logMessage(“矩形:“+ JSON。stringify(uiatarget。localtarget()。rect()));
uialogger。logMessage(“名稱:”+ uiatarget。localtarget()。());
uialogger。logMessage(”系統:“+ uiatarget。localtarget()。systemname());
uialogger。logMessage(“systemversion:“+ uiatarget。localtarget()。systemversion());
;
然後,調用logdevice()目標。
你應該看到:
自卸裝置:
模型:iPhone模擬器
矩形:{“緣起”:{“X”:0、“Y”:0 },“大小”:{“寬度”:320,“高度”:480 } }
名稱:iPhone
你還可以看到如何從另一個腳本參考,以#進口
指令。因此,創造倍數測試和鏈接都可以通過導入在一個單一的文件進行調用:
#進口“test1 .js”
#進口“test2。JS”
#進口”4. JS”
#進口“考試4. JS”
#進口”測試JS”
如果你想使你的腳本,你可以從命令行啟動。事實上,我推薦使用這個選項,而不是使用工具的圖形用戶界面。儀器的用戶界面是緩慢的,和測試保持運行,即使你已經達到了他們的結束。在命令行啟動uiautomation測試是很快的,你的腳本將在測試結束時停止。
這取決於你的Xcode版本,命令行是稍微不同的。
在任何版本,推出一個腳本,你將需要你的UDID。
在Xcode >=4.3<4.5,在一個終端類型:
儀表
W your_ios_udid \
T”/應用/ Xcode。APP /內容/開發者/平台/ iPhoneOS。平台/開發商/圖書館/工具/插件/ automationinstrument。束/內容/資源/自動化。tracetemplate”
name_of_your_app \
E uiascript absolute_path_to_the_test_file
在Xcode > = 4.5,在終端類型:
儀表
W your_ios_udid \
T”/應用/應用/內容/應用Xcode。/儀器。應用/內容/插件/ automationinstrument。束/內容/資源/自動化。tracetemplate”
name_of_your_app \
E uiascript absolute_path_to_the_test_file
例如,在我的情況下(Xcode 4.3),線看起來像:
儀器a2de620d4fc33e91f1f2f8a8cb0841d2xxxxxxxx W T /應用/ xcode.app/contents/developer/platforms/iphoneos.platform/developer/library/instruments/plugins/automationinstrument.bundle/contents/resources/automation.tracetemplate自動化測試- E uiascript /用戶/ JC /文件/ dev /自動化測試/自動化測試/ testui / test-2.js
如果你正在使用一個版本的Xcode下到4.3,你將需要的類型:
儀表
W your_ios_device_udid \
T”/開發商/平台/ iPhoneOS。平台/開發商/圖書館/工具/插件/ automationinstrument。束/內容/資源/自動化。tracetemplate”
自動化測試\
E uiascript /用戶/ JC /文件/ dev /自動化測試/自動化測試/ testui / test-2.js
你會注意到Xcode的不同版本之間的唯一區別是就位automation.tracetemplate
。任何東西之前,要確保automation.tracetemplate
在你提供的路徑存在。再次,調整將使你的生活簡單,有一個腳本熱身/ test_runner /運行
會照顧識別和正確運行該命令行。
命令行的工作也與模擬器。你需要知道在模擬文件系統應用程序的絕對路徑。該模擬器的模擬在下列文件夾中的設備文件系統~ /圖書館/技術支持/ iPhone模擬器/ 5.1/
。在這個目錄下,你會發現包含為每個安裝在模擬器的應用程序沙盒應用程序目錄。只是確定在模擬器上測試自動化程序型知識庫:
儀器/應用/ xcode.app/contents/developer/platforms/iphoneos.platform/developer/library/instruments/plugins/automationinstrument.bundle/contents/resources/automation.tracetemplate”/用戶/ JC /圖書館/技術支持/ iPhone模擬器/ 5.1 /應用/ c28ddc1b-810e-43bd-a0e7-c16a680d8e15 /自動化測試,應用“E uiascript /用戶/ JC /文件/ dev /自動化測試/自動化測試/ testui / test-2.js
你也可以給一個應用程序,在砂箱模擬器:例如,讓我們說你有一個詹金斯服務器應用程序自動建立。您當前的建設將在類似的定位/用戶/ JC /詹金斯/工作/自動化測試/工作區/自動化測試/建設/ testautomation.app
。你能給/用戶/ JC /詹金斯/工作/自動化測試/工作區/自動化測試/建設/ testautomation.app
作為輸入儀器
和儀器
會做復制和模擬器沙盒安裝應用程序的必要。
一個小的抓,別忘了關掉設備密碼,否則你會看到這個痕跡:例外:設備遇到遠程鎖定:未能與束標識符的COM的發射過程。manbolo自動化測試”。
。是的,uiautomation還不知道你的密碼!
在命令行上的最後一句話。如果你不精確的輸出文件,日志會放在文件夾中,你輸入的命令。你可以使用E uiaresultspath results_path
將該腳本的輸出。你也可以使用l
期權給予暫停腳本:例如l 60000
將60年代終止當前腳本。
我沒有成功推出多個腳本與命令行。用整個晚上鏈和啟動你的腳本,所以你真的會測試你的應用程序“睡覺”。
而不是打字腳本,您可以記錄的相互作用直接在設備或模擬器,在重放。做這個:
發射儀器(?我)創建一個新的腳本選擇腳本編輯器在腳本編輯器的底部,看到了那個紅色的按鈕嗎?按下它!現在,你可以發揮你的程序;你會看到拍攝的相互作用出現在腳本窗口(甚至旋轉事件)。按下方形按鈕停止錄音。在寫你的劇本,你會玩的時間,動畫等。uiautomation具有多種功能得到元素,即使他們沒有顯示但最好的建議就是等待從這個額外的演示:
當事情不順利時,添加uiatarget延遲(1);!
在自動化測試報警處理一直是困難的:你寫你的腳本,啟動您的測試套件,臨睡前,和,在早上,你會發現你所有的測試已經毀了因為你已經收到意想不到的短信,阻斷試驗。嗯,uiautomation幫你處理。
通過在你的腳本中添加此代碼,
;
return false;//使用默認處理程序
和返回false,你問uiautomation自動解聘UIAlertView,所以警報不會干擾你的測試。你的腳本將運行如果沒有任何警報。但警報可以應用程序部分和測試流程,在某些情況下,你不想自動把它。這樣做,你可以對警報的職稱考試,點擊一些按鈕,返回true。返回真,你表明uiautomation這警報應作為測試的一部分,處理一致。
例如,如果你想測試的添加一些“警報視圖包上的“添加”按鈕,你可以寫:
;
如果(標題= =“增添”){
警報。buttons() [“添加”]。tap();
返回true;/ /旁路默認處理程序
}
return false;//使用默認處理程序
方便寶寶!
測試你的應用程序的多任務也很簡單:讓我們說你想測試那個瘋狂的背景過程你發射每次應用程序恢復從背景和進入-(void)applicationwillenterforeground:(UIApplication *)中的應用
選擇器,你可以在後台發送程序,等待10秒,並恢復它通過調用:
uiatarget。localtarget() deactivateappforduration(10);
deactivateappforduration(持續時間)
將暫停腳本,模擬用戶點擊主頁按鈕,(在後台發送應用程序),等待,恢復應用程序和測試腳本對你的簡歷,在一行代碼!。
你可以模擬你的iPhone的旋轉。再次,非常簡單和容易的:
VaR目標= uiatarget。localtarget();
VaR應用為目標。frontmostapp();
/集景觀左
目標。setdeviceorientation(uia_device_orientation_landscapeleft);
uialogger。logMessage(“目前的定位是“+應用程序。interfaceorientation());
/肖像
目標。setdeviceorientation(uia_device_orientation_portrait);
uialogger logMessage(。“目前的定位;
你可以很容易地把你的應用程序的當前狀態截圖。它可以針對一些有用的參考圖像。
VaR目標= uiatarget。localtarget();
目標。capturescreenwithname(“screenshot1。png”;
該截圖的位置將由路徑你增加選項推斷E uiaresultspath results_path
最後,您可以啟動任何腳本(不僅JavaScript
這是在你的本地主機)。結合采取截圖的能力,你可以想象強大的自動測試。你可以使用performtaskwithpathargumentstimeout(路徑參數,超時)
與路徑
包含腳本的完整路徑,args
參數數組傳遞給你的腳本,和超時
一個…超時!
VaR目標= uiatarget。localtarget();
VAR主機=目標。host();
VaR結果=主機。performtaskwithpathargumentstimeout(“/usr/bin/vi回聲”,[“Hello World”];